【AWS】署名付き URL を使用した S3 オブジェクトの共有を試しました

# はじめに
基本的に S3 に保存しているオブジェクトはプライベートアクセスとなっており、所有者からしかアクセスできません。ただ、プライベートアクセスにもかかわらず、署名付き URL を発行することで、他者と共有することができます。

以下公式サイト上の説明を引用します。
>デフォルトでは、すべての S3 オブジェクトがプライベートです。オブジェクトの所有者のみがそれらにアクセスする許可を持ちます。ただし、オブジェクトの所有者はオプションで他ユーザーとオブジェクトを共有することができます。その場合は、署名付き URL を作成し、独自のセキュリティ証明書を使用して、オブジェクトをダウンロードするための期限付きの許可を相手に付与します。

本記事は、 EC2 から S3 バケットを作成し、そこにオブジェクトを置いて、署名付きURLを発行してアクセス動作を実現します。
EC2 の OS は Amazon Linux 2 

# １．EC2用IAMロールの作成と付与
EC2用のIAMロールに、以下のポリシーを付与してください。
``AmazonS3FullAccess``
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/61ac8af4-f5c4-f170-17d8-572ee0deb859.png)

上記作成したロールを、EC2 に付与します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/f07ae9ed-270c-6dc9-ee97-bee7968da23d.png)

# ２．S3バケットの作成とオブジェクトのコピー
S3バケットの作成
```
$ aws s3 mb s3://hogehogebucket666666666
make_bucket: hogehogebucket666666666
```
テスト用ファイルの作成
```
$ echo "Hello World" > hello.txt
$ ls
hello.txt
```
テストファイルをS3へコピー
```
$ aws s3 cp hello.txt s3://hogehogebucket666666666
upload: ./hello.txt to s3://hogehogebucket666666666/hello.txt
```
S3側にファイルがコピーされたことを確認
```
$ aws s3 ls s3://hogehogebucket666666666
2022-05-12 08:08:31         12 hello.txt
```

# ３．署名付きURLを発行前にオブジェクトURLをアクセス確認
上記で作成されたS3に、当オブジェクトのURLを叩くと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/268d0845-09ce-d18b-ed41-48a8de405c36.png)
アクセス不可であることは確認できました。
こちらは想定通りの動きです。
署名付きURL発行前に、S3バケットに置いてあるオブジェクトは、
プライベートアクセスしか許容できていないため、
直接インターネットからはアクセスできません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/c15b290b-e0c5-7cec-70ba-11d9defdd8d6.png)

# ４．署名付きURLを発行
以下のコマンドを叩くと、署名付きURLは発行することになります。
``--expires-in``オプションを指定すると、URLの有効期限を設定することができます。
今回は300秒で設定しておきました。
``--expires-in``オプションを付けないと、デフォルト3600秒の有効期限となります。
一方で、指定すると、最大604800秒まで定義することができます。
>--expires-in (integer) Number of seconds until the pre-signed URL expires. Default is 3600 seconds. Maximum is 604800 seconds.
```
$ aws s3 presign s3://hogehogebucket666666666/hello.txt --expires-in 300
```
以下は実際署名付きURLを発行してみました。
```
$ aws s3 presign s3://hogehogebucket666666666/hello.txt --expires-in 300
https://hogehogebucket666666666.s3.amazonaws.com/hello.txt?AWSAccessKeyId=XXXXXXXXXXXXXXXXXX&Expires=XXXXXXXXXXX&x-amz-security-token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
上記発行した非常に長いURLを叩くと、アクセスできることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/086eb1e0-ab55-b80e-370a-2099cff8a947.png)

5分後再度アクセスすると、アクセスがDenyに変更されていることも確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/865613/01a82c24-17f8-5289-d7d5-e56efe077e45.png)

# 参考資料
１．署名付き URL を使用したオブジェクトの共有

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html

２．AWS CLI Command Reference

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/presign.html