はじめに
AWS S3 を利用していると、「Access Denied」のエラーに遭遇することがあります。
このエラーはアクセス権限の設定に問題がある場合に発生しますが、IAM ポリシーやバケットポリシー、VPC エンドポイントなど、さまざまな要因が絡んでいる可能性があります。
本記事では、このエラーの原因と対処法を整理し、スムーズに問題を解決できるように解説します。
書こうと思ったきっかけ
S3 のアクセス制御は、AWS の権限管理の中でも特に混乱しやすい部分です。
私自身も S3 にアクセスできずに悩んだ経験があり、その際に IAM ポリシーやバケットポリシー、VPC エンドポイントの設定などを見直すことで解決できました。
同じように困っている方がスムーズに問題を解決できるよう、今回の記事を書くことにしました。
困っていたエラー
AWS S3バケットにアクセスしようとした際に、以下のようなエラーが発生することがあります。
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
</Error>
このエラーの原因は、主にS3バケットのアクセス権限の設定にあります。
本記事では、考えられる原因と対処方法を体系的にまとめます。
1. IAMポリシーの設定ミス
原因
IAMユーザーやロールに適切な権限が付与されていないと、S3バケットへのアクセスが拒否される可能性があります。
対処方法
- AWSマネジメントコンソールで、IAM > ポリシー に移動。
- 該当のIAMユーザーやロールに
s3:GetObject
またはs3:ListBucket
などの適切な権限が設定されているか確認。 - 必要に応じて、ポリシーを修正する。
例: バケット内のオブジェクトを取得する権限の付与
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
2. S3バケットポリシーの制限
原因
バケットポリシーが外部または特定のIAMエンティティからのアクセスを拒否している可能性があります。
対処方法
- S3 > バケットのアクセス権限 から、バケットポリシーを確認。
-
Deny
ステートメントが意図せず適用されていないか確認。 - 必要に応じてバケットポリシーを修正する。
例: 特定のIAMユーザーにアクセスを許可するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/your-user-name"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::your-bucket-name/*"
}
]
}
3. バケットのパブリックアクセス設定
原因
AWSのデフォルト設定では、S3バケットはパブリックアクセスが制限されています。パブリックアクセスがブロックされていると、匿名ユーザー(署名なしのリクエスト)からのアクセスは拒否されます。
対処方法
- S3 > バケットのアクセス権限 > パブリックアクセス設定 を確認。
- 必要に応じて、特定のリソースやユーザーに対して適切なアクセス権限を付与。
- 誤ってバケット全体をパブリックにしないように注意する。
4. AWS Organizationのサービスコントロールポリシー(SCP)
原因
AWS OrganizationsのSCPによって、特定のIAMエンティティがS3へのアクセスを制限されている可能性があります。
対処方法
- AWS Organizations > サービスコントロールポリシー を確認。
-
s3:GetObject
やs3:ListBucket
への制限がある場合、適切な修正を行う。
5. VPCエンドポイントの設定
原因
S3アクセスがVPCエンドポイント経由に制限されていると、インターネット経由のアクセスはブロックされます。
対処方法
-
VPC > エンドポイント で
com.amazonaws.region.s3
のエンドポイントを確認。 -
エンドポイントポリシー に
s3:GetObject
が含まれているか確認。
6. CloudFront経由のアクセス制限
原因
S3バケットがCloudFrontを介してアクセスされるよう設定されている場合、オリジンアクセス設定によって直接のS3アクセスがブロックされることがあります。
対処方法
- CloudFront > オリジン設定 でS3バケットが正しく設定されているか確認。
-
Origin Access Control (OAC)
やOrigin Access Identity (OAI)
の設定を見直す。
まとめ
S3バケットへのアクセスが拒否される原因はさまざまですが、基本的には以下のポイントを確認することで解決できます。
- IAMポリシー で適切な権限が付与されているか?
- バケットポリシー で意図しない拒否設定がないか?
- パブリックアクセス設定 が必要に応じて有効か?
- AWS OrganizationsのSCP による制限がないか?
- VPCエンドポイント の影響を受けていないか?
- CloudFront経由のアクセス が影響していないか?
エラーが発生した場合は、まず IAMポリシーとバケットポリシー を確認し、それでも解決しない場合は ネットワーク関連の設定 を見直すのがおすすめです。