コンテンツにスキップ

Copilot における App Runner での WAF の利用

投稿日 : 2023 年 2 月 23 日

Siddharth Vohra, ソフトウエア ディベロップメント エンジニア, AWS App Runner

AWS Web Application Firewall (WAF) のウェブアクセスコントロールリスト (ウェブ ACL) を App Runner サービスに関連付けることができるようになりました。 - Copilot で!

AWS Web Application Firewall (WAF) は、Web アプリケーションに転送される HTTP(S) リクエストの監視を支援し、 コンテンツへのアクセスを制御します。 指定した基準に基づいて、Web リクエストを拒否したり、許可することでアプリケーションを保護できます。 例えば、 リクエストの発信元 IP アドレスやクエリ文字列の値などでアクセスを制御できます。

AWS は AWS App Runner がセキュリティ強化のためのウェブアプリケーションファイアウォール (WAF) サポートを導入を発表しました。 この発表はRequest-Driven Web Services を AWS WAF で保護できるようになったことを意味します。 このブログポストでは、AWS Copilot を利用して、簡単に保護を有効にする方法を紹介します。

Info

これらの手順は、GitHub "Show and tell" discussion section に投稿したものと同じです!もし App Runner の WAF サポートについて、質問、フィードバック、リクエストがあれば、気軽にコメントを残してください!

前提条件

続行するには、独自の WAF ウェブアクセスコントロールリスト(ウェブ ACL) を用意する必要があります。 まだ、ACL を作成していない場合、まずルールオプションでアプリケーション用の WAF ACL を作成する必要があります(独自のウェブ ACL の作成については こちらを確認してください)。

ウェブ ACL が準備できたら、その ARN をメモしておきます。 WAF ウェブ ACL を Request-Driven Web Service で利用するには、 次の手順に従います。

手順 1 (オプション): Request-Driven Web Service の作成

Request-Driven Web Service がまだ無い場合、 次のコマンドを実行して、 App Runner サービスを作成・設定します。

copilot init \
  --svc-type "Request-Driven Web Service" \
  --name "waf-example" \
  --dockerfile path/to/Dockerfile
または、copilot svc init をフラグ無しで実行します。Copilot は追加の入力を求めるプロンプトを表示し、 Service の作成をガイドします。

手順 2 (オプション): Service に対応した addons/ フォルダの作成

Request-Driven Web Service があるワークスペースにいるとします。手順 1 を実行している場合、 ワークスペースの構造は次の様になっているでしょう。

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

./copilot/<name of your Request-Driven Web Service> 配下に、addons/ フォルダがまだ無い場合、作成します。 ワークスペースは次の様になっているでしょう。

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

手順 3: Addon を利用して、Request-Driven Web Service に ウェブ ACL を関連づける

Addon フォルダに、 waf.ymladdons.parameters.yml という 2 つのファイルを新しく作成します。フォルダは次の様になっているでしょう。

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

次の内容をコピーし、それぞれのファイルに貼り付けます。

#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.
Parameters:
  ServiceARN: !Ref Service

手順 4: ウェブ ACL ARN を waf.yml に入力する

waf.yml を開き、<paste your WAF Web ACL ARN here> をウェブ ACL リソースの ARN で置き換えます。例えば、次の部分です。

Resources:
  # Configuration of the WAF Web ACL you want to associate 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: arn:aws:wafv2:us-east-2:123456789138:regional/webacl/mytestwebacl/3df43564-be9f-47ce-a12b-3a577d2d8913

手順 5: Service をデプロイする

最後に、copilot svc deploy を実行します! Request-Driven Web Service がデプロイされ、 WAF ウェブ ACL に関連付けられているでしょう!

考慮事項
  • ウェブ ACL は複数の Services に関連付けられますが、1 つの Service には 1 つより多くのウェブ ACL を関連付けることができません。
  • Copilot を利用した App Runner サービスが既にある場合、 手順 2-5 を実行するだけで、 WAF ウェブ ACL を既存の Service に関連づけることができます。