AWS S3の署名付きURLを試してみる
概要
AWS S3の署名付きURLを権限を変えながら動作を確認してみます。
準備
- バケットの作成
$ aws s3 mb s3://test-s3-presigned-url-0904
- コンテンツのアップロード
$ echo '<!DOCTYPE html><meta charset=utf-8><title>test-s3-presigned-url-0904</title>test-s3-presigned-url-0904' > index.html $ aws s3 cp index.html s3://test-s3-presigned-url-0904/index.html
- IAMユーザの作成
$ aws iam create-user --user-name test-s3-user
- アクセスキーの発行
$ aws iam create-access-key --user-name test-s3-user
- クレデンシャルの設定
「AccessKeyId」と「SecretAccessKey」を ~/.aws/credentials に以下のように追記
[test-s3-user] aws_access_key_id = xxxxxxxxxx aws_secret_access_key = xxxxxxxxxx region = ap-northeast-1
- S3バケットを参照するためのIAMロールを作成
$ aws iam create-role \ --role-name test-s3-viewer-role \ --assume-role-policy-document file://trust-policy.json $ aws iam put-role-policy \ --role-name test-s3-viewer-role \ --policy-name test-s3-viewer-policy \ --policy-document file://test-s3-viewer-policy.json
・trust-policy.json
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:user/test-s3-user" ] }, "Action": "sts:AssumeRole" } ] }
・test-s3-viewer-policy.json
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::test-s3-presigned-url-0904" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::test-s3-presigned-url-0904/*" ] } ] }
- IAMロールを利用できるように設定
~/.aws/config に以下を追記
[profile test-s3-viewer] role_arn = arn:aws:iam::123456789012:role/test-s3-viewer-role source_profile = test-s3-user region = ap-northeast-1
動作確認
- 署名付きURLの発行
$ aws s3 presign s3://test-s3-presigned-url-0904/index.html --profile test-s3-user
- 署名付きURLでS3のオブジェクトを参照
$ curl ${上記で出力されたURL} <?xml version="1.0" encoding="UTF-8"?> <Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>BPGTK2FCCCHWA36B</RequestId><HostId>A+TrprqqWadoewmYldeuuv5jwgdt3u/jy92y1KHV0Cdqn08iEtWpfFSExSrCzTJ+T1dkizwWtJw=</HostId></Error>
IAMユーザ「test-s3-user」には、S3バケットに権限を付与していないので、エラーになる。
- 署名付きURLの発行 (権限あり)
$ aws s3 presign s3://test-s3-presigned-url-0904/index.html --profile test-s3-viewer
- 署名付きURLでS3のオブジェクトを参照
$ curl ${上記で出力されたURL} <!DOCTYPE html><meta charset=utf-8><title>test-s3-presigned-url-0904</title>test-s3-presigned-url-0904
S3のバケットに権限があるロールを利用して署名しているため、参照できる。