2016-11-15 164 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策略,以便我們可以查看它。