【问题标题】:Rails: How to reuse AWS credentials from ECS using containersRails:如何使用容器从 ECS 重用 AWS 凭证
【发布时间】: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 然后工作完成。

标签: ruby-on-rails ruby amazon-s3


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-11-02
    • 1970-01-01
    • 2017-09-04
    • 2019-04-24
    • 2020-09-30
    • 2022-10-20
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多