Разрешение 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 для этого региона здесь.

введите описание изображения здесь