Rails:如何使用容器从 ECS 重用 AWS 凭证

Posted

技术标签:

【中文标题】Rails:如何使用容器从 ECS 重用 AWS 凭证【英文标题】:Rails: How to reuse AWS credentials from ECS using containers 【发布时间】:2021-11-24 08:07:31 【问题描述】:

我们已经在 AWS 上部署了 Rails 应用程序(使用容器内的 docker 映像)并使用 S3 和 SES 服务上传文件和发送电子邮件。我们需要 AWS access_key_id、secret_access_key 和 session_token 来与 AWS S3 和 SES 通信。我们使用 Aws::ECSCredentials 服务来获取持续 6 小时的 AWS 凭证。

5.55 小时后,我们再次使用 Aws::ECSCredentials.new() API 调用获取凭据。 我们使用 CarrierWave 将文件上传到 AWS S3 并使用 CarrierWave 初始化程序如下设置凭证,这仅在凭证未过期前 6 小时有效。

CarrierWave.configure do |config|
  config.fog_credentials = 
    provider: "AWS",
    aws_access_key_id: Settings.amazon.access_key_id,
    aws_secret_access_key: Settings.amazon.secret_access_key,
    region: Settings.amazon.region,
  

  config.storage = :fog
  config.fog_directory  = Settings.amazon.attachments_bucket
  config.fog_public     = false
end

一旦首次设置的凭据过期,我们会再次调用 Aws::ECSCredentials.new() 以获取新凭据。要使用新凭据, 我们必须在 ImageUploader(继承自 CarrierWave)中重新初始化 CarrierWave,如下所示。

class AvatarUploader < CarrierWave::Uploader::Base
  storage :fog


  **def initialize(*)
    super
    self.fog_credentials = 
      :provider               => 'AWS',              # required
      :aws_access_key_id      => 'YOURAWSKEYID',     # required
      :aws_secret_access_key  => 'YOURAWSSECRET',    # required
    
    self.fog_directory = "YOURBUCKET"
  end
end

这种方法可以每次都重新初始化 CarrierWave 吗? 我担心这可能会通过创建垃圾对象来创建 Ruby 内存问题。有人可以帮忙吗?有没有更好的处理方法?

【问题讨论】:

通过重新初始化,您的意思是您正在通过调用上面的 sn-p 重新定义类?给我更多的背景信息,我可能会给你一个有趣的建议。 你可能不喜欢这个答案。您是否正在使用可以访问 S3 和 SES 的 IAM 角色?任何语言的 AWS sdks 都会在令牌过期时即时处理刷新令牌。您的 ECS 任务定义应指定 IAM 角色,并且 SDK 在启动时会在多个位置找到凭证链。对于 ECS,它是实例元配置文件。 s3 = Aws::S3::Client.new resp = s3.list_buckets 然后工作完成。 【参考方案1】:

贵公司是否使用 AWS Single Sign-On (AWS SSO)?如果没有,我建议这样做。通过这种方式,您可以将 AWS CLI 配置为安全地使用这些 IAM 角色,以使用刷新令牌进行所需时间段的会话。您可以在official docs找到更多详细信息

【讨论】:

以上是关于Rails:如何使用容器从 ECS 重用 AWS 凭证的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AWS ECS 启用 tty 并运行交互式控制台?

如何在 AWS ECS 中扩展任务/容器

ECS 任务。如何在容器中使用 AWS CLI

如何从 ECS 任务中安装 aws cli?

从AWS ECS单独帐户中的私有注册表中提取容器

如何链接在 AWS ECS 任务中运行的 2 个容器