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のバケットに権限があるロールを利用して署名しているため、参照できる。

備考