CloudFrontで署名付きURLの設定ハンズオン

## はじめに
CloudFront経由のS3ファイルへのアクセスに、署名付きURL発行を追加していきたいと思います

## 構築準備
#### 前提条件
AWSのCloudFront＋S3の静的HPを作成済
参照：[AWS CLIを利用してAmazon S3静的ウェブサイトのホスティング](https://cloud5.jp/statically_page_hosting_by_s3/)

#### ハンズオン前の画面状態
CloudFront設定時のドメイン又は、カスタムドメインでアクセスが可能な状態
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-12.34.03-1-640x207.png)

## 構築手順
①ローカルでパブリック・プライベートキーの作成
②作成したパブリックキーをCloudFrontへ登録（``key-pair-id``発行）

こちらの画像は``key-pair-id``を入手後、署名付きURLを発行してから、コンテンツを入手するまでのフローです。

![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-14.43.58-640x510.png)

## ハンズオン
### ローカルでプライベートキー・パブリックキーの作成
参考：[署名者のキーペアの作成](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/private-content-trusted-signers.html#private-content-creating-cloudfront-key-pairs)

#### プライベートキーの作成
OpenSSL を使用して 2,048 ビット長の RSA キーペアを生成し、private_key.pem という名前のファイルに保存
```
openssl genrsa -out private_key.pem 2048
```
#### パブリックキーの抽出
private_key.pem という名前のファイルからパブリックキーを抽出
```
openssl rsa -pubout -in private_key.pem -out public_key.pem
```
### CloudFrontでの設定（パブリックキーの登録）
#### パブリックキーを CloudFront にアップロードする
サービス『CloudFront』から左ペイン『パブリックキー』を選択して、『パブリックキーを作成』押下
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-11.50.57-640x358.png)

#### パブリックキーを作成
名前を入力して、__パブリックキー__の値をPEM形式で貼り付ける

__【確認のコマンド】__
キーについては下記コマンドで表示、コピーして入力する
```
cat public_key.pem | pbcopy
```
取得してコピーされた値を入力して、CloudFrontにパブリックキーを作成する
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-11.55.32-1-640x540.png)

#### パブリックキーをキーグループに追加する
キーグループを作成してパブリックキーを入力する
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-11.59.36-640x290.png)

#### キーグループ作成
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-11.58.49-640x424.png)

### CloudFrontでの設定（ディストリビューションでの設定）
#### 署名付きURLの対象とするディストリビューションを選択
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-11.27.42-640x114.png)

#### ビヘイビアの設定
『ビヘイビアの設定』から、『ビューワーのアクセスを制限する』を画像のように設定・選択をする
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-12.08.53-640x310.png)

#### デプロイが終了したら完了
デプロイ前では署名付きURLは発行されません

### ターミナルから署名付きURLを発行する
__※``key-pari-id``とは、パブリックキーのIDです。キーグループのIDではありません__
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-15.13.53.png)

#### 署名付きURL発行コマンド
より詳細に設定する場合
参考:[AWS CLIコマンドリファレンス](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/cloudfront/sign.html)
```
aws cloudfront sign --url  https://XXXXXXXXXX.cloudfront.net/index.html --key-pair-id XXXXXXXXXX  --private-key file://private_key.pem --date-less-than 2022-07-11
```
上記コマンドに対してのレスポンス
```
https://XXXXXXXXXX.cloudfront.net/index.html?Expires=XXXXXXXXXX&Signature=XXXXX(中略)XXXXX&Key-Pair-Id=XXXXXXXXXX
```

## 挙動確認
### 返却されたURLにアクセスする
想定通りにアクセスすることが出来ました
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-12.34.29-1-640x192.png)

### 署名なしでアクセスする
当然ですがアクセスすることは出来ません
``<Code>MissingKey</Code>``と表示されます
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-12.34.17-1-640x140.png)

### 日付が過ぎた状態でアクセスする
当然ですがアクセスすることは出来ません
``<Code>AccessDenied</Code>``と表示されます
![](https://cloud5.jp/wp-content/uploads/2022/07/スクリーンショット-2022-07-10-15.24.23-640x139.png)

## さいごに
署名付きURLを発行してオブジェクトへのアクセスをハンズオンしてみました。
当初オブジェクトへのアクセスのためS3での設定かと思っていたのですが、CloudFrontだけの設定で済むものかと思ってませんでした。
オリジンのS3に対するアクセス制御の一つに署名付きURLが設定できると、少しは認識を深めることが出来ました（「おま、ちょ認識違うぜww」などありましたら、甘んじで受け入れる所存です。）