App Runner新機能でVPCリソースを利用してみた

はじめに

AWS App Runnerとは

AWS App Runner は、コンテナ化されたウェブアプリケーションや API を開発者が簡単かつ迅速にデプロイできるフルマネージド型サービスです。大規模に、しかも事前のインフラ経験を必要とせずにデプロイすることができます。ソースコードからでも、コンテナイメージからでも始められます。App Runner は、ウェブアプリケーションを自動的に構築してデプロイし、暗号化を利用するトラフィックの負荷を分散し、トラフィックのニーズに合わせてスケールし、お客様のサービスがプライベート Amazon VPC で実行される他の AWS のサービスやアプリケーションと簡単に通信できるようにします。App Runner を使用すれば、サーバーやスケーリングについて煩わされることもなく、アプリケーションに集中できる時間が増えます。
(AWS App Runner)

特徴として下記が挙げられます。

  • コンテナ動作環境のフルマネージドサービス
  • Amazon ECRへのPushをトリガーにBlue/Green方式で安全にデプロイされる
  • イメージのビルドなども含めたCI/CDを利用できる(一部言語のみ)
  • VPCなどのインフラリソースを気にせずにコンテナをデプロイできる

VPCリソースとの接続について

AWS App Runnerは、VPCなどのインフラリソースを気にせず利用できる反面、リリース当時はプライベートなVPCリソース(プライベートサブネット内のAmazon RDSなど)と接続できないという制約がありました。そのため、Webアプリケーションをデプロイする際にはDynamoDBやパブリックアクセス可能なRDSのなどを利用する必要がありました。

その制約が2022/02/08のアップデートにて、「VPCコネクタ」というリソースを作成することでプライベートサブネットへアクセス可能になり、App Runner上で展開できるアプリケーションの幅が広がりました。

App Runner の新機能 — Amazon Virtual Private Cloud (VPC) をサポート

今回は実際にVPCコネクタを作成してプライベートサブネット内のAmazon RDSをApp Runnerから利用してみたいと思います。

サンプルアプリケーション

今回作成するのは、画像とテキストのセットでアップロードできる、簡易日記アプリのバックエンドAPIです。
システム構成図は以下のようになります。

VPC/RDSの準備

VPC・サブネットを作成します。
RDS用にプライベートサブネットを2AZに作成しておきます。

RDSはプライベートサブネットに配置し、外部から直接アクセスしないようにします。

セキュリティグループの作成

App RunnerからVPCにアクセスするために、「カスタムVPCコネクタ」というものを作成する必要があります。
その際、コネクタにSGをアタッチすることになるため、あらかじめ作成しておきます。

インバウンド/アウトバウンド のルール設定は特に必要ありません。

また、RDSのSGのインバウンドを修正し、カスタムVPCコネクタのSGからアクセスできるようにしておきます。

IAMロールを作成

App RunnerからS3にアクセスするため、必要なポリシーがアタッチされたロールを作成します。
AWSサービスのユースケース一覧には2022/05/27現在、App Runnerが表示されないため、カスタム信頼関係ポリシーから、下記のように設定してください。

デプロイするアプリケーションを作成

今回のアプリケーションはGolangを利用し、echo + gormでサクッと作成しました。

▼ソースコード
▼Dockerfile

簡略化のため、DBへの接続情報は全て環境変数から取得していますが、本番利用する際はSystem Manager ParameterStoreSecrets Managerなどから取得するようにしたほうがセキュリティの観点では良いでしょう。

App Runnerにアプリケーションをデプロイ

ECR リポジトリを準備

Amazon ECRにプライベートリポジトリを作成します。

「プッシュコマンドの表示」を開いておきます。

ECRへイメージをプッシュ

表示されているコマンドを上から順に実行し、ECRへイメージをプッシュします。

App Runner にサービスを作成

App Runnerにサービスを作成します。

今回は

  • コンテナレジストリ
  • Amazon ECR

を利用します。

先程準備したECRリポジトリを選択します。

スペックと環境変数を設定します。

「セキュリティ」を開き、あらかじめ作成しておいたインスタンスロールを選択します。

「ネットワーキング」を開き、「カスタムVPC」を選択します。
ここで、今回の目玉であるVPCコネクタを新規追加します。

対象VPC/サブネットを選択し、セキュリティグループはあらかじめ作成しておいたものを選択します。

VPCコネクタを追加できたことを確認し、「次へ」をクリックします。

構成を確認し、「作成とデプロイ」をクリックします。
作成には数分かかります。

動作確認

POST

エンドポイントにアクセスして、まずはテキストのみ送信してみましょう。

良さそうですね!

GET

データの取得をしてみます。

ちゃんとRDSへアクセスしてデータの読み書きができていますね!!

POST(画像あり)

次は画像をセットで送信してみましょう。

エラーが出てしまいました。
ログを確認すると、S3エンドポイントへのアップロードがタイムアウトしているようです。

注意点

VPC に接続すると、AppRunner サービスからすべてのアウトバウンドトラフィックが VPC ルーティングルールに基づいてルーティングされます。NAT ゲートウェイへのルートで許可されない限り、サービスはパブリックインターネット (AWS API を含む) にアクセスできません。また、Amazon Simple Storage Service (Amazon S3)や Amazon DynamoDB などの AWS API に接続するように VPC エンドポイントを設定して、NAT トラフィックを回避することもできます。
(App Runner の新機能 — Amazon Virtual Private Cloud (VPC) をサポート)

カスタムVPCコネクタを作成した場合、App Runnerアプリケーションからの全てのアウトバウンド通信が、VPCを経由して送信されます。
今回、S3への画像アップロードはアプリケーションから実施しているので、プライベートサブネットからS3にアクセスできなかったと考えられます。

S3へ接続するためにVPCエンドポイントを作成するため、構成図は下記のようになります。

VPCエンドポイントを作成

プライベートサブネットから利用できるVPCエンドポイントを作ります。

再度確認

今度はうまく動きました!

まとめ

今回はAWS App Runnerのアップデートで追加されたカスタムVPCコネクタを利用して、VPCリソースのアクセスを検証してみました。すべてのアウトバウンド通信がVPCへ流れるので、VPC外リソースへのアクセスが必要な場合は、VPCエンドポイント or NAT Gatewayが必要になりますので、実際に利用する際はご注意ください。

Amazon RDSと組み合わせて利用したいという要望は多かったと思うので、このアップデートでかなり利用しやすくなったかと思います。コンテナ環境が手軽に扱えるようになるのはとてもよい更新ですね!
個人的にはあと、AWS WAFとの連携ができるようになると一層使いやすくなるのではないかなと思っております。(apprunner-roadmapにも要望は上がっているので、いつか対応するかもしれません)

AWS App Runnerを含む、コンテナ基盤の導入を検討、お困りのお客様、是非スカイアーチネットワークスまでご相談ください!

投稿者プロフィール

takumi
takumi
AWSのサーバレス構成を中心に構築業務に携わっております

ABOUTこの記事をかいた人

AWSのサーバレス構成を中心に構築業務に携わっております