API Gatewayのカスタムドメイン設定で躓いたお話




# はじめに
みなさま，はじめまして．
[株式会社オプティマインド](http://www.optimind.tech)にて，GISエンジニアをしている@tkmbnです．
Qiitaへの2回目の投稿です．


# 概要
SAMを用いてデプロイしたアプリケーションの，AWS API Gatewayカスタムドメインにおけるマッピングの設定方法についてまとめました．



# なぜ書いたか
「開発環境でデプロイもできたし，次は本番や！」と思っていた矢先，CloudFormation上でエラー．．．
どうやら，マッピングの設定でエラーを吐いていた模様．．．
公式ドキュメントなどをさらってみましたが，解決方法が見つからず，試行錯誤でトライしていた際に無事原因がわかったので，備忘録として書き記します．

# 本題
## 現状の環境
- SAM テンプレートの内容
    - API Gateway
        - カスタムドメインは，別途設定済み
            - エンドポイントタイプ：エッジ最適化
            - 最小TLS：1.0
        - 適用しようとしたマッピングは，`xxxx/v1` というように，階層をもたせようとした
    - Lambda
        - 今回の話では，中身は関係ないので，割愛します．

## 何が問題だったのか
### 試行錯誤1 エンドポイントタイプの設定
カスタムドメインには，エンドポイントタイプの設定が存在し，それぞれ以下のような特徴があります．（[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-endpoint-types.html)より抜粋）


>- エッジ最適化
    - 地理的に分散されたクライアントに最適です。API リクエストは、最寄りの CloudFront POP (Point Of Presence) にルーティングされます。これは、API Gateway REST API のデフォルトのエンドポイントタイプです。
>- リージョン
    - 同じリージョンのクライアントを対象としています。EC2 インスタンスで実行されているクライアントが同じリージョンの API を呼び出す場合、または API が要求の高い少数のクライアントへのサービスを目的としている場合、リージョン別 API は接続のオーバーヘッドを減らします。
>- プライベート
    - Amazon Virtual Private Cloud (VPC) からしかアクセスできない API エンドポイントです。

当初，`エッジ最適化`として，エンドポイントタイプを設定しておりました．
API GatewayのマッピングをSAMテンプレート内で設定を行う際，CloudFormationの`AWS::ApiGateway::BaseMapping` か `AWS::ApiGatewayV2::ApiMapping` のどちらかを使用することになります．
エッジ最適化の場合，`AWS::ApiGateway::BaseMapping`を使うしかないようですが，マッピングのパスに`/`を入れることが不可能で，適用時にエラーを吐きます．`AWS::ApiGatewayV2::ApiMapping`だと，可能な感じ．

![Screen Shot 2022-02-25 at 11.08.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285596/a35a40c9-5c63-0394-2896-794e3df68175.png)
```
API Gateway V1 doesn't support the slash character (/) in base path mappings. To create a multi-level base path mapping, use API Gateway V2. (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException; Request ID: xxxxxx-xxxx-xxxxxxxxxxxxxx; Proxy null)
```


ということで，
`AWS::ApiGatewayV2::ApiMapping`を利用するため，エンドポイントタイプを`リージョン`に変更しました．


### 試行錯誤2 TLSの設定
エンドポイントタイプもリージョンにし，リソースタイプも`AWS::ApiGatewayV2::ApiMapping`に変更し，
満を持して，再デプロイ！と思いきや，再びエラー・・・

![Screen Shot 2022-02-25 at 11.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285596/5ff7dd29-a48b-6799-55fc-864c78bd9359.png)
```
Invalid character '/' detected in the ApiMapping key. If you are trying to create a multi-level ApiMapping, update your custom domain name to security policy TLS 1.2. (Service: AmazonApiGatewayV2; Status Code: 400; Error Code: BadRequestException; Request ID: xxxxxx-xxxx-xxxxxxxxxxxxxx; Proxy null)
```

当初デプロイしたときは，このようなエラーが出てくませんでした（謎．．．）が，
別環境ですべての設定を合わせてトライしたところ，このようなエラーが出てきました．

最小TLSが`1.0`の場合も，どうやら`/`をマッピングに入れることができないみたいです．

`1.2`に変更したところ無事にデプロイ，マッピング適用することができました…！


# まとめ
カスタムドメインの設定及びマッピングで躓いた点をまとめてみました．
カスタムドメインで，階層を持ったマッピングを行う場合は，
- エンドポイントタイプ → リージョン
- 最小TLS → 1.2
- リソースタイプ → AWS::ApiGatewayV2::ApiMapping
とする．

困っている方の手助けになれば，幸いです．
最後まで読んでいただきありがとうございした．
なにか疑問点，間違っている点，等ございましたら，コメントお願いいたします．


# 最後に宣伝

株式会社オプティマインドでは、一緒に働く仲間を大募集中です。
カジュアル面談も大歓迎ですので、気軽にお声がけください。

【エンジニア領域の募集職種】
●[ソフトウェアエンジニア](https://hrmos.co/pages/optimind/jobs/0002012)
●[QAエンジニア](https://hrmos.co/pages/optimind/jobs/0002011)
●[Androidアプリエンジニア](https://hrmos.co/pages/optimind/jobs/0002008)
●[組合せ最適化アルゴリズムエンジニア](https://hrmos.co/pages/optimind/jobs/0002013)
●[経路探索アルゴリズムエンジニア](https://hrmos.co/pages/optimind/jobs/0002014)
●[バックエンドエンジニア](https://hrmos.co/pages/optimind/jobs/0002015)
●[インフラエンジニア](https://hrmos.co/pages/optimind/jobs/0002016)
●[UXUIデザイナー](https://hrmos.co/pages/optimind/jobs/0002010)

【ビジネス領域の募集職種】
●[セールスコンサルタント](https://hrmos.co/pages/optimind/jobs/0002001)

『オプティマインドってどんな会社？』については、[こちら](https://www.optimind.tech/recruit/)から
Wantedlyでも[こちらで募集中](https://www.wantedly.com/companies/optimind/projects)



# 参考文献
- [公式ドキュメント(API Gateway API に対してセットアップするエンドポイントタイプを選択する)](https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-endpoint-types.html) 

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-api-endpoint-types.html

- [Qiitaで簡単に記事を書くためのフォーマット(@kenseitogari1 )](https://qiita.com/kenseitogari1/items/1dcf4328d54e9f2c087c)

https://qiita.com/kenseitogari1/items/1dcf4328d54e9f2c087c