AWS CDKでNLB->Fargate環境を簡単に構築する

NLB->Fargateの動作を試せる環境をCDKでさくっと構築します
2022.03.31

はじめに

CX事業本部IoT事業部の佐藤智樹です。

今回はAWS CDKでNLB->Fargateの動作検証などを行うための環境を作る方法を紹介します。構築には NetworkLoadBalancedFargateServiceというL3 Constructと、画面上からの操作で作成します。

CDKでALB->Fargateの構成を構築するパターンはよく紹介されるのですが、NLB->Fargateは比較的最近できたものです。NLBとFargateの動作検証をしたい方向けにおすすめです。後述しますがいろいろ事情があってそのままデプロイしてもFargateにアクセスできないので、解消する方法も紹介します。

使用するConstruct

環境情報

種別 バージョン
AWS CDK 2.18.0
Node 14.15.0

作成方法

AWS CDKを実行できる環境などは設定済の前提で記載します。いつも通り cdk init --language typescript でCDK用のプロジェクトを作成します。

% mkdir nlb-fargate-test
% cdk init --language typescript
% npm install

生成された以下のファイルを修正します。

nlb-fargate-test-stack.ts

import { Stack, StackProps, CfnOutput } from "aws-cdk-lib";
import { Construct } from "constructs";
import { aws_ecs as ecs } from "aws-cdk-lib";
import { aws_ecs_patterns as ecs_patterns } from "aws-cdk-lib";

export class NlbFargateTestStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const loadBalancedFargateService = new ecs_patterns.NetworkLoadBalancedFargateService(this, "Service", {
      memoryLimitMiB: 1024,
      cpu: 512,
      taskImageOptions: {
        image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
      },
    });

  }
}

上記の修正後、認証情報を設定し以下のコマンドでテンプレート生成可能か確認してからデプロイします。

% npm run build
% npx cdk synth --all
% npx cdk deploy --all

 ✅  NlbFargateTestStack

✨  Deployment time: 246.13s

Outputs:
NlbFargateTestStack.ServiceLoadBalancerDNSECXXXXX = NlbFa-Servi-XXXXXXX-XXXXXXXXX.elb.ap-northeast-1.amazonaws.com
Stack ARN:
arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/NlbFargateTestStack/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx

上記のコマンド実行後、自分の環境だと約5~10分ぐらいでデプロイが完了しました。これで完了して出力されたURLにアクセスすれば完了…に見えるんですが接続できません。実はFargate側に設定しているSecurityGroupにingressルールが何も設定されていないので接続できません。

CDKのコードでセキュリティグループのルールを仕込もうとしたりCLI上から設定変更しようと思ったのですが、中々面倒だったので今回は素直にAWSのWebコンソールから設定します。AWSのWebコンソールを開いて該当のSecurityGroupを探し、今回は同VPC内からの通信は全て許可するように設定してみます。

数分経つと、NLB->Fargateのヘルスチェックも正常に通るようになり、ECSのサンプルコードの画面が確認できます。

上記で環境構築は完了です。これで存分にNLBやFargateの接続環境を確認できます!

検証が終わったらお金がもったいないので、以下のコマンドでリソースを削除しましょう。

% npx cdk destroy --all

余談:セキュリティグループのルールが設定されない理由

自分が調べた限りだと以下のissueが関係してます。

適切にイングレスルールを設定するには、NLBのサブネットのCIDRだけをFargate側のセキュリティグループで許可するのが良いですが、CDKのデプロイ時はNLBのサブネットCIDRが把握できていないのでコードに組み込めないという話のようです。

所感

個人的にはデプロイして動かないのは困るんですが、安易にセキュリティグループの設定をフルオープンに設定されるよりはマシかなという感想でした。 NLB->Fargate構成を使う人がどれぐらいいるかは分からないのですが参考になれば幸いです。