AWS App Runner内からインターネットに通信
App Runnerでさくっとサービスを起ち上げられるのは便利。
しかしサービス作成時に送信ネットワークを「カスタム VPC」にしていた。これはこれでいいのだが、このままだと、App Runnerからインターネットに通信ができない。
早速、サービスからSlackのAPIを叩くことができなくてハマったので、メモっておく。
AsIs

このとおり、NATもないため「App Runner」からはインターネットに出ることができません。
カスタムVPCは、App Runnerを作成する時に作り、上記A〜Cの3つのサブネットマスクと、専用のセキュリティ・グループを作成して紐づけています。
セキュリティグループのポリシーは、インバウンドは何も定義なし。アウトバウンドは全て許可にしてあります。

NATを用意する

こんな感じで、サブネットAにNATを「パブリック」で設置します。
Public Subnetのルーティングテーブルの作成
Public Subnetように「routing table」を1つ作成し、Public Subnet Aを明示的に関連付けます。

この設定により、「Public Subnet A」内のインスタンスは IGW経由でインターネットにアクセスができるようになります。
Private Subnetのルーティングテーブルの設定
次に、Private Subnetように、もう一つ「routing table」を作成し、サブネットBとCを関連付けます。

ポイントは、以下です。
- NATの存在するPublic Subnetは、デフォルトゲートウェイ(0.0.0.0)を、「igw」にする。
- その他Private Subnetは、デフォルトゲートウェイを、「nat」にする。
こんな感じになります。

まとめ
これにより、全てのサブネットからインターネットに出ることが出来ます。各サブネットに、パブリックIPを振らないEC2インスタンを設置して、外部にCurlできることが確認できました。
また、この3つのサブネットに、カスタムVPC経由で接している、App Runnerからも外部APIコールが可能となりました。
課題
開発上、頻繁にApp Runnerにデプロイをするのですが、その際「外部にアクセスできなくなる」状況が発生しています。
- 各EC2からは問題なく外部アクセス出来ているので、ルーティングの問題ではない。
- App Runnerを再起動すると、外部接続出来るようになる。
引き続き調査が必要ですが、インフラ系だと開発と違い、クセや時間等も考慮した上で、再現性を確立させる必要が有るため、パターンを見出していきたいと思います。
もし、同じ様なハマり方をしている方や、解を持っている方がいましたら是非ご連絡いただけると嬉しいです!