※ 前提として awscli が入っていて aws configure
で特権(ないしiamが作れる)ユーザが設定されていること。
ここでは 名前を upload-teacher-data
とします。
$ aws iam create-user --user-name upload-teacher-data
{
"User": {
"UserName": "upload-teacher-data",
"Path": "/",
"CreateDate": "2017-12-12T00:47:56.413Z",
"UserId": "xxxxxxxxxxxxxxxxxxxxx",
"Arn": "arn:aws:iam::999999999999:user/upload-teacher-data"
}
}
$
policy.json
というファイル名で、以下を書きます。
ここでは、S3の権限の PutObject
を、バケット名 test-bucket-*
の中の /lean-*/*"
にマッチするものに付与します。(いちおう、明示的に他の権限は剥奪しておきます。)
注意点として、Resource
で指定しているバケットは利用者で一意でないと駄目なので先に作っておく方がいいです。(ここで指定した値が自分のものになるとは限らないので。。)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::test-bucket-*/lean-*/*"
]
},
{
"Effect": "Deny",
"NotAction": [
"s3:PutObject"
],
"NotResource": [
"arn:aws:s3:::test-bucket-*/lean-*/*"
]
}
]
}
名前は upload-teacher-data-policy
としています。
$ aws iam create-policy --policy-name upload-teacher-data-policy --policy-document file://policy.json
{
"Policy": {
"PolicyName": "upload-teacher-data-policy",
"CreateDate": "2017-12-12T00:44:15.937Z",
"AttachmentCount": 0,
"IsAttachable": true,
"PolicyId": "xxxxxxxxxxxxxxxxxxxxx",
"DefaultVersionId": "v1",
"Path": "/",
"Arn": "arn:aws:iam::999999999999:policy/upload-teacher-data-policy",
"UpdateDate": "2017-12-12T00:44:15.937Z"
}
}
$
ユーザはユーザ名(upload-teacher-data
) 、ポリシーはAmazonリソースネーム(arn:aws:iam::999999999999:policy/upload-teacher-data-policy
) で指定します。
$ aws iam attach-user-policy --policy-arn arn:aws:iam::999999999999:policy/upload-teacher-data-policy --user-name upload-teacher-data
"AccessKeyId", "SecretAccessKey" をメモっておきます。
$ aws iam create-access-key --user-name upload-teacher-data
{
"AccessKey": {
"UserName": "upload-teacher-data",
"Status": "Active",
"CreateDate": "2017-12-12T00:48:24.186Z",
"SecretAccessKey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"AccessKeyId": "xxxxxxxxxxxxxxxxxxxx"
}
}
$
とりあえず、特権で。。
$ aws s3 mb s3://test-bucket-us-east-2-003
$ touch dummy
$ aws s3 cp dummy s3://test-bucket-us-east-2-003/lean-001/dummy
$ aws s3 cp dummy s3://test-bucket-us-east-2-003/lean2-001/dummy
$ aws s3 cp dummy s3://test-bucket-us-east-2-003/lean-dummy
ユーザを切り替えて確認。
(このユーザだと特定の場所にアップロードは出来るけ何も見えない、を確認。ちゃんとアップロードできたかは、ブラウザから aws console とかで確認すること)
$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$
$ dd if=/dev/zero of=gomi.bin bs=1M count=300
$ aws s3 cp gomi.bin s3://test-bucket-us-east-2-003/lean-001/
upload: ./gomi.bin to s3://test-bucket-us-east-2-003/lean-001/gomi.bin
$
$ aws s3 cp gomi.bin s3://test-bucket-us-east-2-003/
upload failed: ./gomi.bin to s3://test-bucket-us-east-2-003/gomi.bin An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
$
$ aws s3 cp gomi.bin s3://test-bucket-us-east-2-003/lean2-001/
upload failed: ./gomi.bin to s3://test-bucket-us-east-2-003/lean2-001/gomi.bin An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
$
$ aws s3 ls
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
$
$ aws s3 ls s3://test-bucket-us-east-2-003/
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
$
$ aws s3 ls s3://test-bucket-us-east-2-003/lean-001/
An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied
$
- 上書きアップロードは出来てしまうので、不安ならバケットの設定でバージョニングはつけても良いかもしれない。
- このポリシーだとフォルダを掘り放題だけどいっか。(ワイルドカードを工夫すると良いかもしれない)
- 用無しになったらアクセスキーを消すとかすればいいはず。
- (なにかあれば追記する)