プライベートAPI Gatewayでプライベートサブネット内の Fargate API をコールする

#はじめに
こんにちは、山田です。
今回はAPI Gateway、Fargateについて検証したので記載していきます。

#全体構成図
全体構成図は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/f77d8b6e-b754-50eb-ed92-478cfcd57c45.png)

**①：パブリックサブネットに配置しているEC2に接続する。
②：VPCエンドポイントを介して、API Gatewayに接続する。
③：API GatewayからVPC linkを介してNLBに接続する。
④：Fargateにてタスクを実行する。**

#前提条件
今回は、VPCエンドポイント、APIgateway、VPC link 、NLB、Fargateの構築をメインに記載していきます。
その他のAWSリソースに関しては、構築済みとします。

#VPCエンドポイントの構築
以下にVPCエンドポイントの構築手順について記載していきます。

##
AWS管理コンソール -> VPC -> エンドポイント -> エンドポイントを作成をクリックします。
名前、関連付けるVPCを入力し、サービスは以下を選択し作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/af4365b1-cae1-0d3c-e994-4d333746f1d3.png)

#NLB構築
AWS管理コンソール -> EC2 -> ロードバランサー -> ロードバランサーの作成をクリックします。
タイプはNetwork Load Balancerを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/ff656557-ab16-954c-8ae1-8d09806a4325.png)

名前を入力し、Schemeは`Internal`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/296304e9-b1e0-8591-352b-62f8cdc95418.png)

関連付けるVPC、サブネットを選択しロードバランサーを作成します。
※ターゲットグループに関しては後ほど作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/8640369c-7da9-9263-d0ca-dd09fc036e2c.png)

#Fargateの構築
以下Fargateの構築手順を記載していきます。

##クラスターの作成
AWS管理コンソール -> ECS -> クラスター -> クラスターの作成をクリックします。
クラスターのテンプレートはネットワーキングのみを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/e592b7a2-5129-a5e3-4735-0ac5b311b595.png)

クラスター名を入力して作成します。

##タスク定義の作成
AWS管理コンソール -> ECS -> タスク定義 -> 新しいタスク定義の作成をクリックします。
起動タイプは`FARGATE`をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/7513fd88-99f3-b504-fcd8-e1115c7e2b32.png)

タスクの設定を以下のように入力しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/0ada8316-d712-9f6d-edfa-51e9b48b28c6.png)

IAMロール、サイズを入力したらコンテナを追加をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/185eef80-6938-b9cd-8557-5eb9fb3ae342.png)

コンテナ名を入力し、イメージのURLを入力します。
今回は、コンテナポートは80番とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/e93a1716-d352-70b7-f53e-4b65c65859f9.png)

他はデフォルト値とし、作成をクリックします。


##サービスの作成
対象のクラスター -> サービス -> 作成をクリックします。
サービスの設定を以下のように入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/8d9c32dc-f664-5d9b-342c-fd27525f51e8.png)

関連付けるVPC,サブネットを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/486e67f8-6ec6-682e-a5d7-4da83144586f.png)

ロードバランサーは、作成したロードバランサーを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/68dfde12-1e0b-6d0f-e0a6-bae5d879d850.png)

ロードバランス用のコンテナを新規で作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/10850c09-c2cd-9a37-9a35-a8b9e5aea697.png)

他はデフォルト値で、サービスを作成します。

#API Gatewayの構築

##VCPリンクの構築
AWS管理コンソール -> API Gateway -> VPCリンク -> Createをクリックします。
VPCリンクバージョンは`REST APIのVPCリンク`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/83debc0d-c44d-13f1-38e3-0de073f1d86f.png)

名前、関連付けるNLBを選択して作成をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/27d1be88-df5a-4e36-90e5-5f9c955a6af0.png)

##APIの構築
AWS管理コンソール -> API Gateway -> API -> REST API プライベートをクリックします。
API名を入力し、エンドポイントタイプはプライベートとし、VPCエンドポイントIDは先ほど作成したエンドポイントのIDを入力します。
APIの作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/845f031c-ef14-edcc-0b3e-4767a3bb8ef3.png)

APIにGETアクションを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/527460de-efa9-767c-d10b-6641d122dffe.png)

セットアップにて、統合タイプはVPCリンク、VPCリンクは先ほど作成したVPCリンクを選択、エンドポイントURLはNLBのDNS名を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/e9366dea-bc6e-519e-53ca-6080bacdbab8.png)

リソースポリシーを編集します。
今回はホワイトリスト形式で記載していきます。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "execute-api:Invoke",
            "Resource": "arn:aws:execute-api:ap-northeast-1:<account id>:<api id>/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "許可するIPリスト"
                }
            }
        }
    ]
}
```

メソッドレスポンスを変更しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/d0b32ca0-2ab7-af90-0e8a-b299dd9fa7a6.png)

APIをデプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/6a7c81f6-432e-6252-f09a-e87cb4aff1f7.png)

デプロイが完了したらGETアクションに記載されているURLに接続していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/1d6c08d7-f5e9-5c23-76f3-f08a25764d76.png)

#動作確認
パブリックサブネットに配置されているEC2に接続します。
ブラウザにてURLを入力し,問題なくページが表示されれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/de070321-54b7-21e7-5ea3-dacc1f8ce796.png)