API Gatewayのプロキシ統合について調べてみた

# はじめに
社内のエニプラボという活動の中でアプリ開発を行っており、私はインフラ構築を担当しました。コーディングの経験を積む、ということが活動の目的であったため、AWSリソースをコードで構築できるTerraformというツールを使いました。

コーディングの経験を積むということで、まずは動かすこと最優先に試行錯誤をしていました。そのため、プロパティの意味を理解しきれていない中で進めていた箇所もあったため、追って理解するため、調べて備忘録としてまとめていこうと思います。
API Gatewayのプロキシ統合の設定項目が構築で特に詰まったため、プロキシ統合にまつわる各設定項目を調べてみました。

# プロキシ統合
プロキシ統合を含む、API Gatewayの基本的な概念についてはこの記事がとてもわかりやすかったです。

https://zenn.dev/fdnsy/articles/86897abce0bbf5

プロキシ統合にまつわる設定項目として、メソッドリクエスト、統合リクエスト、メソッドレスポンス、統合レスポンスという一連の流れがあります。
以下ではそれぞれの設定項目を確認していきます。

## メソッドリクエスト
リクエストパラメータやリクエストヘッダーなど、リクエストについてのルール設定等を指定しているようです。
今回はまず最小限のAPIを組む、という目的で進めていたので、細かいルール設定などを気にしないこととしていたので、最低限リクエストパラメータを指定する以上は設定しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329734/4b839b15-93f2-3d7a-5462-8ca385de77f2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329734/3db9ccff-4d5f-5208-b9d0-ce4e16933225.png)
## 統合リクエスト
リクエストをLambdaに引き渡すにあたってjsonに展開しているようです。
パスパラメータがjsonに展開されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329734/84042c49-e84a-ae9f-f251-d7cac9ff85ca.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329734/15d931a4-5572-6f6f-f53c-80afdf893bd3.png)
## メソッドレスポンス
HTTPステータスコードに対してヘッダー名とレスポンス本文の設定項目があります。
各ステータスコードに対して中に何を詰めて返すかが設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329734/78e51052-b3ae-5f7c-971d-e5d5bc795c83.png)
#### レスポンスヘッダー
ステータスコードよりも詳細な情報を伝えたいときに使う項目です。
ここを設定することで、レスポンスヘッダーでこの情報は返す、この情報は返さないを設定することができます。
今回の場合、ステータスコードに加えてAccess-Control-Allow-Originという情報を返そうとしている、という意味になります。（Access-Control-Allow-Originは「統合レスポンスに関連して調べたため、そこで後述します。）
#### レスポンス本文
レスポンス本文はコンテンツタイプとモデルの組が設定できます。
コンテンツタイプについてはこの説明がわかりやすいです。
> サクっと一言で説明すると
> 「ファイルの種類を表す情報」が書いてある項目
> が「Content-Type」です。

https://wa3.i-3-i.info/word15787.html

今回の場合だとapplicationに分類されるjsonファイルが入っている、ということを表現しているようです。


## 統合レスポンス
Lambdaからのレスポンスを先ほど設定したメソッドレスポンスに起こす部分のようです。
メソッドレスポンスで決めたレスポンスヘッダに実際に値を設定したりしています。
ここでヘッダーのAccess-Control-Allow-Originに「*」を設定していたのは、参照したドキュメントでそのように設定されていた、というためで理由が特にありませんでした。異なるオリジンからのアクセスを許可するかの設定で、この場合はどのオリジンからもアクセスできるように設定していました。
この設定についてはアプリからAPIを叩くためにどのような設定をすべきか、というところになってくるので、これからの段階で調べを進めて決めていこうと思います。

https://developer.mozilla.org/ja/docs/Web/HTTP/CORS

https://qiita.com/naogify/items/e1f28a00741ba628c186

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3329734/5f9a5907-6d9b-6625-d8e3-a8d980252cb1.png)
~~~terraform
resource "aws_api_gateway_integration_response" "integration_response" {
  rest_api_id = aws_api_gateway_rest_api.api.id
  resource_id = aws_api_gateway_resource.api_gateway_resource.id
  http_method = aws_api_gateway_method.method.http_method
  status_code = aws_api_gateway_method_response.response_200.status_code
  response_parameters = {
    "method.response.header.Access-Control-Allow-Origin" = "'*'"
  }
  depends_on = [
      aws_api_gateway_integration.integration
  ]
}
~~~
# 終わりに
備忘録程度の内容になったのですが、自分が何をしているのか、何をしようとしていることになっているのかの理解は進んだと思います。さらに理解を進めるにはインフラの領域により踏み入ることになりそうです。
AWSの範囲だけでなく、関連する概念も含めて引き続き理解を進めていきたいと思います。

# 参考
https://developer.mozilla.org/ja/docs/Glossary
https://wa3.i-3-i.info/index.html