2016-09-22 5 views
2

Я хочу развернуть мой код в экземпляр EC2, но я не хочу печь в AWS Key и Secret. AWS Предоставляет IAM-сервис, позволяющий мне назначать роль моим экземплярам EC2, которые позволят этим экземплярам получить доступ с использованием временных ключей.Роли AWS STS с EC2 AssumeRole

Как я могу заставить это работать? Я попытался с помощью 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

Извините, вы действительно правы! В документации говорится: «Вы не можете позвонить в AssumeRole с помощью учетных данных учетной записи root AWS, доступ запрещен. Вы должны использовать учетные данные для пользователя IAM или ** роль IAM ** для вызова AssumeRole». Спасибо, что показал умный метод! –

ответ

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

Хотелось бы надеяться, что помогает кто-то сэкономить несколько волосяные фолликулы :)

 Смежные вопросы

  • Нет связанных вопросов^_^