0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Dockerはわかるけど…」から卒業!AWSでコンテナを動かすための30日集中講座 - Day 26: AWS CDK/CloudFormationでコンテナ環境をコード化する

Last updated at Posted at 2025-08-24

Day 26: AWS CDK/CloudFormationでコンテナ環境をコード化する 📝

皆さん、こんにちは!30日集中講座、Day 26へようこそ。

昨日までの講座で、ECSやEKSといったAWSコンテナサービスをコンソール画面から手動で構築・運用する方法を学びました。しかし、実際の開発現場では、このようなインフラ設定を手動で行うことはほとんどありません。設定ミスや環境の差異を防ぐため、インフラをコードとして管理する IaC (Infrastructure as Code) が一般的です。

今日は、IaCの概念を理解し、AWSのIaCツールである CloudFormation と、よりモダンな AWS CDK (Cloud Development Kit) を使って、コンテナ環境をコード化する方法を学びます。

1. なぜIaCが必要なのか?

IaCは、サーバー、データベース、ネットワークなどのインフラ設定を、プログラミング言語や設定ファイルで記述し、自動で構築・管理する手法です。

  • 再現性の確保: 誰が実行しても、同じ環境を何度でも正確に再現できます。
  • バージョン管理: Gitでインフラ設定の変更履歴を管理できるため、いつでも以前の状態に戻すことができます。
  • 自動化: デプロイメントパイプラインにIaCを組み込むことで、インフラ構築・変更を完全に自動化できます。

2. AWSのIaCツール:CloudFormation vs AWS CDK

AWSでIaCを実現するための代表的なツールが、CloudFormationとAWS CDKです。

AWS CloudFormation

CloudFormationは、AWSのインフラを宣言的に定義するサービスです。

  • 特徴: YAMLまたはJSON形式のテンプレートファイルに、作成したいAWSリソース(EC2、VPC、ECSサービスなど)を記述します。CloudFormationは、このテンプレートを読み取ってリソースを作成・更新します。
  • メリット: AWSのネイティブサービスであり、すべてのAWSリソースに対応しています。
  • デメリット: YAMLやJSONは冗長になりやすく、複雑なロジックの実装には向いていません。

AWS CDK (Cloud Development Kit)

AWS CDKは、TypeScript、Python、Javaといったプログラミング言語を使ってインフラを定義するフレームワークです。

  • 特徴: 慣れ親しんだプログラミング言語でインフラを記述します。CDKは、記述されたコードを内部的にCloudFormationテンプレートに変換し、AWSにデプロイします。
  • メリット:
    • 抽象化: ECSクラスターやVPCといった複雑な構成も、数行のコードで簡単に定義できます。
    • プログラミングの利点: 条件分岐、ループ、再利用可能なコンポーネント(クラス)の作成など、プログラミング言語の機能を活用できます。
  • デメリット: 新しいツールであり、学習コストがやや高い場合があります。

3. CDK環境のセットアップ

CDKを使用する前に、以下の前提条件を満たす必要があります:

前提条件

  • Node.js (v14以上)
  • AWS CLI の設定(aws configureでアクセスキー等を設定済み)
  • CDKの安装: npm install -g aws-cdk

プロジェクトの初期化

# 新しいCDKプロジェクトを作成
mkdir my-cdk-project
cd my-cdk-project
cdk init app --language python

# 必要なライブラリをインストール
pip install aws-cdk-lib constructs

4. 実践:CDKでFargateアプリケーションを構築する

CDKを使うと、ECS on Fargateの環境を非常にシンプルに定義できます。以下はPythonを使ったCDKコードの例です。

# app_stack.py
from aws_cdk import (
    aws_ecs as ecs,
    aws_ec2 as ec2,
    Stack,
)
from constructs import Construct

class MyWebAppStack(Stack):
    def __init__(self, scope: Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # 1. VPCの作成
        vpc = ec2.Vpc(self, "MyVpc", max_azs=2)

        # 2. ECSクラスターの作成
        cluster = ecs.Cluster(self, "MyCluster", vpc=vpc)

        # 3. Fargateタスク定義の作成
        task_definition = ecs.FargateTaskDefinition(
            self, "MyTaskDefinition",
            cpu=256,
            memory_limit_mib=512,
        )

        # 4. コンテナの追加
        task_definition.add_container(
            "web",
            image=ecs.ContainerImage.from_registry("nginx:latest"),
            port_mappings=[ecs.PortMapping(container_port=80)],
            logging=ecs.LogDrivers.aws_logs(stream_prefix="fargate")
        )

        # 5. Fargateサービスの作成
        ecs.FargateService(
            self, "MyFargateService",
            cluster=cluster,
            task_definition=task_definition,
            desired_count=2,
            public_load_balancer=True
        )

このコードは、VPC、ECSクラスター、Fargateサービス、タスク定義、さらにはロードバランサーまで含む、完全なコンテナ環境を構築します。

5. デプロイと運用

CloudFormationテンプレートの確認

# CDKコードがどのようなCloudFormationテンプレートに変換されるかを確認
cdk synth

デプロイの実行

# 初回デプロイ(CDKブートストラップが必要な場合があります)
cdk bootstrap
cdk deploy

リソースの削除

# 作成したリソースをすべて削除
cdk destroy

6. まとめ:なぜIaCが次のステップなのか?

  • CloudFormationは、AWSのインフラをYAMLで定義するネイティブなサービスです。
  • AWS CDKは、使い慣れたプログラミング言語でインフラを定義でき、抽象化と再利用性に優れています。

手動での設定は、学習の初期段階では非常に有効ですが、実際の現場ではIaCの知識が不可欠です。IaCを学ぶことで、皆さんのスキルは「インフラを操作するエンジニア」から「インフラを設計・構築するエンジニア」へと進化します。

特にCDKを使用することで、インフラの構築が「設定ファイルの管理」から「アプリケーション開発」へと変わり、より直感的で保守しやすいコードが書けるようになります。

次回の予告

Day 27: 【応用編】マイクロサービスアーキテクチャとコンテナ

それでは、また明日お会いしましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?