API Gatewayから直接S3をアクセスしてみました

新しいサーバーレースのサービスをやってみまして、S3のファイルからAppStoreやGoogle playに自動リダイレクトする。s３のファイルは自動にリダイレクト出来ますがDomainの設定は出来ませんのでインターフェースを使わなきゃ！

## cloudfrontについて

Cloudfrontを使えますがまたACMが東京リージョンのため代替ドメインに設定できないです。

:::note warn
Amazon CloudFront で ACM 証明書を使用するには、米国東部 (バージニア北部) リージョン の証明書をリクエスト (またはインポート) していることを確認します。CloudFront ディストリビューションに関連づけられたこのリージョンの ACM 証明書は、このディストリビューションに設定されたすべての地域に分配されます。
:::

残ってるはApi Gatewayになります！

## Api Gateway

Api Gatewayは結構前から存在してまして、HTTP APIやRest　Apiが使えますサービス。その上にACMを対応してますので使う！

それから色々探しましたが、Lambdaを使うは基本見たいで他の情報が少ないです：
 ![Untitled Diagram-Page-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/f57457e8-6ca5-fc9c-9414-2d833e3ff4a1.png)
Api GatewayがHttp Apiとして作成して、エンドポイントはLambdaでお任せしって、Lambdaが全部判断することになります。それがちょっと不満してました、コストも上がるし、Lambdaの制限もありますし、ただのリダイレクトだとS3のオブジェクトの設定だけで出来るはずなので他の方法を試してました。
    ![Untitled Diagram-Page-2 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/f8a85353-0af7-28e1-7d00-625b375cc3f2.png)
こちの方がシンプルですし、Api Gatewayの制限がめちゃめちゃ楽なので気にしなくて良い！

### Api gatewayのRest Api作成

まずはApi Gatewayが色々のシステム出来ます、httpsやLambda向けだったらHttp APIを使っても良いですがもっとコントロール欲しいになったらRest Apiが一番カスとマイズ出来ますので今回はそっしき行きました。

![Screen Shot 2022-12-09 at 15.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/84cf7a2f-37a7-1656-ac2a-2facf9ada941.png)

一旦Apiを作成します。作成したらからの画面にリダイレクトされます：

![Screen Shot 2022-12-09 at 15.54.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/0d6977a7-51c7-5b25-b0f3-dd5d3773cb17.png)

画面のトップとしてapiの名前とエンドポイントが表示されます。

流れとしては「リソース」を作成して、そのリソースに「メソッド」を作成します。

```
「Api Gatewayのエンドポイント」/「リソースA」/ 「リソースB」。。。
```
それで「リソースA」に対して「メソッドA」が対応してますなどなど！

でもリソースを作成するためにIAMロールが必要ですので説明します。

#### IAMの作成

このIAMがなにが必要と言われたら、S3の権限とApi GatewayのログをCloudwatchに連係する。
![Screen Shot 2022-12-09 at 15.53.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/7f9a692d-d57a-7828-5e42-1159c052d799.png)
`AwsS3readonly`もありますがいずれファイルアップロードも欲しくになりそうなので`AmazonS3FullAccess`を付けてます。`AmazonAPIGatewayPushToCloudWatchLogs`も追加してたらもっと管理がしやすくになります。

そのロールを追加終わったらエンドポイントをどっかに保存した方が良い、割と使います。

ほぼ準備終わりましたので作成のフェーズに行きます！

#### リソースの作成

まずはリソースを作成します：

![Screen Shot 2022-12-09 at 16.09.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/d25ef84b-6230-f94b-9dfc-4df360a71f58.png)

* リソース名
* リソースパス

そんなに登録する情報が少ないですが重要です！もちろん簡単のデータを入れれます、リソース名とパスを`index`にして、URLが`Api Gatewayエンドポイント.com/index`になります。
でももっと面白いがこれです：
```
* リソース名：item
* リソースパス：{item}
```
なんで`{}`を使った？付けたらこの情報をメソッドに使えます！そう使うとURLが`Api Gatewayエンドポイント.com/{バリュ}`になりますのでつながるデータが違うになります！

:::note warn
APU Gateway CORSをチェックしてください！
:::
パスはもう大丈夫だったら一番面白い部分になります、メソッドの作成です！

