【 IaC 入門】 AWS CDK で「インフラのコード化」を体験してみた
はじめに
こんにちは、クラスメソッドオペレーションズの目取眞です。
AWS CDK(AWS Cloud Development Kit、以下 CDK)の Python 版を使い、AWS Lambda と Amazon API Gateway によるシンプルなサーバーレス API を構築してみました。CDK では Python などのプログラミング言語で AWS リソースを定義できるため、IaC(Infrastructure as Code)の考え方を直感的に理解できます。AWS 初学者が IaC に触れる際の入門教材として適していると感じたため、手順を整理して記事にしました。
なお、今回は会社の検証環境を使用していますが、社内ポリシーで長期アクセスキーの発行が非推奨とされているため、ローカル PC に認証情報を置かずに完結できる AWS CloudShell 上で作業しています。同様の環境で作業されている方の参考になれば幸いです。
今回のゴール
- CDK(Python)を使って、Lambda と API Gateway によるシンプルな API を構築する
- 長期アクセスキーを発行・設定せず、CloudShell だけで一連の作業(環境構築からデプロイ、後片付けまで)を完結させる
cdk synthでコードが AWS CloudFormation テンプレートに変換される様子を確認する
今回作るものの構成図

/hello エンドポイントにアクセスすると API Gateway が Lambda を呼び出し、実行結果を返します。Lambda の実行ログは Amazon CloudWatch Logs に記録されます。
事前準備:なぜ CloudShell を使うのか
cdk deploy は AWS マネジメントコンソールへのログインとは別に、AWS CLI や CDK CLI が AWS API を呼び出すための認証情報を必要とします。ローカル PC から AWS CLI や CDK CLI を利用する場合は、環境に応じた認証設定が必要です。しかし、会社の検証環境では長期アクセスキーの発行が非推奨とされていました。
そこで採用したのが CloudShell です。CloudShell は、ログインしている IAM ユーザーまたはロールの権限を引き継いで動作するブラウザベースのシェル環境のため、長期アクセスキーを発行・設定せずに CDK のデプロイまで完結できます。
1. CloudShell を起動する
AWS マネジメントコンソールにログインし、画面上部のツールバーから CloudShell アイコンをクリックします。

2. プロジェクトのディレクトリとファイルを作成する
まず、プロジェクト用のディレクトリを作成します。
mkdir -p ~/aws-cdk-handson/aws_cdk_handson ~/aws-cdk-handson/lambda
cd ~/aws-cdk-handson
Lambda 関数のコードを作成
以下のコマンドで Lambda 関数のコードを作成します。
lambda/handler.py
cat > lambda/handler.py << 'EOF'
import json
def handler(event, context):
return {
"statusCode": 200,
"headers": {"Content-Type": "application/json"},
"body": json.dumps({"message": "Hello from Lambda! CDK Handson"}),
}
EOF
CDK スタックのコードを作成
CDK スタックのコードを作成します。
aws_cdk_handson/aws_cdk_handson_stack.py
cat > aws_cdk_handson/aws_cdk_handson_stack.py << 'EOF'
from aws_cdk import (
Stack,
CfnOutput,
aws_lambda as _lambda,
aws_apigatewayv2 as apigwv2,
aws_apigatewayv2_integrations as integrations,
)
from constructs import Construct
class AwsCdkHandsonStack(Stack):
def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
super().__init__(scope, construct_id, **kwargs)
hello_function = _lambda.Function(
self,
"HelloHandler",
runtime=_lambda.Runtime.PYTHON_3_12,
handler="handler.handler",
code=_lambda.Code.from_asset("lambda"),
)
http_api = apigwv2.HttpApi(
self,
"HelloHttpApi",
api_name="hello-handson-api",
)
integration = integrations.HttpLambdaIntegration(
"HelloIntegration", hello_function
)
http_api.add_routes(
path="/hello",
methods=[apigwv2.HttpMethod.GET],
integration=integration,
)
CfnOutput(self, "ApiUrl", value=f"{http_api.api_endpoint}/hello")
EOF
残りのファイルを作成
CDK の設定ファイルとエントリーポイントを作成します。
app.py / requirements.txt / cdk.json
touch aws_cdk_handson/__init__.py
cat > app.py << 'EOF'
#!/usr/bin/env python3
import aws_cdk as cdk
from aws_cdk_handson.aws_cdk_handson_stack import AwsCdkHandsonStack
app = cdk.App()
AwsCdkHandsonStack(app, "AwsCdkHandsonStack")
app.synth()
EOF
cat > requirements.txt << 'EOF'
aws-cdk-lib>=2.150.0,<3.0.0
constructs>=10.0.0,<11.0.0
EOF
cat > cdk.json << 'EOF'
{
"app": "python3 app.py"
}
EOF
ファイル確認
以下のコマンドで、ファイルが揃っているか確認します。
find . -type f
以下の 6 ファイルが表示されていれば成功です。
./cdk.json
./requirements.txt
./app.py
./lambda/handler.py
./aws_cdk_handson/aws_cdk_handson_stack.py
./aws_cdk_handson/__init__.py
3. CDK CLI と Python 環境をセットアップする
CloudShell には Python と Node.js がプリインストールされているため、CDK CLI のみ追加でインストールします。
sudo npm install -g aws-cdk # CDK CLI をインストール
python3 -m venv .venv # Python 仮想環境を作成
source .venv/bin/activate # 仮想環境を有効化
pip install -r requirements.txt # CDK ライブラリをインストール
4. ブートストラップを実行する
cdk bootstrap は、CDK が使用するブートストラップリソース(アセット保存用の Amazon S3 バケット、Amazon ECR リポジトリ、IAM ロールなど)を、AWS アカウントとリージョンの組み合わせごとに作成するコマンドです。すでにブートストラップ済みの場合は、必要に応じて既存の CDKToolkit スタックが更新されます。
cdk bootstrap

