ユーザーが AWS バケットのオブジェクトを作成できるようにするための一時的な認証情報を作成したいので、PHP プログラムで AWS sts を使用して AssumeRole 関数を呼び出そうとしています。
以下は私が 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');
しかし、次のエラーが引き続き発生します。
User arn:aws:iam::123456789012:user/TVMUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/createPic
以下は、AWS コンソール上のユーザー TVMUser に対するアクセス許可ポリシーです。
{
"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":[
{
"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"
}
]
}
次のエラーが発生しないように、AWS ポリシーステートメントと AWS の設定で何が欠けているか知っている人はいますか?
User arn:aws:iam::123456789012:user/TVMUser is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::123456789012:role/createPic
何か見逃しているのでしょうか?
ベストアンサー1
また、アカウント (同じアカウントであっても) がロールを引き受けることができるように、ロールの信頼関係を編集する必要があります。
- コンソールで引き受けたい役割を開きます
- 「信頼関係」タブをクリックします
- 「関係を編集」をクリックします
- 追加したいアカウントのステートメントを追加します(通常、「信頼されたエンティティ」には 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 サービスは既に存在していました。
それを実行した後、問題なく役割を引き受けることができました。これを理解するのに文字通り何時間もかかりましたが、誰かの役に立てば幸いです。