AWSリソースをコードを利用して作成する方法はいくつかあります。IaCツールとしては、CloudFormationやTerraform、Ansible、Pulumiが有名ですよね。
しかし、わたしは上記以外の方法である、AWS CDK (Amazon Web Services Cloud Development Kit)について学び始めました。
今回の記事は実際にAWS CDKを動かしてみてどういったツールなのかを知るキッカケになる内容です。
前編である「AWS CDKはじめました【概要編】」では、AWS CDKについて基本を押さえるために知っておくべきことを紹介していますので、さきに読んでみてください。
AWS CDKハンズオンをやってみる
今回紹介するハンズオンは「AWS CDK Workshop」の一部抜粋・改良したものです。内容としては「API Gateway のエンドポイントを持つLambda関数を作成」です。AWS CDKを実行して実際に作成されるAWSリソースは、AWS LambdaやAmazon API Gateway、AWS IAMがあります。
■前提条件
ハンズオン実施に関して、前提条件があります。
-
Cloud9が利用できる権限が付与されている
⇒AWS CDKは様々なツールから実行が可能です。しかし、実行環境にはaws cliやNode.jsが必要なので、環境差分をなくすためにCloud9を利用します。Cloud9にはAWS CDKを実行するためのすべてが用意されているのでオススメです。 -
Pythonを利用してAWS CDKを実行
⇒AWS CDKは開発者に合わせて、複数のプログラミング言語での実行が可能です。今回のハンズオンではPythonを利用して実施していきます。
■AWS Cloud9の準備
まずはAWS CDKを実行する環境を作成していきます。AWS Cloud9の設定値は以下の通りです。
項目 | 設定値 |
---|---|
名前 | 任意 |
説明 | For cdktest |
環境タイプ | 新しいEC2インスタンス |
インスタンスタイプ | t3.small |
タイムアウト | 30 分 |
ネットワーク設定 | AWS Systems Manager (SSM) |
VPC 設定 | デフォルト |
タグ | 任意 |
↓入力が完了したら、[作成]をクリックします。
↓[1 個の環境が正常に作成されました。]と表示されたら、[開く]をクリックします。
↓次の画面が表示されたらOKです。
「AWS Cloud9の準備」は完了です。
■仮想環境の準備
Pythonは、標準ライブラリの一部として提供されていないパッケージやモジュールを使用することがよくあります。そのため依存関係の衝突やシステムの整合性を保つのが難しいです。この問題を解決するのが、仮想環境です。仮想環境はPythonの実行環境をプロジェクトごとに分離し、それぞれの環境が独立して動作するようにします。これにより、異なるプロジェクト間での依存関係の衝突を防ぎ、システム全体のPython環境を汚染しないようにすることができます。
●プロジェクトディレクトリの作成
次のコマンドを実行します。
mkdir cdk_workshop && cd cdk_workshop
cdk init app --language python
【実行結果】
:~/environment/cdk_workshop $ cdk init app --language python
Applying project template app for python
# Welcome to your CDK Python project!
This is a blank project for CDK development with Python.
The `cdk.json` file tells the CDK Toolkit how to execute your app.
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m
Please run 'python3 -m venv .venv'!
Executing Creating virtualenv...
✅ All done!
●virtualevのアクティベート
次のコマンドを実行します。
source .venv/bin/activate
pip install -r requirements.txt
【実行結果】
(.venv) CPI-SAITOU:~/environment/cdk_workshop (master) $ pip install -r requirements.txt
Collecting aws-cdk-lib==2.139.1
Downloading aws_cdk_lib-2.139.1-py3-none-any.whl (35.1 MB)
|████████████████████████████████| 35.1 MB 73.3 MB/s
Collecting constructs=10.0.0
Downloading constructs-10.3.0-py3-none-any.whl (58 kB)
|████████████████████████████████| 58 kB 9.7 MB/s
Downloading typing_extensions-4.11.0-py3-none-any.whl (34 kB)
Collecting exceptiongroup>=1.1.1
Downloading exceptiongroup-1.2.1-py3-none-any.whl (16 kB)
Collecting zipp>=3.1.0
Downloading zipp-3.18.1-py3-none-any.whl (8.2 kB)
Collecting six>=1.5
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: zipp, typing-extensions, six, exceptiongroup, attrs, typeguard, python-dateutil, publication, importlib-resources, cattrs, jsii, constructs, aws-cdk.asset-node-proxy-agent-v6, aws-cdk.asset-kubectl-v20, aws-cdk.asset-awscli-v1, aws-cdk-lib
Successfully installed attrs-23.2.0 aws-cdk-lib-2.139.1 aws-cdk.asset-awscli-v1-2.2.202 aws-cdk.asset-kubectl-v20-2.1.2 aws-cdk.asset-node-proxy-agent-v6-2.0.3 cattrs-23.2.3 constructs-10.3.0 exceptiongroup-1.2.1 importlib-resources-6.4.0 jsii-1.98.0 publication-0.0.3 python-dateutil-2.9.0.post0 six-1.16.0 typeguard-2.13.3 typing-extensions-4.11.0 zipp-3.18.1
仮想環境の作成は以上です。
■AWS Lambda作成
今回のハンズオンではAWS LambdaとAmazon API Gatewayを作成します。AWS CDKではAWSリソースを一気に作成することができますが、まずはAWS Lambdaだけ作成してみます。
●cdk_workshop_stack.py編集
cdk_workshopディレクトリにあるcdk_workshop_stack.pyを編集します。以下のコードを貼り付けてください。場合によっては、自身で打ち込むことをオススメします。
from constructs import Construct
from aws_cdk import (
Stack,
aws_lambda as _lambda,
)
class CdkWorkshopStack(Stack):
def __init__(self, scope: Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# Defines an AWS Lambda resource
my_lambda = _lambda.Function(
self, 'HelloHandler',
runtime=_lambda.Runtime.PYTHON_3_9,
code=_lambda.Code.from_asset('lambda'),
handler='hello.handler',
)
完了しましたら、[Ctrl ]+ [s]で上書き保存します。
●Lambda関数で使用するhello.py作成
Lambda関数で利用するコードを格納します。app.pyと同じディレクトリ内に[lambda]というディレクトリを作成します。
[cdk_workshop]にポインタを合わせ、右クリックを押し、[New Folder]をクリックします。[lambda]と入力しましょう。
↓
作成した[lambda]ディレクトリにポインタを合わせ、右クリックを押し、[New File]をクリックします。ファイル名を[hello.py]と入力してください。
[hello.py]をダブルクリックし、ファイルを開き、以下のコードを貼り付けてください。
import json
def handler(event, context):
print('request: {}'.format(json.dumps(event)))
return {
'statusCode': 200,
'headers': {
'Content-Type': 'text/plain'
},
'body': 'Hello, CDK! You have hit {}\n'.format(event['path'])
}
完了しましたら、[Ctrl ]+ [s]で上書き保存します。
●app.py編集
app.pyも以下のように修正します。
#!/usr/bin/env python3
import os
import aws_cdk as cdk
from cdk_workshop.cdk_workshop_stack import CdkWorkshopStack
app = cdk.App()
CdkWorkshopStack(app, "CdkWorkshopStack")
app.synth()
↓
完了しましたら、[Ctrl ]+ [s]で上書き保存します。
●cdk synth
cdk synth コマンドは、CDK アプリケーションのコードから AWS CloudFormation テンプレートを合成(生成)します。このテンプレートは、CDK コンストラクトを使用して定義されたリソースを含む JSON または YAML 形式のドキュメントです。
以下のコマンド実行してください。
cdk synth
【実行結果】
(.venv) CPI-SAITOU:~/environment/cdk_workshop (master) $ cdk synth
Resources:
HelloHandlerServiceRole11EF7C63:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Rules:
CheckBootstrapVersion:
Assertions:
- Assert:
Fn::Not:
- Fn::Contains:
- - "1"
- "2"
- "3"
- "4"
- "5"
- Ref: BootstrapVersion
AssertDescription: CDK bootstrap stack version 6 required. Please run 'cdk bootstrap' with a recent version of the CDK CLI.
●cdk bootstrap
cdk bootstrap コマンドは、AWS Cloud Development Kit (CDK) を使用するための初期セットアップを行うコマンドです。このコマンドは、CDK アプリケーションをデプロイする前に、IAMロールやS3バケットを準備します。
以下のコマンド実行してください。
cdk bootstrap
●cdk deploy(Lambda)
cdk deploy コマンドは、cdk synth で生成された CloudFormation テンプレートを使用して、AWS にリソースをデプロイします。このコマンドは、実際に AWS にリソースを作成または更新します。※リージョンごとに実行が必要です。
以下のコマンド実行してください。
cdk deploy
[y]を入力します。
Do you wish to deploy these changes (y/n)? y
【実行結果】
CdkWorkshopStack: deploying... [1/1]
CdkWorkshopStack: creating CloudFormation changeset...
✅ CdkWorkshopStack
✨ Deployment time: 36.38s
●Lambda実行テスト
AWSコンソール画面でLambdaダッシュボード画面にアクセスし、作成されたLambda関数をクリックします。
↓[コードソース]にある[Test]をクリックします。
↓以下の設定値を入力・選択し、[保存]をクリックします。
イベント名: test
テンプレート: apigateway-aws-proxy
↓もう一度、[Test]をクリックします。
[Response]欄に[statuCode: 200]と表示されていたらOKです。
■Amazon API Gateway作成
AWS Lambdaのセットアップが完了したので、次にAmazon API Gatewayを作成していきます。API Gatewayを使用すると、curlやウェブブラウザなどのHTTPクライアントを通じてインターネットからアクセス可能なパブリックなHTTPエンドポイントを提供できます。設定した任意のURLパスへのリクエストは、すべてLambda関数に直接転送され、その関数からの応答がユーザーに直接返されます。
●cdk_workshop_stack.py追加修正
Amazon API Gatewayを作成する記述を追加します。[cdk_workshop_stack.py]を以下のように修正してください。
from constructs import Construct
from aws_cdk import (
Stack,
aws_lambda as _lambda,
aws_apigateway as apigw,
)
class CdkWorkshopStack(Stack):
def __init__(self, scope: Construct, id: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
my_lambda = _lambda.Function(
self, 'HelloHandler',
runtime=_lambda.Runtime.PYTHON_3_9,
code=_lambda.Code.from_asset('lambda'),
handler='hello.handler',
)
apigw.LambdaRestApi(
self, 'Endpoint',
handler=my_lambda,
)
↓
修正が完了しましたら、[Ctrl ]+ [s]で上書き保存します。
●cdk diff
cdk diff コマンドは、ローカルの CDK アプリケーションと実際にデプロイされているスタックとの間の差分を表示します。これにより、次の cdk deploy 実行時にどのような変更が AWS リソースに適用されるかを事前に確認することができます
現在の環境との差分を確認します。以下のコマンドを実行してください。
cdk diff
↓Amazon API Gatewayを追加しただけですが、それに合わせて複数のリソースが作られることがわかります。
●cdk deploy(Lambda,API Gateway)
デプロイを実行します。以下のコマンドを実行してください。
cdk deploy
[y]を入力してください。
Do you wish to deploy these changes (y/n)? y
●動作確認
作成が完了しました。[Outputs]にEndpointが表示されています。
CdkWorkshopStack: deploying... [1/1]
CdkWorkshopStack: creating CloudFormation changeset...
✅ CdkWorkshopStack
✨ Deployment time: 31.54s
Outputs:
CdkWorkshopStack.Endpoint8024A810 = https://xxxxxx.execute-api.ap-southeast-1.amazonaws.com/prod/
curlコマンド、もしくはURLをクリックしブラウザで表示してみましょう。
curl -i https://
【実行結果】
Hello, CDK! You have hit /
↓ブラウザから見ると、
今回のハンズオンは以上です。
■クリーンアップ
さいごに作成したAWSリソースをクリーンアップしていきます。
●cdk destroy
cdk destroy コマンドは、インフラストラクチャを削除するために使用されます。このコマンドは、CDKで定義されたリソースを管理しているAWS CloudFormationスタックを削除し、それによって生成されたすべてのリソースをクリーンアップします。
以下のコマンドを実行してください。
cdk destroy
●ロググループ削除
上記でcdk destroyコマンドを実行するとすべて消えるように説明しましたが、各サービス作成時にさらに作成されるリソースのいくつかが漏れます。AWS Lambda作成時に作成されるCloud Watchのロググループもその一つです。ログは不要という方は、別途削除しましょう。
●Cloud9削除
さいごにCloud9を削除しましょう。
↓作成したCloud9を選択し、[削除]をクリックします。
クリーンアップは以上です。
まとめ
わたしは現プロジェクトでAWS CDKを使うことになったので、AWS CDKがどんなものかハンズオンを実施してみました。
正直IaCツールの中でAWS CDKを使っている人の割合が小さい印象があり、ブログ記事も他のツールに比べ少ないです。
しかし、AWSリソースを作成するという点では、AWS CDKは他のツールと比べて抜きんでていると思います。AWS CDKに興味がある方はぜひ、CDK Workshopを見てみてください。
参考リンク: AWS公式ドキュメント、CDK Workshop
↓ほかの協栄情報メンバーもEBSについての記事を公開しています。ぜひ参考にしてみてください。
■【AWS CDK】3分でつかむ、ライブラリとしてのAWS CDK(tanaka.h)