AWS CloudFormation でスタックを作成または更新したときに発生する、Amazon Simple Storage Service (Amazon S3) の「アクセス拒否」エラーを解決したいです。
解決策
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
IAM ロールまたはユーザーポリシーのトラブルシューティング
CreateChangeSet または CreateStack で使用した AWS Identity and Access management (IAM) ID を確認します。IAM ユーザーまたはロールに必要なアクセス許可があることを確認します。必要に応じて、GetObject アクセスアクセス許可を与えるポリシーを IAM ID にアタッチします。次のポリシー例には、GetObject アクセス許可が含まれています。
{
"Version":"2012-10-17",
"Statement":[
{
"Effect":"Allow",
"Action":[
"s3:GetObject",
"s3:GetObjectVersion"
],
"Resource":"arn:aws:s3:::DOC-EXAMPLE-BUCKET/*"
}
]
}
テンプレートファイルが存在し、タイプミスがないことを確認する
テンプレートファイルが存在し、タイプミスが含まれていないかどうかを確認するには、次の手順を実行します。
ネストされたスタックに指定されたテンプレート URL が有効であることを確認します。AWS CLI コマンド list-objects を実行してオブジェクトを一覧表示します。
aws s3 list-objects --bucket DOC-EXAMPLE-BUCKET --prefix file-path/template-file.json
テンプレートの URL に余分なスペースが含まれていないことを確認してください。タイプミスにより S3 アクセス拒否エラーが発生する可能性があります。
S3 バケットポリシーに明示的な Deny ステートメントがないか確認する
S3 バケットに IAM ロールの明示的な Deny ステートメントがあるかどうかを確認するには、次の手順を実行します。
- Amazon S3 コンソールを開きます。
- バケットのリストから、テンプレートファイルを含むバケットを開きます。
- [アクセス許可] タブを選択します。
- バケットポリシーセグメントに移動します。
- "Effect": "Deny" を含むステートメントを検索します。
- バケットポリシーを編集し、"Effect": "Deny" ステートメントのうち、s3:GetObject または s3:GetObjectVersion への IAM ロールアクセスを拒否しているものを更新します。
- CloudFormation で使用している IAM ロールを削除します。
- [保存] を選択します。
- スタックを再度作成または更新します。
S3 バケットポリシーの詳細については、「バケットポリシーの例」を参照してください。
S3 バケットの暗号化設定を検証し、IAM ロールで KMS アクセスを有効にする
バケットがカスタマーマネージド AWS Key Management Service (KMS) キーを使用して暗号化を有効にしている場合、S3 Access Denied エラーが発生する場合があります。バケットが暗号化されている場合は、IAM ID が KMS キーにアクセスできるようにキーポリシーを更新します。
次の手順を実行します。
- AWS KMS コンソールを開きます。
- S3 バケット内のオブジェクトの暗号化に使用しているキーを特定し、[キーポリシー] タブを選択します。
- 次のステートメントを使用してポリシーを更新します。
{
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey"
],
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111122223333:user/IDENTITY"
},
"Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd"
}
注: IAM ID が他の AWS アカウントにある場合は、「Amazon S3 バケットで、カスタム AWS KMS キーを使用してデフォルトの暗号化を行っています。ユーザーがそのバケットでダウンロードやアップロードを行えるよう設定する方法を教えてください」を参照してください。
テンプレートファイルのオブジェクト ACL アクセス許可を確認する
テンプレートファイルが別のアカウントからアップロードされていても、ファイルの所有者はソースアカウントである場合があります。このアクションにより、ターゲットアカウントのユーザーはソースアカウントのテンプレートにアクセスできなくなります。この問題を解決するには、テンプレートファイルを S3 バケットにコピーして、バケット所有者にテンプレートへのフルアクセス許可を付与します。
次の put-object AWS CLI コマンドを実行して、バケットへのアクセスを許可します。
aws s3api put-object --bucket DOC-EXAMPLE-BUCKET --key key-name --body path-to-file --acl bucket-owner-full-control
アクセス制御リスト (ACL) の詳細については、「オブジェクトの所有権を管理し、バケットで ACL を無効にする」を参照してください。