是的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)
}
希望幫助別人節省一些毛囊:)
正確 - 臨時憑證(例如,如EC2提供元數據)不能用於創建其他臨時憑證。您將需要使用與用戶關聯的「永久」憑證。 –
不正確,請參閱下面的答案。您可以使用臨時實例憑據對角色進行身份驗證,然後該角色爲您分配一個可用於訪問該服務的臨時集。 – Graeme
對不起,你的確是對的!該文件說:「您不能通過使用AWS根帳戶憑據調用AssumeRole;訪問被拒絕。您必須使用IAM用戶的憑證或** IAM角色**來調用AssumeRole。」感謝您展示聰明的方法! –