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: 【応用編】マイクロサービスアーキテクチャとコンテナ
それでは、また明日お会いしましょう!