AWSのS3のバケットポリシーを設定してファイルコピーするサンプルです。
目次
AWS | S3のバケットポリシーを設定する |
バケットポリシーを編集する | |
EC2からS3のバケットポリシーを確認する | |
エラーのパターン |
S3のバケットポリシーを設定する
・EC2からS3へアクセスする場合で、同一のアカウント内でのアクセスの場合、IAMポリシーまたはS3バケットポリシーのどちらかで許可されていればアクセスできます。
どちらもない場合でEC2からS3へaws lsコマンドのでアクセスした場合以下のメッセージが出ます。
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
・EC2からS3へアクセスする場合で、異なるアカウントでのアクセスの場合、IAMポリシーとS3バケットポリシーの両方で許可されている必要があります。
バケットポリシーを編集する
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)は成功します。
関連の記事