AWS WAF の移行ツールで作成されるテンプレートを修正して WAF v2 を作成してみた
カスタマーサクセス部 運用支援チームのいたくらです。
はじめに
WAF Classic から WAF v2 に移行するときに migration wizard という移行ツールが使えるのはご存じでしょうか?
この移行ツールは制限事項 (※1) もあるので万能ではありませんが、テンプレート作成が苦手な方にとってはテンプレート作成をゼロから始める必要がないので、便利なツールだと思います。
※1 制限事項についてはこちらのブログで紹介されているのでご一読ください
今回は移行ツールによって作成された Web ACL 構築テンプレートをトラフィックログが出力できるように修正し、デプロイするまでをやってみました。
やってみた
1. 移行ツールを使用してテンプレートを作成
移行ツールを使用してテンプレートを作成する方法は以下を参照ください。
2. 移行ツールで作成したテンプレートをローカルにダウンロード
まずは出力先に指定した S3 に移動します。
aws-waf-migration- で始まる S3 バケットをクリックします。

さらに階層を下げていくと、<WAF Classic の Web ACL 名 (ハイフンは削除される) > + <ランダムな数列>.template というオブジェクトが存在するので、それをダウンロードします。

3. VS Code でテンプレートを修正
ダウンロードしたファイルを VS Code で開きます。JSON ファイルは 1 行に圧縮された形になっています。

コマンドパレット: Ctrl + Shift + P (Windows/Linux) または Cmd + Shift + P (macOS) を押して、「format」と入力し、「ドキュメントのフォーマット」を選択します。
(キーボードショートカットでも出来ます:Shift + Alt + F (Windows/Linux) または Shift + Option + F (macOS))

すると VS Codeの設定に従って自動で整形されます。

移行ツールで出力されたテンプレートは以下です。(今回は Web ACL のみの簡易なリソースで試しています)
移行ツールで出力されたテンプレート(整形済み)
{
    "Resources": {
        "Stacktestwafv11740117922405": {
            "Type": "AWS::WAFv2::WebACL",
            "Properties": {
                "DefaultAction": {
                    "Allow": {}
                },
                "Scope": "REGIONAL",
                "VisibilityConfig": {
                    "CloudWatchMetricsEnabled": true,
                    "MetricName": "testwafv1",
                    "SampledRequestsEnabled": true
                },
                "Description": "testwafv1",
                "Name": "test-wafv1a026cf91-159b-4e7a-99ac-1d4329ab1090",
                "Rules": []
            }
        }
    }
}
Web ACL 名を修正したり、WAF のトラフィックログを出力する設定を追記したテンプレートが以下です。
修正・追記した行はハイライトしています。
修正したテンプレート
{
    "Resources": {
+       "S3BucketForWAFLog": {
+           "Type": "AWS::S3::Bucket",
+           "Properties": {
+               "BucketName": "aws-waf-logs-test-wafv2-xxxxxxxxxxxx",
+               "AccessControl": "Private",
+               "PublicAccessBlockConfiguration": {
+                   "BlockPublicAcls": true,
+                   "BlockPublicPolicy": true,
+                   "IgnorePublicAcls": true,
+                   "RestrictPublicBuckets": true
+               },
+               "LifecycleConfiguration": {
+                   "Rules": [
+                       {
+                           "Id": "DeleteWAFLogsAfterOneYear",
+                           "Status": "Enabled",
+                           "ExpirationInDays": 365
+                       }
+                   ]
+               }
+           }
+       },
+       "WebACL": {
            "Type": "AWS::WAFv2::WebACL",
            "Properties": {
                "DefaultAction": {
                    "Allow": {}
                },
                "Scope": "REGIONAL",
                "VisibilityConfig": {
                    "CloudWatchMetricsEnabled": true,
+                   "MetricName": "test-wafv2",
                    "SampledRequestsEnabled": true
                },
+               "Description": "wafv2 for test",
+               "Name": "test-wafv2-20250521",
                "Rules": []
            }
        },
+       "WAFLog": {
+           "Type": "AWS::WAFv2::LoggingConfiguration",
+           "Properties": {
+               "LogDestinationConfigs": [
+                   {
+                       "Fn::GetAtt": [
+                           "S3BucketForWAFLog",
+                           "Arn"
+                       ]
+                   }
+               ],
+               "ResourceArn": {
+                   "Fn::GetAtt": [
+                       "WebACL",
+                       "Arn"
+                   ]
+               }
+           }
+       }
    }
}
この修正したテンプレートを使用して、WAF v2 の Web ACL を作成します。
4. CloudFormation で WAF v2 を作成
CloudFormation に移動し、「新しいリソースを使用 (標準)」をクリックします。

「既存のテンプレートを選択」で、「テンプレートファイルのアップロード」を選択し、先ほど修正したテンプレートをアップロードします。
アップロードが完了したら「次へ」をクリックします。

スタック名を入力し、「次へ」をクリックします。

スタックオプションの設定は特に変更せず、そのまま「次へ」をクリックします。

確認画面が出てくるので内容を確認して、最後に「送信」をクリックします。
スタックのイベントタブが表示されるので CREATE_COMPLETE まで待ちます。

スタックのステータスが CREATE_COMPLETE になったことを確認できました。

WAF のサービスページに移動して、作成された Web ACL を確認します。
左の「Web ACLs」より Web ACL の一覧を確認すると、CloudFormation で作成した Web ACL が確認できます。

Web ACL 名をクリックして詳細画面に移動し「Logging and metrics」タブを開くと、テンプレート通りにトラフィックログが出力されるように設定できていることが確認できます。

あとがき
テンプレートをゼロから作成するのが楽勝なつよつよエンジニアにはあまり必要がないかもしれないですが、テンプレート作成が苦手な方でも簡単に移行できるように移行ツールが存在するので、是非活用いただけたらと思います。
この記事がどなたかのお役に立てれば幸いです。
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。







