AWS CDK × Fargate:テンプレートで始めるインフラ構築ガイド

はじめに

AWS CDK(AWS Cloud Development Kit)は、AWSリソースをTypeScriptやPythonなどのプログラミング言語で定義・管理できる、Infrastructure as Code(IaC)ツールです。AWS CDKは、インフラのコード化をプログラミング言語で実現したい開発者にとって、非常に使いやすい選択肢です。

従来のYAMLベースのCloudFormationと異なり、コードとしての再利用性や保守性に優れており、一貫性のある環境を迅速に構築できるのが特徴です。

本記事では、CDK公式テンプレートを活用して以下の構成のインフラを最短で構築する方法を解説します。

  • Fargate環境(ALB付き):アプリケーションをコンテナで実行
  • Application Load Balancer:外部トラフィックの受け口
  • AWS WAF(IP制限):特定IPのみアクセス可能なセキュリティ設定

CDKを使えば、これらのリソースをコードで一貫して管理・デプロイすることができます。「とりあえず動かしてみたい」「CDKで何ができるのか実感したい」という方は、ぜひそのまま手順に沿って試してみてください。

公式サンプルを使ってCDKでFargate環境を構築する手順

今回は、AWSが公開しているCDKサンプルコードをクローンし、Fargate環境(ALB付き)を構築する手順を紹介します。

デプロイする主なリソース

  • AWS Fargate:サーバーレスでコンテナを動かせるサービスです。EC2などを意識せずに使えます。
  • Application Load Balancer(ALB):アプリケーションのトラフィックを適切に振り分けてくれる仕組みです。
  • AWS WAF:アクセス元を制御できるファイアウォールで、不正アクセスの防止などに使えます。

前提条件

1. 必要なツールをインストール

まず、Node.jsがインストールされていることを確認し、AWS CDKをインストールします。

npm install -g aws-cdk

バージョンを確認して、正常にインストールされたことを確認しましょう。

npx cdk --version

2. AWS CDK アプリを作成してサンプルリポジトリをコピペ

次のコマンドで CDK アプリを作成します。

npx cdk init app --language typescript

AWS のサンプルリポジトリ、fargate-application-load-balanced-serviceのBonjourFargateクラスをコピーしてbin/cdk.tsに貼り付けてください。

※ 手元の環境に応じて、require を import に書き換えるなどの必要もあります。

3. 依存パッケージをインストール

npm install

4. CDK Bootstrapping

CDKを初めて使う場合、ブートストラップ(初期設定)が必要です。以下のコマンドを実行してください。

cdk bootstrap --profile ${YOUR_AWS_PROFILE}

※初回のcdk deployでエラーが出た場合は、AWS CLIのプロファイルやリージョン設定、IAM権限が不足していないかを確認してみてください。CloudFormationのエラーログも参考になります(後述)。

5. デプロイ

リソースをデプロイするには、以下のコマンドを実行します。

cdk deploy --profile ${YOUR_AWS_PROFILE}

このままデプロイすると ALB はどこからでもアクセス可能になるので、気になる方は次の「AWS WAF を使って IP 制限を設定する」に進んでください。

デプロイが完了すると、ALBのDNS名が出力されるので、それを使ってアプリケーションにアクセスできます。

AWS WAF を使ってIP制限を設定する

デフォルトでは、CDKテンプレートで作成した ALB(Application Load Balancer)はどこからでもアクセス可能な状態になっています。これは検証段階では便利ですが、セキュリティ的にはリスクのある設定です。

特に開発中のアプリケーションや社内向けのシステムでは、限られた関係者のみがアクセスできる状態にしておくことが望ましいでしょう。

そこで有効なのが、AWS WAF(Web Application Firewall)を活用したIPアドレスによるアクセス制限です。このセクションでは、CDKを使ってWAFルールを作成し、特定のIPアドレスのみを許可する方法について解説します。

1.  「BonjourFargate」 クラスを編集

以下のように 「BonjourFargate」クラスを追加し、特定のIPアドレス(例:`111.111.111.111/32`)からのみアクセスを許可するようにします。

