CDK(Cloud Development Kit) Workshopをやってみた。

2023.08.15

このブログでは、CDK を使用してアプリを作成およびデプロイする方法を学びましょう。

CDKWorkshopを参照として使用してこれを実行しました。これは非常に簡単です

CDK の紹介

CDK は、サポートされているプログラミング言語のいずれかでクラウド インフラストラクチャをコードとして定義できるクラウド開発キットです。

CDK は、AWS の主要な概念に基づいて設計されています。

  • AWS SDK アプリは、TypeScript、JavaScript、Python、Java、C#、または Go で書かれたアプリケーションです。
  • アプリは 1 つ以上のスタックを定義します。
  • スタックにはコンポーネントが含まれます。
  • 各構成では、次のような 1 つ以上の AWS リソースが定義されます:
    • S3 Bucket
    • AWS Lambda
    • Amazon DynamoDB テーブル

CDK プロジェクト

新しい AWS CDK TypeScript プロジェクトを作成しましょう!

CDK init

プロジェクトディレクトリを作成する

空のディレクトリを作成しましょう

mkdir cdk-workshop && cd cdk-workshop

CDK init

新しい Typescript プロジェクトを作成する

cdk init sample-app --language typescript

実行したコマンドをリストした出力が得られます。

プロジェクト

ここでプロジェクトを詳しく見てみましょう。Visual Studio code を使用しました

IDE を開いてプロジェクト ディレクトリを調べてみましょう

 

  • lib/cdk-workshop-stack.ts

    ここで CDK アプリケーションのメイン スタックが定義され、コードを記述します。

  • bin/cdk-workshop.ts

    アプリケーションのエントリポイントです。 上記のポイントで定義したスタックをロードします。

CDK synth

CDK アプリが実行されると、アプリケーションで定義されたスタックごとに AWS クラウド形成テンプレートが生成されます。

CDK アプリを合成するには、クラウド形成テンプレートを使用して合成します

cdk syth

ご覧のとおり、このテンプレートには 4つのリソースが含まれています。

  • AWS::SQS::Queue
  • AWS::SNS::Topic
  • AWS::SNS::Subscription
  • AWS::SQS::QueuePolicy

CDK のデプロイ

環境のブートストラップ

初めて CDK アプリを AWS アカウントにデプロイするときに、S3 バケットなどの AWS リソースを含めるのに役立つブートストラップ スタックをインストールできます。

cdk bootstrap

デプロイしてみよう!

cdk deploy

CDK が当社に代わって行うセキュリティ関連の変更についてはお知らせします。

Cloudformation コンソール

CDK アプリは AWS クラウド フォーメーションを通じてデプロイされます。これは、AWS クラウド フォーメーション コンソールを使用してスタックを管理できることを意味します。

それでは、AWS CloudFormation コンソールを開いて見てみましょう。

 

CdkWorkshopStack を選択して [リソース] タブを開くと、リソースの物理的なアイデンティティが表示されます。

cdk synth を実行すると、テンプレートに表示されている 4 つのリソースがすべて表示されます。これは、cloudformation コンソールで確認できます。

 

 

Hello CDK

ユーザーがエンドポイント内の任意の URL にアクセスし、関数から挨拶を受信できるようにする CDK コードを作成します。 API Gateway エンドポイントでラムダ関数を使用します。CDKworkshop で述べたように、私のような初心者にとっては簡単です。

Hello Lambda

Lambdaハンドラーコード

    • プロジェクト ツリーのルート (bin と lib の隣) にディレクトリ lambda を作成します。
    • 次の内容を含む lambda/hello.js というファイルを追加します。

exports.handler = async function(event) {
  console.log("request:", JSON.stringify(event));
  return {
    statusCode: 200,
    headers: { "Content-Type": "text/plain" },
    body: `CDK! You've hit ${event.path}\n`
  };
};

これは、「CDK! You've hit URL[URL path]」というテキストを返す単純な Lambda 関数です。 この関数の出力には、HTTP ステータス コードと HTTP ヘッダーも含まれます。 これらは、ユーザーへの HTTP 応答を構築するために API Gateway によって使用されます。これは次のステップで実装します。

AWS Lambda 関数を STACK に追加する

  • import * as cdk from 'aws-cdk-lib';
    import * as lambda from 'aws-cdk-lib/aws-lambda';
    
    export class CdkWorkshopStack extends cdk.Stack {
      constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
        super(scope, id, props);
    
        // defines an AWS Lambda resource
        const hello = new lambda.Function(this, 'HelloHandler', {
          runtime: lambda.Runtime.NODEJS_16_X,    // execution environment
          code: lambda.Code.fromAsset('lambda'),  // code loaded from "lambda" directory
          handler: 'hello.handler'                // file is "hello", function is "handler"
        });
      }
    }
  • cdkデプロイを使用してデプロイしましょう
    cdk deploy

テスト

  • AWS Lambdaコンソールを開きます
  • 「テスト」ボタンをクリックして「テスト イベントの構成」ダイアログを開きます。
  • イベントテンプレートリストからAmazon API Gateway AWS Proxyを選択します。
  • [イベント名] に「test」と入力します。
  • 「SAVE」をクリックします。
  • もう一度 [テスト] をクリックし、実行が完了するまで待ちます。

ステータス 200 の出力と、目的のメッセージを含む本文を取得できました。

Api gateway

API Gateway は、インターネット上の誰もが HTTP を使用してアクセスできるパブリック HTTP エンドポイントを公開します。
API のルートにマウントされた Lambda プロキシ統合を使用します。 これは、任意の URL パスへのリクエストが Lambda 関数に直接プロキシされ、関数からの応答が返されることを意味します。
lib/cdk-workshop-stack.ts に戻り、API エンドポイントを定義し、Lambda 関数に関連付けます。
import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as apigw from 'aws-cdk-lib/aws-apigateway';

export class CdkWorkshopStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // defines an AWS Lambda resource
    const hello = new lambda.Function(this, 'HelloHandler', {
      runtime: lambda.Runtime.NODEJS_14_X,    // execution environment
      code: lambda.Code.fromAsset('lambda'),  // code loaded from "lambda" directory
      handler: 'hello.handler'                // file is "hello", function is "handler"
    });

    // defines an API Gateway REST API resource backed by our "hello" function.
    new apigw.LambdaRestApi(this, 'Endpoint', {
      handler: hello
    });

  }
}

これは、すべてのリクエストを AWS Lambda 関数にプロキシする API ゲートウェイを定義するために必要な作業です。 cdkデプロイを使用してデプロイしましょう

cdk deploy

テスト

デプロイが完了すると、次の行が表示されることに気づきます。

これはスタック出力です このエンドポイントをbrowserでヒットしてみます。 URLをコピーして実行します。

ブラウザで URL を実行すると、出力としてメッセージを取得できました。

結論として、AWS CDK は、コードを使用してクラウド インフラストラクチャを定義およびデプロイするための強力なツールです。 このブログで説明されている手順に従うことで、アプリケーションを迅速に作成してデプロイできます。 このブログは、https://cdkworkshop.com/ja/20-typescript/30-hello-cdk/200-lambda.html を参考にして試してみました。これは非常に簡単です。