#### メソッドの作成

`/{item}`を選択して、アクションのメニューにメソッドの作成をクリックしてみます。
![Screen Shot 2022-12-09 at 16.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/54a299af-e1da-14e3-5896-38c03f5cf4d2.png)
![Screen Shot 2022-12-09 at 16.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/e77c5785-80d0-70b2-1df0-006e8e4c55dd.png)
追加されたselectインプットをメソッドにGetを選べますとチェックマークにクリックするとデフォルトの設定画面を見えます：
![Screen Shot 2022-12-09 at 16.24.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/3675962f-95f9-7240-87b7-e630d4f4eb9d.png)

今回やろうとしてますはS3連係なのでこういう設定が良い：

| ラベル | 質力 |
|:-:|:-:|
| 統合タイプ   | AWS サービス  |
| AWS リージョン  | 自分のリージョン  |
| AWS サービス  | Simple Storage Service (S3)  |
| AWS サブドメイン  | (空)  |
| HTTP メソッド  | GET  |
| アクション名の使用  |  パス上書きの使用 |
| パス上書き (省略可能)  | 自分のバケットの名前/{item}  |
| 実行ロール  |  さっき作られたIAMのロール |
| コンテンツの処理  | パススルー  |
| デフォルトタイムアウトの使用  | そのままで  |

最後はそうに見えるはず
![Screen Shot 2022-12-09 at 16.34.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/00785fdc-36dc-4733-d83b-e922ede3996a.png)
無事に作成出来ましたらこの画面を見えます！
![Screen Shot 2022-12-09 at 16.37.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/36960f30-c02a-5055-024e-51b9873d2fb9.png)

「メソッドリクエスト」と「メソッドレスポンス」が入れ口と出口、「統合リクエスト」と「統合レスポンス」がファイルに対してのインプットとアウトプットです。
パス上書きが一番重要です！パラメーターの流れを説明します、まずは「メソッドリクエスト」をクリックします、設定画面の「リクエストパス」をクリックして、「item」があるを確認する：
![Screen Shot 2022-12-09 at 16.42.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/d7fc022b-7737-e125-3614-fb540e8e4f6a.png)
無事に設定されてれば良い！
次は「メソッドの実行」を戻って「統合リクエスト」をクリックします。この画面はさっき作成じた情報を見えますと変更できますが今回は「メソッドリクエスト」と「統合リクエスト」を連係しなきゃ。「パス上書き」に{item}ありますが、どこの情報はまだマッチングしてませんのでそれをやりましょう！下に「URL パスパラメータ」をクリックします：

![Screen Shot 2022-12-09 at 16.47.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/11149ad5-73d3-b1a2-e2b4-c3190702ffe7.png)

情報としては「item」が「method.request.path.item」メソッドからきましたを書きます！チェックマークをクリックしたら無事に「メソッドリクエスト」と「統合リクエスト」がマッチングされてます！URLの{item}がやっとS3のファイルになってるはず！速攻にテストしましょう！
「メソッドの実行」の画面に戻して、左の「テスト」をクリックします、S3にあるファイル名を「パス」の「{item}」を書いて、テストのボタンをクリックしたら「ステータス: 200」を見えるはず！
![Screen Shot 2022-12-09 at 16.51.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/a1fda3c6-ffcc-20af-be61-dd99e2b99787.png)

右のログに色々いい情報もあります！
```bash:ApiGatewayがアクセスしてるファイルのパス
Endpoint request URI: https://s3.ap-northeast-1.amazonaws.com/redirect.me/index.html
```

それで無事にファイルをアクセスできます！

#### S3のリダイレクト

一番簡単ファイルアップロードはAWS APIを使います：

```bash
aws s3api put-object --bucket redirect.me --key qrcode1.txt --content-type "text/html" --website-redirect-location "https://google.com"
```
:::note
パラメーターの説明：
* --bucket : S3のバケット名
* --key : S3のファイル名（パスも入れられます）
* --content-type : "text/html"のままで
* --website-redirect-location : リダイレクト先のサイト
:::
![Screen Shot 2022-12-09 at 17.31.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/c914cddf-f4e1-3920-2eb8-bb33845d97f0.png)
こんな感じに見えます！

