【发布时间】: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