AWS Copilot CLIで作成したAWS App Runnerに、既存のAWS WAFをサクッとアタッチしてみる

2023.08.17

こんにちは、筧 剛彰( @TakaakiKakei )です。

今回は、AWS のコマンドラインツールである AWS Copilot CLI で作成した AWS App Runner に、既存の AWS WAF をアタッチする方法をご紹介します。

AWS Copilot CLI とは?

AWS Copilot CLI は、AWS が提供するコマンドラインツールで、AWS App Runner や AWS Fargate などを容易にデプロイできるツールです。先日、私自身が AWS Copilot CLI を使って AWS App Runner を作成し、それに既存の AWS WAF をアタッチしたいと思ったところ、思いの外スムーズに設定できたため、その手順を共有させていただきます。

AWS Copilot CLI を用いる利点

AWS Copilot CLI を利用すると、addonsフォルダ内にwaf.ymladdons.parameters.ymlという 2 つのファイルを生成するだけで、既存の AWS WAF を AWS App Runner に容易にアタッチできます。それでは、以下の手順で試してみましょう。

手順

AWS Copilot CLI の設定と準備

この記事では、既に AWS Copilot CLI がダウンロード・セットアップ済みであることを前提とします。まだセットアップしていない方は、以下のリンクを参考にセットアップをお願いします。

サンプルコードの取得

まずは公式から提供されているサンプルコードを利用します。

git clone https://github.com/aws-samples/aws-copilot-sample-service

AWS App Runner の作成

AWS Copilot CLI では、Manifest という概念を用います。これは、AWS Copilot CLI で作成するソフトウェアアーキテクチャの種類を定義するものです。例えば次のような Manifest を選択できます。

・"Request-Driven Web Service" - Service 実行環境として AWS App Runner サービスを作成します。

・"Static Site" - 静的 Web サイト用に専用の CloudFront ディストリビューションと S3 バケットをプロビジョニングします。

・"Load Balanced Web Service" - Service 実行環境として Appplication Load Balancer (ALB)、Network Load Balancer、またはその両方を作成し、セキュリティグループ、ECS サービス (Fargate) を利用します。

今回は AWS App Runner を利用するため、Request-Driven Web Service を選択します。

それではまず、デプロイ先の AWS アカウントのプロファイルに切り替えます。今回は AWSume を利用して切り替えを行います。

awsume AWS プロファイル名

AWS Copilot CLI で、Request-Driven Web Service を作成します。copilot initコマンドを利用すると、必要な環境を自動的に作成してくれます。

copilot init --app demo \
 --name waf-example \
 --type "Request-Driven Web Service" \
 --dockerfile "./Dockerfile" \
 --deploy

本番環境利用で利用する場合は、以下の公式記事を参考にステップバイステップで進めることをおすすめします。

copilot initコマンドの実行が完了した後、AWS App Runnerからデフォルトエンドポイントが生成されます。それにアクセスし、動作確認を行います。下図のような画面が表示されればOKです。

既存の AWS WAF を AWS App Runner にアタッチする

AWS Copilot CLI を使用して、以下のフォルダ構造とファイルが生成されます。

.
└── copilot/
  └── waf-example/ # The name of your Request-Driven Web Service. Not necessarily "waf-example".
      └── manifest.yml

この中に addonsフォルダと、waf.ymladdons.parameters.yml ファイルを以下のように追加します。

.
└── copilot/
  └── waf-example/ # The name of your Request-Driven Web Service. Not necessarily "waf-example".
      ├── manifest.yml
      └── addons/

waf.ymlファイルに以下の内容を記述します。``の箇所には、ご自身の AWS WAF Web ACLs の ARN を記入してください。

#Addon template to add WAF configuration to your App Runner service.

Parameters:
  App:
    Type: String
    Description: Your application's name.
  Env:
    Type: String
    Description: The environment name your service, job, or workflow is being deployed to.
  Name:
    Type: String
    Description: The name of the service, job, or workflow being deployed.
  ServiceARN:
    Type: String
    Default: ""
    Description: The ARN of the service being deployed.

Resources:
  # Configuration of the WAF Web ACL you want to asscoiate with 
  # your App Runner service.
  Firewall:
    Metadata:
      'aws:copilot:description': 'Associating your App Runner service with your WAF WebACL'
    Type: AWS::WAFv2::WebACLAssociation
    Properties: 
      ResourceArn: !Sub ${ServiceARN}
      WebACLArn:  <paste your WAF Web ACL ARN here> # Paste your WAF Web ACL ARN here.

AWS WAF Web ACLs の ARN は下図の画面から取得できます。

addons.parameters.yml ファイルは以下のようになります。

Parameters:
  ServiceARN: !Ref Service

copilot svc deployコマンドを利用してデプロイすれば、既存の AWS WAF を AWS App Runner にアタッチできます。

copilot svc deploy

マネジメントコンソールでの確認

AWS Copilot CLI を使用して作成した AWS App Runner に既存の AWS WAF がアタッチされていることを確認しましょう。AWS マネージメントコンソールを開いて、AWS WAF のサービスページにおいて、対象の Web ACLs のAssociated AWS resourcesを確認します。下図のような画面が表示されたら、設定成功です。

おかたづけ

AWS Copilot CLI で作成されたリソースは、copilot app deleteコマンドを利用して削除できます。 既存の AWS WAF は必要に応じてマネジメントコンソールから削除してください。

copilot app delete

おわりに

これまで AWS Lambda を主に使用してサービスの開発を行っていましたが、AWS Copilot CLI を通じて AWS App Runner や AWS Fargate の利用の簡便性を理解しました。今後はこれらのサービスを使う機会も増えそうです。もしまだ AWS Copilot CLI を試していない方がいらっしゃいましたら、ぜひ一度お試しください。

以上、AWS 事業本部の筧 剛彰( @TakaakiKakei )でした。

参考