AWS S3のバケットポリシーを設定してファイルコピー

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)は成功します。

関連の記事

AWS IAMユーザを作成するサンプル

△上に戻る