Да, вызов STS, чтобы взять на себя роль, требует учетных данных для работы, однако он использует учетные данные, предоставленные при его создании, если они опущены, он не возвращается к учетным данным на основе экземпляров.
Чтобы использовать учетные данные, основанный экземпляр, чтобы сделать вызов вам нужно использовать что-то вроде:
$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, и ваш вызов AssumRole должен успешно вернуться. Мой тестовый код для этого:
$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
Извините, вы действительно правы! В документации говорится: «Вы не можете позвонить в AssumeRole с помощью учетных данных учетной записи root AWS, доступ запрещен. Вы должны использовать учетные данные для пользователя IAM или ** роль IAM ** для вызова AssumeRole». Спасибо, что показал умный метод! –