Я хочу развернуть свой код в экземпляре EC2, но не хочу запекать в ключах и секретах AWS. AWS Предоставляет сервис IAM, позволяющий мне назначить роль для моих экземпляров EC2, которая позволит этим экземплярам получать доступ с использованием временных ключей.
Как мне заставить это работать? Я пытался использовать SDK и StsClient для предположения Роль, но это выдает ошибку
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 будут использоваться?
Да, вызов 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, и ваш вызов 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)
}
Надеюсь, это поможет кому-то еще спасти несколько волосяных фолликулов 🙂
Других решений пока нет …