tsx
export class BonjourFargate extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Create VPC and Fargate Cluster
    // NOTE: Limit AZs to avoid reaching resource quotas
    const vpc = new ec2.Vpc(this, 'MyVpc', { maxAzs: 2 });
    const cluster = new ecs.Cluster(this, 'Cluster', { vpc });

    // Instantiate Fargate Service with just cluster and image
    const fargateService = new ecs_patterns.ApplicationLoadBalancedFargateService(this, "FargateService", {
      cluster,
      taskImageOptions: {
        image: ecs.ContainerImage.fromRegistry("amazon/amazon-ecs-sample"),
      },
    });

    // ===== ここから追加 =====
    const ipSet = new waf.CfnIPSet(this, 'MyIPSet', {
      name: 'AllowSpecificIPSet',
      scope: 'REGIONAL',  // ALBの場合はREGIONAL
      ipAddressVersion: 'IPV4',  // IPv4アドレスを使用
      addresses: ['111.111.111.111/32'], // 許可したいIPアドレス
    });

    const webAcl = new waf.CfnWebACL(this, 'MyWebAcl', {
      defaultAction: { allow: {} },
      scope: 'REGIONAL',
      rules: [
        {
          name: 'IPRule',
          priority: 1,
          action: { allow: {} },
          statement: {
            ipSetReferenceStatement: {
              arn: ipSet.attrArn,
            },
          },
          visibilityConfig: {
            sampledRequestsEnabled: true,
            cloudWatchMetricsEnabled: true,
            metricName: 'IPRule',
          },
        },
      ],
      visibilityConfig: {
        cloudWatchMetricsEnabled: true,
        sampledRequestsEnabled: true,
        metricName: 'MyWebAcl',
      },
    });
    const alb = fargateService.loadBalancer; // 既に作成したALBを使用

    new waf.CfnWebACLAssociation(this, 'WebAclAssociation', {
      resourceArn: alb.loadBalancerArn,
      webAclArn: webAcl.attrArn,
    });
  }
}

2. CDKを再デプロイ

セキュリティ設定を反映するために、再デプロイします。

cdk deploy --all --profile ${YOUR\_AWS\_PROFILE}

3. アクセスを確認

ブラウザでALBのDNS名にアクセスし、「指定したIP以外の環境からはアクセスできないこと」を確認します。

CloudFormation コンソール画面の使い方

CDKでリソースをデプロイすると、裏側では CloudFormation がスタック(Stack)として構成を管理しています。

このセクションでは、実行中にエラーが発生したときの確認方法として、AWSマネジメントコンソール上の CloudFormation スタック画面の使い方を紹介します。特にCDKの初心者にとっては、「どこで何が起きているのか」がわかりにくいこともありますが、CloudFormationの画面を見ることで、エラーの原因特定やリソースの作成状況を可視化できます。「CDKでうまく動かない」と感じたときは、まずこの画面をチェックしてみましょう。

他にもリソースタブからは CDK で作成したリソースの管理画面に遷移することができます。ここをベースにセキュリティグループやIAMの設定を確認することで、わかりにくい箇所の理解を深めることができます。

まとめ

本記事では、AWS CDKの公式テンプレートを使って、Fargate環境を最短手順で構築する方法を紹介しました。

TypeScriptでコードを書き、CLIでデプロイし、IP制限も含めた構成まで実践することで、CDKとIaCの基本的な流れを体験できたと思います。「コードでインフラを管理するってこういうことか!」と少しでも実感できたなら、次のステップに進む準備は整っています。

次にチャレンジしたい内容としては、たとえば以下のようなものがあります。

  • RDS や ElastiCache などのリソース追加
  • 独自ドメインやHTTPS対応
  • オートスケーリングやコスト管理の設定

これらはすぐに必要なくても、「どんなことができるか」を知っておくだけでもCDK活用の幅が広がります。

まずは今回のコードをベースに、自分の用途に合わせて少しずつカスタマイズしてみてください。IaCは「試す → 壊す → 修正する」のサイクルを繰り返すことでどんどん身につきます。
このプロセスを通じて、リソースの依存関係の理解、構成の書き方、トラブル時の原因特定、コスト意識、そして本番環境に活かせる設計の勘所など、実践的なスキルが自然と身についていきます。

初めはうまくいかなくても、手を動かして試すことが何よりの近道です。ぜひ今回のテンプレートをベースに、自分なりの構成を試してみてください。

次回は、今回と同じFargate環境を、今度はTerraformという別のツールを使って構築する方法をご紹介します。Terraformは、専用のコード(HCL)でインフラを定義するツールで、特にインフラエンジニアに人気があります。今回はその中でも、できるだけ簡単に早く構築できる方法を取り上げ、公式モジュールの活用や、CDKとの違いにも触れていきます。「CDKと何が違うの?」「自分にはどっちが合ってる?」といった疑問を持つ方にも、きっとヒントになる内容です。