S3のファイルを確認すると：
```bash
$ curl -i https://s3.ap-northeast-1.amazonaws.com/redirect-analytics.metaps.com/qrcode1.txt
HTTP/1.1 200 OK
Date: Fri, 09 Dec 2022 08:39:04 GMT
Last-Modified: Fri, 09 Dec 2022 08:36:31 GMT
ETag: "d41d8cd98f00b204e9800998ecf8427e"
x-amz-website-redirect-location: https://www.google.com
Accept-Ranges: bytes
Content-Type: text/html; charset=utf-8
Server: AmazonS3
Content-Length: 0
```
`x-amz-website-redirect-location`パラーメータがリダイレクト先です！

じゃ、S3もファイルありますし、Api Gatewayもアクセス出来るようになったので次は Api Gatewayでリダイレクトを設定しましょう！

#### Api Gatewayのリダイレクト方法

リダイレクトは割と簡単ですね、301のステータスコードとヘッダーの中で「Location」のパラメータあればなんとかできます。

まずはレスポンスコードをみましょう！Api Gatewayの設定を戻りますと「メソッドレスポンス」をクリックします。

![Screen Shot 2022-12-09 at 17.47.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/7e34fca0-912e-b6fa-3d3e-b34176cf5650.png)
デフォルトは200のレスポンスコードしかないです。今回はリダイレクトとnot foundしかないので200を削除して、301と404を設定します：
![Screen Shot 2022-12-09 at 17.48.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/4a20a32a-7c2c-8d9b-b135-5d2ad14ab096.png)
404は普通のファイルを見つかりませんでした設定ので追加はありません。
301はリダイレクト先の設定をしなきゃので「301」の左をクリックして、「301 のレスポンスヘッダー」の中に「ヘッダーの追加」して、`Location`と`Content-Type`を追加します
![Screen Shot 2022-12-09 at 17.51.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/de7e4a8e-8b54-8832-54e0-869384524164.png)
それでApi Gatewayがそのパラーメータを返せるけどまだどのデータは分かりませんので「統合レスポンス」の設定がマッピングしてます！

統合レスポンスの画面設定をクリックして、さっきと一緒で200を削除します！「統合レスポンスの追加」ボタンをクリックして301と404の設定をします。301はデフォルトにしますので「HTTP ステータスの正規表現」はデフォルトで空が良いです。
![Screen Shot 2022-12-09 at 17.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/fb3cb3e7-990f-2ff2-720e-2b1530e80f81.png)
404の設定はちょっと違って、デフォルトは301の仕事なので404は`4\d{2}`にします、それだと401や404が帰ってきたら全部404になります。
![Screen Shot 2022-12-09 at 17.57.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/c82a304c-1667-c3be-91b3-16b8ad265f9e.png)
設定終わったらもう一回301をクリックして、「ヘッダーのマッピング」を表示します。![Screen Shot 2022-12-09 at 17.58.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/29af3ee2-483d-3f4e-1aff-b83a5ef226e9.png)
さっき設定した「Location」と「Content-Type」が表示してますがマッピングが空っぽですのでマッピングしましょう！
Content-Type :`'text/html; charset=utf-8'`
Location : `integration.response.header.x-amz-website-redirect-location`

さっきのcurl結果と一緒でレスポンスのヘッダーの`x-amz-website-redirect-location`をすれば、S3のファイルの設定をいけます！

#### 最後のテスト

それぞれの設定を終わったらテストをしましょう！テストの画面に戻って、さっきのファイルを名前書いて、レスポンスを確認しましょう！
![Screen Shot 2022-12-09 at 18.08.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878226/0f444f2f-4fb4-1855-0ca3-032c9e63ee34.png)

ステータスを301を確認できます！レスポンスヘッダーの中も
```
Fri Dec 09 09:03:05 UTC 2022 : Method response headers: {X-Amzn-Trace-Id=Root=1-6392f9c9-177725437d6471d2757b6d34, Content-Type=text/html; charset=utf-8, Location=https://www.google.com}
```
それでAPI GatewayとS3の0byteファイルを無事にリダイレクト出来ます！

次回はACMとApi Gatewayとroute 53の連係を説明します！