我们有一个始终使用Amazon S3的web应用程序,为了便于维护,我们设置了一个具有适当桶权限的不同IAM User等。我们在Ruby/Sinatra应用的初始化器部分预先设置了这个用户的凭据,如下所示:
# 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
设置,但似乎不是这样。有什么办法可以解决这个问题吗?
在构建Aws客户端时指定显式凭据将覆盖Aws。配置设置。还有别的地方出了问题。
我怀疑AWS_DYNAMO_KEY/AWS_DYNAMO_SECRET环境变量在您的环境中解析为nil。如果在构造客户端时传入access_key_id: nil, SDK将把它视为没有提供参数,并退回到凭据提供程序链中查找凭据。仔细检查你得到的值是否符合你的期望。
也有可能您与该IAM用户关联的IAM策略有问题。如果环境变量有正确的值,请发布您编辑的IAM策略,以便我们可以审查它。