AWS CDKはじめました【実践編】

AWSリソースをコードを利用して作成する方法はいくつかあります。IaCツールとしては、CloudFormationやTerraform、Ansible、Pulumiが有名ですよね。

 

しかし、わたしは上記以外の方法である、AWS CDK (Amazon Web Services Cloud Development Kit)について学び始めました。

 

今回の記事は実際にAWS CDKを動かしてみてどういったツールなのかを知るキッカケになる内容です。

 

前編である「AWS CDKはじめました【概要編】」では、AWS CDKについて基本を押さえるために知っておくべきことを紹介していますので、さきに読んでみてください。

 

AWS CDKハンズオンをやってみる

cdk-entry-handson構成図

今回紹介するハンズオンは「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 設定 デフォルト
タグ 任意

 

↓入力が完了したら、[作成]をクリックします。

 

cdk-entry-handsonCloud9作成

 

↓[1 個の環境が正常に作成されました。]と表示されたら、[開く]をクリックします。

 

cdk-entry-handsonCloud9実行

 

↓次の画面が表示されたらOKです。

 

cdk-entry-handsonCloud9TOP

 

「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',
        )

 

cdk-entry-handsonStack修正2

 

完了しましたら、[Ctrl ]+ [s]で上書き保存します。

 

●Lambda関数で使用するhello.py作成

Lambda関数で利用するコードを格納します。app.pyと同じディレクトリ内に[lambda]というディレクトリを作成します。

 

 

 

[cdk_workshop]にポインタを合わせ、右クリックを押し、[New Folder]をクリックします。[lambda]と入力しましょう。

 

cdk-entry-handsonフォルダ作成1

 

 

cdk-entry-handsonフォルダ作2

 

作成した[lambda]ディレクトリにポインタを合わせ、右クリックを押し、[New File]をクリックします。ファイル名を[hello.py]と入力してください。

 

cdk-entry-handsonファイル作成1

 

[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'])
    }

 

cdk-entry-handsonファイル作2

 

完了しましたら、[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()

 

cdk-entry-handsonapp.py修正1

 

 

cdk-entry-handsonapp.py修正2

 

完了しましたら、[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関数をクリックします。

 

cdk-entry-handsonlambda確認1

 

↓[コードソース]にある[Test]をクリックします。

 

cdk-entry-handsonlambda確認2

 

↓以下の設定値を入力・選択し、[保存]をクリックします。
イベント名: test
テンプレート: apigateway-aws-proxy

 

cdk-entry-handsonlambda確認3

 

↓もう一度、[Test]をクリックします。

 

cdk-entry-handsonlambda確認4

 

[Response]欄に[statuCode: 200]と表示されていたらOKです。

 

cdk-entry-handsonlambda確認5

 

 

■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,
        )

 

cdk-entry-handsonStack修正1

 

 

cdk-entry-handsonStack修正2

 

修正が完了しましたら、[Ctrl ]+ [s]で上書き保存します。

 

 

●cdk diff

cdk diff コマンドは、ローカルの CDK アプリケーションと実際にデプロイされているスタックとの間の差分を表示します。これにより、次の cdk deploy 実行時にどのような変更が AWS リソースに適用されるかを事前に確認することができます

 

現在の環境との差分を確認します。以下のコマンドを実行してください。

cdk diff

 

↓Amazon API Gatewayを追加しただけですが、それに合わせて複数のリソースが作られることがわかります。

 

cdk-entry-handsondiff確認

 

●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 /

 

↓ブラウザから見ると、

 

cdk-entry-handson動作確認

 

今回のハンズオンは以上です。

 

 

■クリーンアップ

さいごに作成したAWSリソースをクリーンアップしていきます。

 

●cdk destroy

cdk destroy コマンドは、インフラストラクチャを削除するために使用されます。このコマンドは、CDKで定義されたリソースを管理しているAWS CloudFormationスタックを削除し、それによって生成されたすべてのリソースをクリーンアップします。

 
以下のコマンドを実行してください。

cdk destroy

 

●ロググループ削除

上記でcdk destroyコマンドを実行するとすべて消えるように説明しましたが、各サービス作成時にさらに作成されるリソースのいくつかが漏れます。AWS Lambda作成時に作成されるCloud Watchのロググループもその一つです。ログは不要という方は、別途削除しましょう。

 

●Cloud9削除

さいごにCloud9を削除しましょう。

 

↓作成したCloud9を選択し、[削除]をクリックします。

 

cdk-entry-handson削除

 

クリーンアップは以上です。

 

 

まとめ

わたしは現プロジェクトで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)

 

Last modified: 2024-05-06

Author