2016-09-22 104 views
2

我想將我的代碼部署到EC2實例,但我不想在AWS Key和Secret中烘烤。 AWS提供IAM服務,允許我將角色分配給允許使用臨時密鑰訪問這些實例的EC2實例。AWS STS角色EC2假設角色

我如何得到這個工作?我已經使用SDK和StsClient到assumeRole嘗試,但此拋出了一個錯誤

User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/ROLE-NAME/INSTANCE No is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::XXXXXXXXXXXX:role/ROLE-NAME 

閱讀四周,似乎STS請求需要使用憑據本身進行角色分配?但我認爲將使用EC2實例密鑰?

+0

正確 - 臨時憑證(例如,如EC2提供元數據)不能用於創建其他臨時憑證。您將需要使用與用戶關聯的「永久」憑證。 –

+0

不正確,請參閱下面的答案。您可以使用臨時實例憑據對角色進行身份驗證,然後該角色爲您分配一個可用於訪問該服務的臨時集。 – Graeme

+0

對不起,你的確是對的!該文件說:「您不能通過使用AWS根帳戶憑據調用AssumeRole;訪問被拒絕。您必須使用IAM用戶的憑證或** IAM角色**來調用AssumeRole。」感謝您展示聰明的方法! –

回答

3

是的STS呼叫承擔角色DOES需要憑據才能工作,但它使用提供的憑據時,如果它們被省略它不會回落到基於實例的憑據。

要使用基於實例的憑據,使您需要使用類似呼叫:

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile(); 

這將提取相關角色的名稱,然後臨時實例憑據。如果您知道角色的名字,你可以在構造

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile(['profile' => 'role-name-here']); 

你也將需要更新的角色的信任關係,使實例承擔該角色指定。我認爲服務條目將做到這一點卻改變這種引用IAM角色似乎工作

{ 
    "Effect": "Allow", 
    "Principal": { 
    "AWS": "arn:aws:iam::XXXXXXXXXXXX:role/ROLE-NAME" 
    }, 
    "Action": "sts:AssumeRole" 
} 

(不要忘了加逗號上一節結束}結束)

現在將這些憑據傳遞給Sts客戶端的構造函數,並且您對AssumeRole的調用應該成功返回。爲此我的測試代碼:

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile(); 

$stsClient = new \Aws\Sts\StsClient(['region' => 'eu-west-1', 'version' => 'latest', 'credentials' => $credentials]); 

$ar = $stsClient->assumeRole(['RoleArn' => 'arn:aws:iam::XXXXXXXXXXXX:role/Ec2Role-queue', 'RoleSessionName' => 'test']); 

$creds = $stsClient->createCredentials($ar); 

var_dump($creds); 

,輸出:

object(Aws\Credentials\Credentials)#96 (4) { 
    ["key":"Aws\Credentials\Credentials":private]=> 
    string(20) "XXXXIYH36RJ5NZCDXXXX" 
    ["secret":"Aws\Credentials\Credentials":private]=> 
    string(40) "eXXXX+azLUNi9LjwyX4MkNI4rnEpFrG9pNNXXXXX" 
    ["token":"Aws\Credentials\Credentials":private]=> 
    string(308)  "FQoDYXdzEH4aDIa3Rx/onWIa4ArZeyLHAX+muL7zKt9trAQhMa98pkzpGGmOGa0N5UhCjX2GXQ3Dc2APElwlpCfr9F+J2k5igAeonadgrwAOC/OvEDv34i1JdmkaUjEE14S2hVGz2dXXXXegYra7kvx0cdoOjCPIFmXSZJeD1PR27lFyacH2x5+F1XKFugveiYCD63axATp4t8fq0K+EPjXXXX/wYKm5tJt7hYkCV7+tThLYFDPZ6NkXXXXjsSKkOw9u52yGJY4yD50y+liSprHH+/ZJyQppDIJcZbbpyBoojoeRvwU=" 
    ["expires":"Aws\Credentials\Credentials":private]=> 
    int(1474580894) 
} 

希望幫助別人節省一些毛囊:)