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