覆盖AWS-SDK

时间:2016-11-15 01:26:33

标签: ruby amazon-web-services sinatra aws-sdk amazon-iam

我们有一个整个使用Amazon S3的网络应用程序,为了便于维护,我们设置了具有相应存储区权限等的独特IAM用户。我们在我们的初始化程序部分预设了此用户的凭据。因此Ruby / Sinatra app:

# MyS3UserIAM
Aws.config.update({
        :region => 'us-east-1',
        :credentials => Aws::Credentials.new(ENV['AWS_S3_KEY'],ENV['AWS_S3_SECRET'])
})

这非常有用,因为我们可以通过代码实例化S3对象,而无需每次都重新指定凭据。

问题是,我们现在在我们网站的一个小节中添加了一个小例程,它只需要使用Amazon DynamoDB进行两次调用。我们已经设置了一个具有DynamoDB表权限的单独IAM,我们正在例程中创建对象:

# MyDynamoUserIAM
mydynamodb = Aws::DynamoDB::Client.new(
  access_key_id: ENV['AWS_DYNAMO_KEY'],
  secret_access_key: ENV['AWS_DYNAMO_SECRET']
)

问题在于,当我们尝试使用 mydynamodb 进行任何查询时,我们会发现访问失败,说 MyS3UserIAM 对DynamoDB表没有任何权限。

(事实上,错误令人困惑,因为错误消息在错误字符串中显示 MyDynamoUserIAM ARN,但显示 MyS3UserIAM 作为IAM名称!)

我原以为在Aws::Object实例化期间指定凭据会覆盖Aws.config设置,但看起来却没有。{有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

在构建Aws客户端时指定显式凭据将覆盖Aws.config设置。还有别的东西出了问题。

我怀疑AWS_DYNAMO_KEY / AWS_DYNAMO_SECRET env变量在您的环境中解析为nil。如果在构造客户端时传入access_key_id:nil,则SDK会将其视为您未提供参数并回退到凭据提供程序链以查找凭据。仔细检查您获得的值是否符合您的预期。

您与该IAM用户关联的IAM策略也可能存在问题。如果环境变量具有正确的值,请发布您的编辑IAM策略,以便我们对其进行审核。