[アップデート] AWS App RunnerでVPC内からのプライベートアクセスが可能になりました

2022.11.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

本日からAWS App RunnerでVPC Endpointを使ったプライベートアクセスができる様になりました。
AWSからのアナウンスはこちらになります。

仕組みについて

これまでApp Runnerはインターネットからの公開アクセス専用でありプライベートアクセスに制限することはできませんでした。
今回のアップデートではユーザーが利用するVPC内部にVPC Endpointを設け、このVPC EndpointからのみApp Runnerのサービスにアクセス可能に通信を制限できます。
ざっくり図にするとこんな感じです。

また従来からあるApp RunnerからVPCへのアウトバウンドアクセスのためのVPC Connectorとも併用可能です。

ネットワーク周りの詳細についてはAWSからブログが公開されてますのでそちらをご一読ください。

料金

App Runnerとしては追加費用は無いのですが、仕組み上VPC Endpointを使うためVPC Endpointの利用費がかかります。

App Runnerで作られるエンドポイントは「インターフェイスエンドポイント」です。
本日時点の東京リージョンであれば以下の料金が発生します。

内容 単価 備考
各エンドポイント(ENI)の利用時間に応じた料金 0.014 USD/時間 単価は1エンドポイント当たりの金額
各エンドポイントの処理データ(In/Out両方) 0.01 USD/GB ~ 0.004 USD/GB 通信量に応じた料金テーブル

やってみた

それでは早速試してみます。

私の検証用AWSアカウントの東京リージョンで試します。
以前作成したサンプルアプリケーションをまだ残しているのでそれを使います。

VPC環境も別途用意していますが、そちらの作成手順は割愛します。

App Runnerサービスの作成

まずは通常通りApp Runnerのサービスを新規作成します。

アプリケーションは以前作成したアプリケーションをECRに登録済みですのでそれを選択します。

次にサービス設定は最低限のスペックにしています。
サンプルアプリケーションは5000番ポートを使う設定にしてるので変更しています。

次に「ネットワーキング」設定を見ると新たに「受信ネットワークトラフィック」欄が増えています。

ここを「プライベートエンドポイント」にするとVPC Endpointの作成画面が表示されます。

「新しいエンドポイントの作成」ボタンをクリックすると作成ダイアログが表示されます。
作成対象のVPCとサブネット、エンドポイント(ENI)にアタッチするセキュリティグループを指定して「作成」ボタンをクリックします。

確認ダイアログが表示されるので「確認」をクリックします。

新しいエンドポイントが作成されればOKです。
今回はVPC Connector(送信ネットワークトラフィック)は作成しません。

なお、VPC Endpoint用のセキュリティグループは事前に作成しておいてください。
VPCからのインバウンドアクセス用ですので「HTTPSのインバウンドアクセスを許可するセキュリティグループ」にします。

その他のパラメーターは今回はデフォルトのまま進めています。
こちらは環境に応じて変更すると良いでしょう。

サービスのデプロイが開始されエラー無く作成されれば完了です。

接続確認

今回はmk4adukzty.ap-northeast-1.awsapprunner.comというホスト名が割り当てられました。
VPC Endpointを作成した場合、このホスト名にはVPC内部のPrivate IPが割り当てられ外部からアクセスできない様になります。

# サービスデプロイ直後は何もIPを返さない
$ dig mk4adukzty.ap-northeast-1.awsapprunner.com +short

# しばらく時間が経つとPrivate IPを返す様になった
$ dig mk4adukzty.ap-northeast-1.awsapprunner.com +short
10.0.22.10
10.0.21.218

(外部からアクセスしても応答しない)

そこでVPC内部にEC2を用意してやり、EC2内部からアクセスしてみます。
結果は下図の様に良い感じにサービスの内容が表示されました。

補足1 : カスタムドメインを指定した場合

補足としてカスタムドメインを設定した場合にどうなるか確認します。
私の個人ドメインexample.shibata.techを使いカスタムドメインを設定してみます。

example.shibata.techドメインはRoute 53で管理しているためエイリアスレコードでApp Runnerのサービス名を解決する様にしています。
結果example.shibata.techのホスト名でPrivate IPを返す様になります。

# Private IPを返す
$ dig example.shibata.tech +short
10.0.22.10
10.0.21.218

EC2内部からexample.shibata.techへアクセスしてやると良い感じに表示できました。

補足2 : VPC EndpointのDNS名を使った場合

さらなる補足として、VPC Endpointは独自のDNS名を持ちます。

当然このDNS名もPrivate IPを返します。

# VPC EndpointのDNS名
$ dig vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx.requests.apprunner.ap-northeast-1.vpce.amazonaws.com +short
10.0.22.10
10.0.21.218

# AZ別のDNS名
$ dig vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx-ap-northeast-1a.requests.apprunner.ap-northeast-1.vpce.amazonaws.com +short
10.0.21.218
$ dig vpce-xxxxxxxxxxxxxxxxx-xxxxxxxx-ap-northeast-1c.requests.apprunner.ap-northeast-1.vpce.amazonaws.com +short
10.0.22.10

このDNS名でアクセスを試してみたところ接続エラーになりました。

原因は特定できていませんがおそらくHOSTヘッダーを検証してるんんだろうと予測します。
このDNS名でアクセスすることは無いと思いますが一応結果を共有しておきます。

最後に

以上となります。

結構待ち望んでいた人が多い更新なんじゃないかと思います。
App Runnerは比較的シンプルなアプリケーション向けですので、企業内のちょっとしたWEBアプリケーションをホストするのに便利に使えそうです。