Роли AWS STS с EC2 AssumeRole

Я хочу развернуть свой код в экземпляре 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 будут использоваться?

3

Решение

Да, вызов 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)
}

Надеюсь, это поможет кому-то еще спасти несколько волосяных фолликулов 🙂

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]