スキップしてコンテンツを表示

CloudFormation で発生する "S3 error: Access Denied" エラーの原因を教えてください。

所要時間2分
0

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 ステートメントがあるかどうかを確認するには、次の手順を実行します。

  1. Amazon S3 コンソールを開きます。
  2. ナビゲーションペインで [バケット] を選択します。
  3. [バケット] ドロップダウンリストからテンプレートファイルを含むバケットを選択します。
  4. [権限] タブを選択します。
  5. [バケットポリシー][編集] を選択します。
  6. "Effect": "Deny" を含むステートメントを検索します。
  7. "Effect": "Deny" ステートメントのうち、IAM ロールによる s3:GetObject または s3:GetObjectVersion への アクセスを拒否しているものを更新します。
  8. CloudFormation で使用している IAM ロールを削除します。
  9. [変更を保存] を選択します。
  10. スタックを再度作成するか、更新します。

詳細については、「Amazon S3 バケットポリシーの例」を参照してください。

S3 バケットの暗号化設定を検証し、IAM ロールで KMS アクセスを有効にする

バケットがカスタマーマネージド AWS Key Management Service (KMS) キーを使用して暗号化を有効にしている場合、"S3 Access Denied" エラーが発生する可能性があります。バケットが暗号化されている場合は、IAM ID が KMS キーにアクセスできるようにキーポリシーを更新します。

次の手順を実行します。

  1. AWS KMS コンソールを開きます。
  2. ナビゲーションペインで [カスタマーマネージドキー] を選択します。
  3. KMS キーのリストから、S3 オブジェクトを暗号化するキーのエイリアスまたはキー ID を選択し、[キーポリシー] タブを選択します。
  4. 次のステートメントを使用してポリシーを更新します。
{    "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 を無効にする」を参照してください。

AWS公式更新しました 4ヶ月前
コメントはありません

関連するコンテンツ