💨

AWS CDKで始めるIaC入門(Python編)

に公開

インフラもコードで管理! AWS Cloud Development Kit (CDK) をPythonで記述し、GitHub Actionsで自動デプロイする実践的なIaCワークフローをゼロから構築します。この記事で、手動構築から完全に卒業しましょう。

🧩 IaCとは?なぜ必要なのか

IaC(Infrastructure as Code) は、AWSコンソールでの手動構築ではなく、インフラをコードで定義・管理する考え方です。このアプローチにより、コードをGitで管理し、自動化・再現性を実現します。

メリット

  • 再現性が高い:誰が実行しても同じ環境がデプロイされます。
  • 履歴管理:Gitでインフラの変更履歴を追跡できます。
  • 自動デプロイ:CI/CDパイプラインによるデプロイ・破棄が可能です。
  • 環境切り替え:開発、ステージング、本番環境の切り替えが容易です。

🧱 AWS CDKとは

AWS CDKは、AWS CloudFormationをプログラミング言語で生成する AWS公式のフレームワークです。PythonやTypeScriptなどの使い慣れた言語で、柔軟かつ抽象度の高いインフラ定義が可能です。

比較項目 CloudFormation AWS CDK
記述形式 YAML / JSON Python, TypeScript, etc.
柔軟性 低い 高い(関数や変数、ループが使える)
学習コスト 低い(コード感覚で書ける)

⚙️ GitHubでの準備

① リポジトリ構成

GitHub上で以下の構成を用意します。

aws-cdk-iac-demo/
├── .github/
│   └── workflows/
│       └── deploy.yml  # GitHub Actionsの設定ファイル
├── app.py              # CDKアプリケーションのエントリポイント
├── requirements.txt    # Pythonの依存関係
└── aws_cdk_iac_demo/
    └── aws_cdk_iac_demo_stack.py # インフラ定義の本体

🪜 CDKプロジェクトを作成

ローカルで開発する場合は、次の手順で初期化します。

  1. プロジェクトの初期化

    mkdir aws-cdk-iac-demo
    cd aws-cdk-iac-demo
    # PythonプロジェクトとしてCDKを初期化
    cdk init app --language python
    
  2. 仮想環境の準備と依存パッケージのインストール

    python3 -m venv .venv
    source .venv/bin/activate
    pip install -r requirements.txt
    

🖋️ PythonでEC2をデプロイする

aws_cdk_iac_demo/aws_cdk_iac_demo_stack.py を以下のように編集し、VPCとEC2インスタンスを定義します。

from aws_cdk import (
    Stack,
    aws_ec2 as ec2,
)
from constructs import Construct

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

        # 1. VPCを作成 (2つのAvailability Zoneを使用)
        vpc = ec2.Vpc(self, "MyVpc", max_azs=2)

        # 2. EC2インスタンスを作成 (Amazon Linux 2, t2.micro)
        ec2.Instance(
            self, "MyInstance",
            instance_type=ec2.InstanceType("t2.micro"),
            machine_image=ec2.MachineImage.latest_amazon_linux2(),
            vpc=vpc
        )

🚀 GitHub Actionsで自動デプロイ

① IAMユーザーの準備とシークレット登録

GitHub ActionsがAWSへデプロイできるように、IAMユーザーを作成し、以下の手順で認証情報を登録します。

  1. IAMユーザーに必要な権限(学習用途ならAdministratorAccess)を付与し、アクセスキーを発行します。
  2. GitHubリポジトリの Settings → Secrets and variables → Actions に以下を登録します:
名前 目的
AWS_ACCESS_KEY_ID IAMユーザーのアクセスキー AWS認証用
AWS_SECRET_ACCESS_KEY シークレットキー AWS認証用
AWS_REGION 例:ap-northeast-1 デプロイ先のリージョン

② GitHub Actions の設定ファイルを作成

.github/workflows/deploy.yml を追加します。

name: Deploy AWS CDK Stack

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          
      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Install AWS CDK and dependencies
        run: |
          # グローバルにCDK CLI (Node.js)をインストール
          npm install -g aws-cdk
          # 仮想環境を有効化し、Pythonの依存関係をインストール
          python -m venv .venv
          source .venv/bin/activate
          pip install -r requirements.txt

      - name: Bootstrap CDK
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
        run: cdk bootstrap

      - name: Deploy Stack
        env:
          AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
          AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          AWS_DEFAULT_REGION: ${{ secrets.AWS_REGION }}
        run: cdk deploy --require-approval never

🧩 デプロイ結果を確認する

GitHubでmainブランチにコードをPushすると、Actionsが自動で実行され、CloudFormationスタックがデプロイされます。

完了後、AWSコンソールの以下を確認してみましょう。

  • CloudFormationAwsCdkIacDemoStack が存在する
  • VPC:CDKで定義した新しいVPCが作成されている
  • EC2t2.micro インスタンスが作成されている

🧹 クリーンアップ

不要になったら、以下のコマンドで作成したスタックとリソースをすべて削除できます。

# 仮想環境を終了
deactivate

# プロジェクトディレクトリで実行
cdk destroy

📈 ベストプラクティス

基本的なデプロイが成功したら、次は安全で持続可能なIaC運用のために、以下のベストプラクティスを意識しましょう。

項目 内容
バージョン管理 GitHubでコード・IaC両方を一元管理し、レビューを必須化する。
テスト環境 dev ブランチを別スタック(例: AwsCdkIacDemo-Dev)としてデプロイする。
権限管理 最小権限のIAMロールを利用し、ActionsにはAdministratorAccessを渡さない。
CI/CD cdk diff ステップをパイプラインに組み込み、変更差分をレビューする。

🌱 まとめ

学んだこと 内容
IaCとは インフラをコードで管理し、再現性と効率を高める考え方。
AWS CDKとは CloudFormationをPythonなどで生成できるAWS公式ツール。
GitHub Actions IaCの自動デプロイを可能にするCI/CD基盤。
メリット コード管理・自動化・再現性を同時に実現。

🚧 今後の応用予定

今回のEC2デプロイは最も基本的な例でした。今後は次のような構成にも挑戦していく予定です👇
✅ Lambda + API GatewayをCDK + GitHub Actionsで自動デプロイする
✅ CodePipeline × CDK で自動CI/CDを構築し、承認フローを組み込む
✅ Parameter Store や Secrets Manager と組み合わせた機密情報の安全な構成管理

🪶 おわりに

AWS CDKは「インフラ構築を開発サイクルの一部に組み込む」ための最強ツールです。手動構築から卒業し、コードでクラウドを自在に操る時代へ — ぜひCDKを試してみてください!

Discussion