[アップデート] AWS App Runner でついに AWS WAF がサポートされました

2023.02.25

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

いわさです。

Route 53 エイリアスレコードや HTTPS リダイレクトなど、Web アプリケーションとして通常は利用したいが App Runner では対応していなかった機能が多かったのですが最近のアップデートでどんどんこれらがサポートされています。

そんな中、本日のアップデートでついに App Runner で AWS WAF が使えるようになりました。

早速試してみましょう。

適当な App Runner サービス

以前以下の記事で App Runner サービスを作成し眠らせておいたのでこれを使いましょう。

以下のリクエストで Secrets Manager と SSM パラメータストアの値をレスポンスするというアプリケーションです。

% curl https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    58    0    58    0     0    348      0 --:--:-- --:--:-- --:--:--   355
[
  "{\"hogesecret\":\"secretvalue3\"}",
  "ssmparametervalue3"
]

App Runner に AWS WAF を設定

設定方法は簡単で、App Runner の設定画面で作成した Web ACL を選択するだけです。

今回は次のように hoge ヘッダーに fuga という値が含まれている場合にブロックするカスタムルールを作成しました。

App Runner では新規作成時あるいは更新時に、セキュリティ設定箇所に WAF を有効化する項目が追加されています。
以下のようにトグルが OFF になっていると WAF が関連付いていない状態です。

以下は WAF を関連付けした状態です。
トグルを ON にして Web ACL を選択します。ここでは App Runner が東京リージョンなので、Web ACL も東京リージョンで作成しています。

設定後、反映まで少し時間がかかります。私が確認した際には 1 ~ 2 分かかりました。
反映後すぐはセキュリティの欄に WAF の情報が表示されなかったのですが、少し待つと次のように表示されるようになりました。

動作確認

ではカスタムヘッダーを付与してリクエストを送信してみます。

% curl -H "hoge:fuga" https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    32  100    32    0     0    174      0 --:--:-- --:--:-- --:--:--   180
{
  "hoge": "fuga waf blocked"
}

期待どおりブロックされ、Web ACL で設定したカスタムレスポンスが返却されています。

WAF のログ(ここでは CloudWatch Logs)を確認してみると、次のように APPRUNNER が httpSourceName として設定されたログを確認することが出来ました。

httpSourceId は App Runner の対象リソースを指しています。
今回使った App Runner の ARN は次のようになっていて、リソースID と AWS アカウント ID が出力されています。

arn:aws:apprunner:ap-northeast-1:123456789012:service/hoge0107dotnetenv/3c6546695fbc48f8930ff4cf481db181

IP アドレス制限も当然出来る

AWS WAF が使えるのでもちろん IP アドレスでのアクセス制限も WAF のレイヤーで簡単に制御することが出来ます。
次のように IP アドレスリストを用意して IP アドレスによるブロックを試してみます。

% curl https://39ue7pd32b.ap-northeast-1.awsapprunner.com/api/hoge | jq               
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    34  100    34    0     0     53      0 --:--:-- --:--:-- --:--:--    53
{
  "error": "blocked ip address"
}

ブロックされました。良いですね。

さいごに

簡単はありますが、本日は App Runner でついに AWS WAF がサポートされたので試してみました。

これは App Runner ユーザーが随分と待ち望んでいた機能のひとつではないでしょうか。
東京リージョンでも今日から使えましたので、是非みなさん使ってみてください。