4

我用 STS 设置了 kubernetes,它适用于 sdk 的 sqs、sns 等。我需要使用 STS auth 和fog-aws gem 来下载/列出文件,我可以使用 ruby​​ aws-sdk-s3 来完成,但我使用carrierwave gem 所以我想用fog-aws来解决这个问题。

使用 sdk - 工作

s3 = Aws::S3::Client.new
resp = s3.list_objects(bucket:'sts-s3-test')
<Lists objects successfully>

使用fog-aws - 失败

s3 = Fog::Storage.new(provider: 'AWS', region: 'us-west-2',use_iam_profile: true)
directory = s3.directories.get('sts-s3-test')

Excon::Error::Forbidden (Expected(200) <=> Actual(403 Forbidden)) 
<Error><Code>AccessDenied</Code>

感谢任何指针,谢谢。

编辑:

STS 由我们在 kuberenets 中的 DevOps 使用服务帐户https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/配置。我不知道内部结构及其工作原理,但是通过此设置,新的 aws sdk 可以读取帐户详细信息并自动承担角色,无需显式调用承担角色功能。我们可以从我的第一个示例中看到这一点,该示例列出了我不传递任何凭据的 s3 对象。链接到使用来自 pod 的服务帐户的 aws sdk 新版本。 https://aws.amazon.com/blogs/opensource/introducing-fine-grained-iam-roles-service-accounts/

我已经尝试过获取临时访问密钥和秘密并将其传递给存储类的方法,但这也不起作用。我们的 DevOps 人员说所有使用密钥和秘密的访问都被禁用,唯一的使用方法是使用假设角色和网络身份

我还发现了我认为可以解决我遇到的问题的要点,我还没有尝试过。参考链接https://gist.github.com/peterwells/39a5c31d934fa8eb0f2c

4

1 回答 1

0

根据 Fog 文档进行设置

由于您的最顶层代码示例没有显示您将凭据传递给 aws sdk 客户端,因此如果您遵循 aws-sdk-ruby gem 的文档,那么您的凭据可能位于环境变量中(大概AWS_ACCESS_KEY_ID并且AWS_SECRET_ACCESS_KEY喜欢它显示在文档中)。

fog-aws 没有实现这些环境变量。他们有一种有点倒退的方式来设置配置。您需要做的是在您的.fog目录(不是您的项目目录)中创建一个文件,其中包含以下键及其各自的值:

default:
  aws_access_key_id:     <YOUR_ACCESS_KEY_ID>
  aws_secret_access_key: <YOUR_SECRET_ACCESS_KEY>

一旦你设置好了,希望你应该能够执行你的第二个片段:

s3 = Fog::Storage.new(provider: 'AWS', region: 'us-west-2',use_iam_profile: true)
directory = s3.directories.get('sts-s3-test')

基于您描述的环境的提示

上述方法可能不适合您,因为您在 kubernetes 环境中工作并且跟踪主目录中的配置文件可能不适合您。

如果是这种情况,那么您可以在对雾的调用中指定这些值:

s3 = Fog::Storage.new(
  provider: 'AWS',
  region: 'us-west-2',
  aws_access_key_id: 'xxxxx', # or directly from ENV['AWS_ACCESS_KEY_ID']
  aws_secret_access_key: 'xxxxx', # or directly from ENV['AWS_SECRET_ACCESS_KEY']
  use_iam_profile: true
)

注意:还报告了有关 Fog 和use_iam_profile选项的问题,因此也请检查一下。


使用 CarrierWave 实施

如果您要在 CarrierWave 的上下文之外调用 S3(例如,如果您需要在上传器或控制器中获取 S3 目录),上述方法很有帮助。如果您不需要您的代码了解该信息,则实际上不需要上述方法,因为在与 CarrierWave 集成时,最常见的方法是在 CarrierWave 的初始化程序中指定您的 AWS 凭证。

您需要创建一个carrierwave.rbin./config/initializers并指定您将提供雾的凭据:

# ./config/initializers/carrierwave.rb

## This sample snippet was taken from the carrierwave readme!

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider:              'AWS',                        # required
    aws_access_key_id:     'xxx',                        # required unless using use_iam_profile
    aws_secret_access_key: 'yyy',                        # required unless using use_iam_profile
    use_iam_profile:       true,                         # optional, defaults to false
    region:                'us-west-2',                  # optional, defaults to 'us-east-1'
  }
  config.fog_directory  = 'name_of_bucket'                                      # required
  config.fog_public     = false                                                 # optional, defaults to true
end

我没有将我的配置值硬编码到我的应用程序中,我使用 Rails 6 的凭据电缆(Rails 5 及更低版本的等效项是机密)。

我希望这对您有所帮助,或使您朝着正确的方向前进!我最近被 Fog 的配置设置绊倒了(特别是因为将它放在主目录中不起作用,因为它更多地用于我想要设置我的项目,这也是 kubernetes 上的 Rails 应用程序)。

于 2020-01-06T17:10:39.070 回答