我们有一个整个使用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
设置,但看起来却没有。{有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
在构建Aws客户端时指定显式凭据将覆盖Aws.config设置。还有别的东西出了问题。
我怀疑AWS_DYNAMO_KEY / AWS_DYNAMO_SECRET env变量在您的环境中解析为nil。如果在构造客户端时传入access_key_id:nil,则SDK会将其视为您未提供参数并回退到凭据提供程序链以查找凭据。仔细检查您获得的值是否符合您的预期。
您与该IAM用户关联的IAM策略也可能存在问题。如果环境变量具有正确的值,请发布您的编辑IAM策略,以便我们对其进行审核。