AWS App RunnerのカスタムVPC対応され、VPCリソースにアクセスできるようになった

# 速報
* 2022/2/9にAWS App Runnerのアップデートが飛び込んできました。！
https://docs.aws.amazon.com/apprunner/latest/relnotes/release-2022-02-08-vpc.html
* 待ちに待った、App RunnerのカスタムVPC対応で、これにより今までできなかったVPCリソースに対しアクセスできるようになります。

## AWS App Runnerとは
* AWS App Runnerについては[こちら](https://qiita.com/yoshii0110/items/ec209712cafa7547c680)の記事にまとめているので、詳細を知りたい方は、見ていただければと思います。
* 要約すると、ECS/Fargateをもっと楽に運用したいし、気軽に作ったアプリをデプロイしたいよねって時に使える最強サービスです。
* 利用ユーザとしては、ECR上に作成したアプリのimageをpushすれば、そこから先、Codebuildを利用し、App Runnerがマネージドで管理しているfargate上にDeployまでを自動で行ってくれます。
* また、ALBやVPCの設定も今まではマネージドでやってくれたので、マネコンからぽちぽちするだけでwebアプリのデプロイができてしまうというサービスですね。
** ただ、昨日までは欠点があり、VPCをマネージドで管理してくれるので、VPCを使うサービス、例えはRDSなどに対してのアクセスができない/経路が無いという問題がありました。**
* なので、利用者は例えばVPCを使わないDynamoDBとかをデータストアとしアーキテクチャを組まないといけなかったのです。

### まあそんな課題も今日までさ！！
* **今日のアップデートでApp Runnerに対しカスタムVPCが設定できるようになったので、この問題が解消されたのです。**

* 仕様としては、AWS App Runnerを使用してVPCからVPCを介してサービスのアウトバウンドトラフィックをルーティングできるようになりました。
* 主な利点の1つは、その為サービスがプライベートVPCでホストされている他のアプリケーションまたはAWSのサービスと通信できるようになったということです。
* 設定方法は、VPCをサービスに関連付けるだけでよく、VPCサブネットとセキュリティグループを指定すると、App RunnerがVPCへの必要な接続を自動的にプロビジョニングおよび管理してくれます。

## やってみよう1(プライベートなEC2に対するアクセス)
こちらのやってみよう1の検証は、[クラスメソッドさんの検証](https://dev.classmethod.jp/articles/aws-app-runner-for-vpc/)を参考に行っています。

* 検証としては、特定のセキュリティグループからアクセスできるEC2に対し、App RunnerからPingを送るという内容です。
* 下記のEC2のIPに対しpingを送ります。

    ping -c 3 192.168.3.194

### セキュリティグループの設定
* App RunnerのカスタムVPCに設定するセキュリティグループは、インバウンドルールは設定せず、アウトバウンドのみ許可するようにしています。

![APP Runner検証1](//images.ctfassets.net/ty4sa3csxbr1/6zDqMzJllp1TVh6fKmvLHg/8b253b4517eadaab6fde23fb9fcd69ad/____________________________2022-02-09_13.41.39.png)

* また、接続先のEC2のセキュリティ設定は、APP Runnerに設定するカスタムVPCに設定したセキュリティグループをからの許可をインバウンドルールに設定しています。

![APPRunner検証2](//images.ctfassets.net/ty4sa3csxbr1/5l6PLSIrErRF4cXEVV00A8/0ae966e3999b70ce65aef03a978eaabb/____________________________2022-02-09_13.37.31.png)

### App RunnerのカスタムVPC設定
App Runner側は下記の画面でカスタムVPVの設定をすることができます。

![AppRunner検証3](//images.ctfassets.net/ty4sa3csxbr1/3lUrlH4lB2dDwcu86yMHur/71678d4dd28ce21904f7327000aac3b7/____________________________2022-02-09_13.30.08.png)

### App Runnerを起動させてログをみよう
* 今回、App Runnerで利用したdocker fileはこんな感じですね。

    FROM node:14-alpine
    CMD ping -c 3 192.168.3.194

* まずは、ローカルからEC2に対してping投げてみると、まあエラーになりますよね。

![appRunner検証4](//images.ctfassets.net/ty4sa3csxbr1/1Qx9n7rMvOCq7HDhiXOpNb/1da054434d409d5bc62dc1704b3601b7/____________________________2022-02-09_14.21.35.png)

* 次に上記のdocker fileで作成したcontainerをApp Runner君にデプロイしてもらうとアプリログでpingの結果が確認できます。
ちゃんとVPCリソース内のEC2に対してアクセスできてますね。

![apprunner検証５](//images.ctfassets.net/ty4sa3csxbr1/1lndfOgm9cSzpojyKDesNI/f9082ded524cb32e6b8d3cf4934bb9bb/____________________________2022-02-09_14.20.46.png)

## やってみよう2(APP RunnerにWafをかます)
さてさて、やってみよう1の検証はあくまで、今回のアップデートの確認のためやったのですが、次はこのアップデートでApp Runnerでこういうのもできるんじゃないかというのを検証してみたというものです。

### カスタムVPC対応ができたということは・・？
* 実はApp Runner、もう一つ課題がありそれはALBもマネージドで管理してくれていることです。
* それはそれで素晴らしく、運用面は楽になるのですが、いざApp Runnerを商用サービスで使おうと思うとWAFをかまさないといけないケース(SLAにもよると思うが)があると思います。
* App Runnerでは現在、直接Wafを結びつけることができません。
* なので、もしWafを使いたい場合は下記のような構成を取る必要があるとも言えます。

![apprunner検証7](//images.ctfassets.net/ty4sa3csxbr1/wfGu0RTW7KXKGEfdO3NT1/00915e7b4a038b64000be906421dd90b/____________________________2022-02-09_14.28.38.png)

### さてさて、あれこれでApp Runnerの保護ってできているんだっけ？

* 答えはNoですね。
* App Runnerのドメインが流出したらWafを通過せずにアクセスが来るようになってしまいます。

**じゃあどうするのか**
* 実は先日のこのアップデートを組み合わせると、この問題が解決されます。
https://dev.classmethod.jp/articles/amazon-cloudfront-managed-prefix-list/

このアップデートは、何をしているのかというとCloudFrontを経由しないアクセスのブロックを簡単にできるようになったというものです。

今までは、CloudFrontでカスタムヘッダを付与して、それをALBやWebサーバで検証する方法をしないといけなかったのですが、このアップデートにより特定のVPCのセキュリティグループのインバウンドルールにCloudFrontのManaged Prefix Listsを設定するだけで解決しちゃうというものです。

設定は簡単で、App Runnerに設定したVPCのインバウンドルールにこの設定を入れることで、CloudFront以外からのアクセスを禁止できます。

Cloudfrontの設定ができれば、Wafを噛ませることができるので、全ての問題が解決という話です。

## やってみた
* 設定でVPCのインバウンドルールにcloudfrontのManaged Prefix ListsのIDを入れるだけで完了です。

![App Runner検証6](//images.ctfassets.net/ty4sa3csxbr1/Z0M0mpqxtqw9cEbs5c2c6/e742b1880189f898bca079a62df31b8d/____________________________2022-02-09_15.08.43.png)


**ただ、やってみたが、想定の動きにならない。。**

*　 これはバグなのか、設定が悪いのか、
*　 App Runnerのデフォルトドメインに直アクセスしても、接続できてしまった。
*　 これはどうやら下記が原因のようです。

>VPCコネクタはApp Runnerからのアウトバウンドトラフィック用であり、インバウンドトラフィックには利用できない（イン>バウンドトラフィックは従来どおりパブリックドメイン名からの経路）

# まとめ
* 2日連続で面白いアップデートが行われ、とても興奮しているが、最後の検証が思い通りにいかなかったのが悲しい。