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 凭证的主要内容,如果未能解决你的问题,请参考以下文章