Разрешение AWS AssumeRole не работает
Я пытаюсь вызвать функцию AssumeRole с помощью AWS sts в моей программе PHP, так как я хочу создать временные учетные данные, чтобы позволить пользователю создать объект для ведра AWS.
Ниже приведена ошибка, которую я вызываю PHP:
$sts = StsClient::factory(array(
'key' => 'XXXXXXXXXXXXXX',
'secret' => 'XXXXXXXXXXXXXXXX',
'token.ttd' => $timetodie
));
$bucket = "mybucket";
$result1 = $sts->assumeRole(array(
'RoleArn' => 'arn:aws:iam::123456789012:role/createPic',
'RoleSessionName' => 'mytest',
'Policy' => json_encode(array(
'Statement' => array(
array(
'Sid' => 'Deny attributes',
'Action' => array(
's3:deleteObject',
's3:deleteBucket'
),
'Effect' => 'Deny',
'Resource' => array(
"arn:aws:s3:::{$bucket}",
"arn:aws:s3:::{$bucket}/AWSLogs/*"
),
'Principal' => array(
'AWS' => "*"
)
)
)
)
),
'DurationSeconds' => 3600,
// 'ExternalId' => 'string',
));
$credentials = $result1->get('Credentials');
Однако я продолжаю получать следующую ошибку:
Пользователь arn: aws: iam:: 123456789012: пользователь /TVMUser не имеет права выполнять: sts: AssumeRole на ресурсе: arn: aws: iam:: 123456789012: role/createPic
Ниже приведена моя политика разрешений для пользователя TVMUser на моей консоли AWS:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect":"Allow",
"Action":"ec2:RunInstances",
"Resource":"*"
},
{
"Effect":"Allow",
"Action":"iam:PassRole",
"Resource":"arn:aws:iam::791758789361:user/TVMUser"
},
{
"Effect":"Allow",
"Action":"sts:AssumeRole",
"Resource":"arn:aws:iam::791758789361:role/createPic"
}
]
}
Ниже приведена моя роль в роли createPic:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:Get*",
"s3:List*",
"s3:Put*",
],
"Effect": "Allow",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::123456789012:role/createPic"
}
]
}
Кто-нибудь теперь видит то, чего я не вижу в своих инструкциях по политике AWS и настройке на AWS, поэтому я не получаю ошибку: User arn: aws: iam:: 123456789012: пользователь /TVMUser не имеет права выполнять: sts: AssumeRole на ресурсе: arn: aws: iam:: 123456789012: role/createPic?
Я что-то пропустил?
Ответы
Ответ 1
Вам также необходимо отредактировать отношения доверия для роли, чтобы позволить учетной записи (даже если она такая же) взять на себя роль.
- откройте роль, которую вы хотите использовать в консоли.
- перейдите на вкладку "Отношения доверия"
- нажмите "Изменить RelationShip"
- добавить инструкцию для учетной записи, которую вы хотите добавить (обычно у вас будет только служба ec2 в "доверенных сущностях" ), например.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
},
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/some-role"
},
"Action": "sts:AssumeRole"
}
]
}
В этом примере мне пришлось добавить принципала "AWS" с соответствующим номером учетной записи, служба ec2.amazonaws.com уже была там.
После того, как я сделал это, я смог взять на себя роль без проблем. Взял меня буквально в часы, чтобы понять это, надеюсь, что это поможет кому-то.
Ответ 2
Возможно, вы должны назначить свою область и конечную точку sts:
$sts = StsClient::factory(array(
//...
'region' => 'us-west-2',
'endpoint' => 'https://sts.us-west-2.amazonaws.com',
));
Ответ 3
У меня была такая же ошибка и потраченные часы, пытаясь исправить ее с разрешениями и отношениями доверия... но это не было моей проблемой.
Я следил за этот учебник, и я развернул кластер в US West (Oregon), как указано.
Чтобы он работал, мне нужно было активировать STS для этого региона здесь.
![введите описание изображения здесь]()