5. cdk synth でテンプレートを確認する
デプロイ前に、Python で書いたコードがどのような CloudFormation テンプレートに変換されるかを確認します。
cdk synth

6. デプロイする
cdk deploy
途中で以下のような確認が出るので y を入力します。
Stack includes security-sensitive updates and "--require-approval" is set to 'broadening'.
Do you wish to deploy these changes (y/n)?
デプロイが完了すると、ApiUrl という出力に API のエンドポイント URL が表示されます。

7. 動作確認する
出力された URL に対して curl を実行します。
curl https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/hello
以下のレスポンスが返ってくれば成功です。

{"message": "Hello from Lambda! CDK Handson"}
8. AWS マネジメントコンソールで作成されたリソースを確認する
Lambda 関数の確認
Lambda コンソールを開き、作成された関数を確認します。

CDK が自動生成した関数名や、API Gateway との連携が確認できます。
API Gateway の確認
API Gateway コンソールを開くと、/hello ルートが登録されていることを確認できます。

CloudWatch Logs でログを確認
CloudWatch Logs で、先ほどの curl によって Lambda が実行されたログを確認します。なお、CloudWatch Logs のロググループは CDK で明示的に設定していませんが、Lambda 関数の初回呼び出し時に自動で作成されます。


コールドスタート時の INIT_START や、関数呼び出し時の START、END、REPORT などが記録されています。
9. 後片付けする
不要な課金を抑えるため、検証で作成したリソースを削除します。
cdk destroy

出力に ✓ AwsCdkHandsonStack: destroyed と表示されれば、リソースが正常に削除されています。
また、cdk bootstrap で作成される CDKToolkit スタック(Amazon S3 バケットや Amazon ECR リポジトリなど)は、同じアカウント・リージョンで複数の CDK プロジェクト間で共有・再利用される想定のリソースのため、原則として削除しないでください。削除すると、同じ環境を利用する他の CDK プロジェクトに影響する可能性があります。検証専用環境などで削除する場合は、他の CDK プロジェクトで使用されていないことを確認した上で、CloudFormation コンソール → スタック → CDKToolkit を選択 → 「スタックを削除」をクリックで削除できます。
まとめ
CDK(Python)を使うことで、Lambda や API Gateway などのリソースをコードでまとめて定義・削除できることを確認しました。
また、長期アクセスキーの発行が非推奨とされている環境でも、CloudShell を使えばローカルに認証情報を置かずにハンズオンを完結できます。同様の環境で作業する方の参考になれば幸いです。
参考
- AWS Cloud Development Kit (AWS CDK)
- AWS CloudShell とは
- HTTP API の概要 - Amazon API Gateway
- AWS CDK Bootstrapping
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、 IT・AI をフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイトをぜひご覧ください。
※2026 年 1 月 アノテーション㈱から社名変更しました。










