App RunnerのVPCコネクタを使ってRDSへ接続してみた

# はじめに
　こんにちは。[前回記事](https://qiita.com/duora0406/items/be56724d963784fbe59e)では、「とりあえずApp Runnerを動かしてみる。」というところに焦点を当てて紹介しました。確かにApp Runnerはとても便利なサービスではあるのですが、もしも、App Runnerを実サービスで利用する場合、下記の部分が気になるのではないでしょうか。
 
* App RunnerからDBに通信することはできるの？
* App Runnerって接続制御はできるの？
* App Runnerでログってとれるの？

　今回は、App RunnerからVPC内に作成したDBへ接続する構成を構築してみます。App Runnerを利用している方の参考になれば幸いです。

# VPCコネクタについて
　App Runner側で作られたVPCはAWSコンソールで見えないので、App Runnerが作ったVPCにRDSやサブネットなどNWのリソースを作ることはできません。そんなときに利用するのが、VPCコネクタになります。詳細は、[アップデート情報](https://aws.amazon.com/jp/blogs/news/new-for-app-runner-vpc-support/)をご覧ください。

# 検証環境構築
　今回は、App Runnerからプライベートサブネットに配置したRDSへ接続した環境を構築してみます。構築流れは下記になります。VPCやRDSの構築については一部割愛し、VPCコネクタの部分を中心に紹介します。ご了承ください。

* VPC、サブネットの作成(割愛)
* SGの作成
* RDSの作成
* App Runnerの作成
* VPCコネクタの作成

## SGの作成
　VPCコネクタを作成する際にVPC、サブネット、App Runner用のSGが必要なため、事前に作成します。今回は下記のルールで作成します。
* App RunnerのSG インバウンドルール(設定なし)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/bdbe17db-c512-d04a-c794-08a279b448e8.png)

* App RunnerのSG アウトバウンドルール(検証なのでフルオープン)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/8546d082-7439-dd4e-c7f9-4083a3282f75.png)

　ここで注意なのが、**VPCコネクタに設定するSGのインバウンドルールは無視される仕様になります。** 検証だから設定していないのではなく、AWSの仕様になります。なぜ、インバウンドルールが無視されるのかは[こちら](https://aws.amazon.com/jp/blogs/news/deep-dive-on-aws-app-runner-vpc-networking/)を参照ください。

　RDSのSGについては、先ほど作成したApp RunnerのSGのみ許可するルールにします。

* RDSのSG インバウンドルール(App RunnerのSGのみ許可)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/78aa2649-7eb1-28aa-fd35-273e1a449330.png)

* アウトバウンドルール(検証なのでフルオープン)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/06baff60-27c6-f488-723b-4b38c497c6c0.png)

## RDSの作成
　続いて、RDSの構築ですが、前手順で作成したVPCに構築すれば、他は基本的にデフォルト値で問題ないです。1点だけ注意なのが、今回、App RunnerにRDS情報を持たせるので、下記についてはメモしておいてください。
 
* RDSエンドポイント
* データベース名
* DBユーザ名
* DBユーザのパスワード

## App Runnerの作成
　App Runnerの構築については、[前回記事](https://qiita.com/duora0406/items/be56724d963784fbe59e)を参照ください。App RunnerにはRDSに接続するコードをデプロイしましょう。今回の検証で利用したものは下記になります。(某AIさんに作ってもらったものです。)

* index.js
```
const express = require('express');
const { Client } = require('pg');
const app = express();

const dbConfig = {
  host: 'xxxxxx', // ここにDBホスト名を記入
  user: 'xxxxxx', // ここにDBユーザー名を記入
  password: 'xxxxxx', // ここにDBパスワードを記入
  database: 'xxxxxx', // ここにDB名を記入
  port: process.env.DB_PORT || 5432,
};

app.use((req, res, next) => {
    res.header('Access-Control-Allow-Origin', '*'); // 必要に応じて特定のオリジンに変更
    res.header('Access-Control-Allow-Headers', 'Content-Type');
    next();
});

app.get('/', async (req, res) => {
  const client = new Client(dbConfig);
  try {
    await client.connect();
    const result = await client.query('SELECT 1 + 1 AS solution');
    res.json({ message: `Database connection successful`, solution: result.rows[0].solution });
  } catch (error) {
    res.status(500).json({ message: `Database connection failed`, error: error.message });
  } finally {
    await client.end();
  }
});

const port = process.env.PORT || 3000;
app.listen(port, () => {
  console.log(`App running on port ${port}`);
});
``` 

* package.json
```
{
  "name": "app-runner-aurora-postgresql",
  "version": "1.0.0",
  "description": "A Node.js app to connect to Aurora PostgreSQL using AWS App Runner",
  "main": "index.js",
  "scripts": {
    "start": "node index.js"
  },
  "dependencies": {
    "express": "^4.17.1",
    "pg": "^8.6.0"
  }
}
```

# VPCコネクタの作成
　App RunnerのVPCコネクタの作成です。App Runner構築の際に作成してもよいですが、今回は構築済のApp Runnerの設定を変更する流れで紹介します。
　構築したApp Runnerの「設定」タブより「編集」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/78715b70-2ba2-3c76-23c7-68135fc07753.png)


　「ネットワーキング」の「送信ネットワークトラフィック」で「カスタムVPC」を選択し、「新規追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/9d0a056f-b550-b522-3448-9a83e5ec9a74.png)

　RDSを作成したVPC、サブネット、App Runner用に作成したSGを選択して、「追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/2824a2cd-206d-bd11-f2da-f5bbd1ed0d18.png)

　VPCコネクタの設定がされたら設定内容を保存します。
　App Runnerのデプロイ完了後、デフォルトドメインに接続してみましょう。問題なく接続できていれば下記画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2513710/2ba983bd-2cde-a899-24d9-57e369c9af5d.png)

# 最後に
　補足ですが、App RunnerにはWAFを適用できます。App Runnerのドメインをパブリックアクセスにアクセスしている場合、WAFを利用して接続制限をしておくと安心ですね。
　方法は、WAFを作成して、App Runnerに割り当てするだけです。公式資料でも紹介されてますので詳細は[こちら](https://docs.aws.amazon.com/ja_jp/apprunner/latest/dg/waf.html)を参照ください。

　最後まで読んでいただきありがとうございました！