AWS S3の特定のbucketに、CLIやAPIからアクセスキーIDとシークレットアクセスキーでアクセスする設定を行います。
全体像は以下のようなイメージです。まず、s3testwsというバケットをつくります。そしてs3testwsuserというユーザーをつくり、アクセスキーIDとシークレットアクセスキーを生成します。
そして、バケットポリシーでこのバケットs3testwsに対してユーザーs3testwsuserのアクセス権限を付与します。
#1 バケットの作成
以下のようにバケットを作成します。リージョンはap-northeast-1を選び、パブリックアクセスをすべてブロックしています。
テスト用にtest.csvというファイルをアップロードしておきました。
#2 ユーザーの作成
以下のようにユーザーを作成します。「プログラムによるアクセス」にチェックをいれて、アクセスキーIDとシークレットアクセスキーを生成します。
グループやアクセス権限、タグは設定なしで構いません。
アクセスキーIDとシークレットアクセスキーをメモしておきます。
AWS CLIからアクセスしてみます。この時点では権限がないのでアクセスできないはずです。
aws configure --profile s3testwsuser
先ほどのアクセスキーIDとシークレットアクセスキーを設定し、リージョンはap-northeast-1に設定します。
C:\temp>aws configure --profile s3testwsuser
AWS Access Key ID [None]: AXXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: json
まだアクセス権限を与えていないので、s3://s3testwsをlsすると失敗します。
C:\temp>aws s3 ls --profile s3testwsuser s3://s3testws
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
次にバケットポリシーを設定していきますが、その前にこのユーザーのARNをメモしておきます。
arn:aws:iam::0xxxxxxxxxxxxx:user/s3testwsuserというような文字列です。
#3.バケットポリシーの設定
バケットポリシーでs3testwsuserにアクセス権限を与えます。
バケットの「アクセス許可」タブの「バケットポリシー」を編集します。
以下のjsonで設定をします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "statement1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam:0xxxxxxxxxxx:user/s3testwsuser"
},
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::s3testws"
]
},
{
"Sid": "statement2",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::0xxxxxxxxxxx:user/s3testwsuser"
},
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::s3testws/*"
]
}
]
}
statement1でユーザーs3testwsuserにバケットs3testwsに対するGetBucketLocationとListBucketを付与しています。これでバケット内をls可能になります。
statement2でユーザーs3testwsuserにバケットs3testws内のすべてのオブジェクトに対するGetObjectとPutObjectを付与しています。これでバケット内のファイルのアップロード、ダウンロードが可能になります。
この設定ができるとaws cliでバケット内のls、get、putが可能になります。
C:\temp\s3test>aws s3 ls --profile s3testwsuser s3://s3testws
2021-09-13 10:39:38 32 test.csv
C:\temp\s3test>aws s3 cp --profile s3testwsuser s3://s3testws/test.csv ./
download: s3://s3testws/test.csv to .\test.csv
C:\temp\s3test>dir
ドライブ C のボリューム ラベルは Windows です
ボリューム シリアル番号は A0A9-D574 です
C:\temp\s3test のディレクトリ
2021/09/13 11:15 <DIR> .
2021/09/13 11:15 <DIR> ..
2021/09/13 10:39 32 test.csv
1 個のファイル 32 バイト
2 個のディレクトリ 38,611,513,344 バイトの空き領域
C:\temp\s3test>aws s3 cp --profile s3testwsuser test.csv s3://s3testws/test2.csv
upload: .\test.csv to s3://s3testws/test2.csv
C:\temp\s3test>aws s3 ls --profile s3testwsuser s3://s3testws
2021-09-13 10:39:38 32 test.csv
2021-09-13 11:16:18 32 test2.csv
#4 参考
Amazon IAM編 S3バケット内特定フォルダだけ操作するIAMポリシー – ナレコムAWSレシピ | AIに強い情報サイト
Bucket policy examples - Amazon Simple Storage Service
AWS CLIでS3を操作するコマンド一覧 - Qiita