目次
IAMポリシーとS3のバケットポリシーについて
S3アクセスの制御の役割としてIAMポリシーとS3のバケットポリシーがあります。
IAMポリシー
ユーザー/ロール/グループに「この人は何ができるか」を定義するものです。
バケットポリシー
バケット側で「誰を受け入れるか」を定義するものです。
アクセスしてきたユーザーが入場できるかどうかを決める「入口ゲートのルール」に近いです。
S3アクセス時のIAMポリシーとS3バケットポリシーの許可の関係
EC2からS3へアクセスする場合で
同一のアカウント内でのアクセスの場合 | IAMポリシーまたはS3バケットポリシーのどちらかで許可されていればアクセスできます(※)。 基本は、IAMポリシーに操作の許可を与えバケットポリシーの許可は不要です。 |
異なるアカウントでのアクセスの場合 | IAMポリシーとS3バケットポリシーの両方で許可されている必要があります。 |
※S3バケットポリシーに記載する場合、S3バケットポリシーにアクセスするIAMロールの記載は必要です。
許可されていない場合でEC2からS3へaws lsコマンドのでアクセスした場合以下のアクセスできないというメッセージが出ます。
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
バケットポリシーを編集する
1.S3のバケットの一覧から対象のバケットを選択します。
2.アクセス許可をクリックします。
3.「ブロックパブリックアクセス」は「すべてブロック」のままです。
4.バケットポリシーで編集ボタンをクリックします。
5.パケットポリシーを編集します。EC2からS3にアクセスする想定です。
{
"Version": "2012-10-17",
"Id": "S3-test-Policy-111",
"Statement": [
{
"Sid": "S3-test",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/test-role-2022"
},
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::test-s3-data-2022",
"arn:aws:s3:::test-s3-data-2022/*"
]
}
]
}
8行目のPrincipalは、誰がという意味になります。
9行目は、アカウント111111111111のtest-role-2022がという意味です。test-role-2022は、EC2に追加したロールです。※テストのため、ロールにはS3へのアクセス権がない状態にしています。
13行目のListBucketは、バケット内のオブジェクト一覧を取得します。
15行目以降は、アクセスする対象です。
16行目は、13行目のs3:ListBucketで必要な書き方です。
17行目は、12行目の"s3:GetObject"で必要な書き方です。
17行目が無い場合、Action does not apply to any resource(s) in statementというエラーが表示されます。
s3:ListBucket | バケット内のオブジェクト一覧を取得する |
s3:GetObject | オブジェクトを取得する |
s3:PutObject | オブジェクトを追加する |
s3:DeleteObject | オブジェクトを削除する |
EC2からS3のバケットポリシーを確認する
EC2からS3へアクセスする場合で、同一のアカウント内でのアクセスの場合で
EC2にロールをつけますが、ロールにはS3へのアクセス権がない状態です。
1.EC2でawsコマンドを入力しアクセスできることが確認できました。
[ec2-user@ip-10-0-10-4 ~]$ aws s3 ls test-s3-data-2022
2023-01-26 00:31:58 7 aaa.txt
2022-07-14 01:36:42 774 aws-test1.png
2023-03-29 13:51:05 0 win1.txt
[ec2-user@ip-10-0-10-4 ~]$
エラーのパターン
1.上記バケットポリシーの9行目のロールをEC2に指定しないでlsコマンドを実行した場合、AccessDeniedになります。
[ec2-user@ip-10-0-10-4 ~]$ aws s3 ls test-s3-data-2022
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
[ec2-user@ip-10-0-10-4 ~]$
S3からS3のコピー
転送元のS3に上記バケットポリシーの9行目のロールをEC2に指定しない場合
[ec2-user@ip-10-0-10-4 ~]$ aws s3 cp s3://test-s3-data-2022/win1.txt s3://test-data-s3-bk
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
[ec2-user@ip-10-0-10-4 ~]$
転送先のS3に上記バケットポリシーの9行目のロールをEC2に指定しない場合
[ec2-user@ip-10-0-10-4 ~]$ aws s3 cp s3://test-s3-data-2022/win1.txt s3://test-data-s3-bk
copy failed: s3://test-s3-data-2022/win1.txt to s3://test-data-s3-bk/win1.txt An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied
[ec2-user@ip-10-0-10-4 ~]$
2.バケットに存在しないファイルをcpでs3からEC2にコピーしようとした場合、An error occurred (404)になります。
[ec2-user@ip-10-0-10-4 ~]$ aws s3 cp s3://test-s3-data-2022/test1.txt .
fatal error: An error occurred (404) when calling the HeadObject operation: Key "test1.txt" does not exist
[ec2-user@ip-10-0-10-4 ~]$
3.上記バケットポリシーの9行目のロールをEC2に指定しないで、ファイルをcpでs3からEC2にコピーしようとした場合fatal error: An error occurred (403)になります。
[ec2-user@ip-10-0-10-4 ~]$ aws s3 cp s3://test-s3-data-2022/win1.txt .
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
[ec2-user@ip-10-0-10-4 ~]$
4.上記バケットポリシーでGlacier Deep ArchiveのファイルをcpでEC2にコピーしようとした場合、The operation is not valid for the object's storage classが表示されます。
[ec2-user@ip-10-0-10-4 ~]$ aws s3 cp s3://test-s3-data-2022/aaa.txt .
download failed: s3://test-s3-data-2022/aaa.txt to ./aaa.txt An error occurred (InvalidObjectState) when calling the GetObject operation: The operation is not valid for the object's storage class
[ec2-user@ip-10-0-10-4 ~]$
5.上記バケットポリシーでローカルのEC2のファイルをS3のバケットにコピーしようとした場合(S3のバケットポリシーにs3:PutObjectを追加していない)、An error occurred (AccessDenied) when calling the PutObject operationが表示されます。
[ec2-user@ip-10-0-10-4 ~]$ aws s3 cp abc.txt s3://test-s3-data-2022
upload failed: ./abc.txt to s3://test-s3-data-2022/abc.txt An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
[ec2-user@ip-10-0-10-4 ~]$
6.上記バケットポリシーの9行目のロールではなく、「"Service": "s3.amazonaws.com"」を指定しファイルをcpでEC2にコピーしようとした場合fatal error: An error occurred (403)になります。
[ec2-user@ip-10-0-10-4 ~]$ aws s3 cp s3://test-s3-data-2022/win1.txt .
fatal error: An error occurred (403) when calling the HeadObject operation: Forbidden
[ec2-user@ip-10-0-10-4 ~]$
lsコマンド(aws s3 ls test-s3-data-2022)は成功します。
関連の記事
AWS S3のアカウント間のファイルコピーのバケットポリシー
AWS CLIのコマンド (S3のファイルの一覧/コピー/移動)