2016-11-15 171 views
1

我们有一个全程使用Amazon S3的Web应用程序,为了便于维护,我们使用相应的存储桶权限等设置了不同的IAM用户。我们为此设置了凭据用户在为这样我们的Ruby /西纳特拉应用程序的初始化部分:覆盖AWS-SDK中的默认凭证

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

这个伟大的工程,因为我们可以实例S3通过我们的代码对象都无需重新指定每次凭据。

问题是,我们现在为我们网站的一个子部分添加了一个小例程,该子部分需要使用Amazon DynamoDB进行两次调用。我们已经成立了一个独立的IAM与权限DynamoDB表,我们正在创建的程序中的对象作为这样的:

# 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

指定明确凭据,同时构建一个AWS客户端将覆盖Aws.config设置。其他事情出错了。

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

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