チュートリアル: 最初の AWS CDK アプリケーションを作成する - AWS Cloud Development Kit (AWS CDK) v2

これは AWS CDK v2 デベロッパーガイドです。古い CDKv1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

チュートリアル: 最初の AWS CDK アプリケーションを作成する

コマンド AWS CDK ラインインターフェイス (AWS CDK CLI) を使用して最初のCDKアプリケーションを開発し、 AWS 環境をブートストラップし、アプリケーションを にデプロイ AWS Cloud Development Kit (AWS CDK) して、 の使用を開始します AWS。

前提条件

このチュートリアルを開始する前に、「」のすべてのセットアップステップを完了してくださいの開始方法 AWS CDK

このチュートリアルの内容

このチュートリアルでは、 AWS を使用して にシンプルなアプリケーションを作成してデプロイします AWS CDK。アプリケーションは、呼び出されたときにHello World!メッセージを返す AWS Lambda 関数で構成されます。関数は、Lambda 関数URLの専用 HTTP(S) エンドポイントとして機能する Lambda 関数を介して呼び出されます。

このチュートリアルでは、以下を実行します。

  • プロジェクトの作成 — CDK CLI cdk init コマンドを使用してCDKプロジェクトを作成します。

  • AWS 環境の設定 — アプリケーションをデプロイする AWS 環境を設定します。

  • AWS 環境をブートストラップする — CDK CLI cdk bootstrap コマンドを使用して AWS 環境をブートストラップして、デプロイ用に準備します。

  • アプリの開発 — コンストラクトライブラリの AWS コンストラクトを使用して、Lambda 関数と Lambda 関数URLリソースを定義します。

  • デプロイ用にアプリを準備する – CDKCLIを使用してアプリを構築し、 AWS CloudFormation テンプレートを合成します。

  • アプリケーションをデプロイする – CDK CLI cdk deploy コマンドを使用してアプリケーションをデプロイし、 AWS リソースをプロビジョニングします。

  • アプリケーションを操作する – デプロイした Lambda 関数を呼び出してレスポンスを受け取る AWS ことで、 で操作します。

  • アプリケーションの変更 – Lambda 関数を変更し、変更を実装するためにデプロイします。

  • アプリケーションの削除 – CDK CLI cdk destroy コマンドを使用して作成したすべてのリソースを削除します。

ステップ 1: CDKプロジェクトを作成する

このステップでは、新しいCDKプロジェクトを作成します。CDK プロジェクトは、独自のローカルモジュールの依存関係を持つ独自のディレクトリにある必要があります。

CDK プロジェクトを作成するには
  1. 選択した開始ディレクトリから、 という名前のディレクトリを作成して移動しますhello-cdk

    $ mkdir hello-cdk && cd hello-cdk
    重要

    プロジェクトディレクトリにはhello-cdk必ず、ここに示すとおりに という名前を付けます。CDK CLI は、このディレクトリ名を使用してCDKコード内のモノに名前を付けます。別のディレクトリ名を使用すると、このチュートリアル中に問題が発生します。

  2. hello-cdk ディレクトリから、 CDK CLI cdk init コマンドを使用して新しいCDKプロジェクトを初期化します。--language オプションを使用して、appテンプレートと任意のプログラミング言語を指定します。

    TypeScript
    $ cdk init app --language typescript
    JavaScript
    $ cdk init app --language javascript
    Python
    $ cdk init app --language python

    アプリケーションを作成したら、次の 2 つのコマンドも入力します。これにより、アプリケーションのPython仮想環境がアクティブ化され、 AWS CDK コア依存関係がインストールされます。

    $ source .venv/bin/activate # On Windows, run `.\venv\Scripts\activate` instead $ python -m pip install -r requirements.txt
    Java
    $ cdk init app --language java

    を使用している場合はIDE、プロジェクトを開くかインポートできるようになりました。例えばEclipse、 で、ファイル > インポート > Maven > 既存の Maven プロジェクト を選択します。プロジェクト設定が Java 8 (1.8) を使用するように設定されていることを確認します。

    C#
    $ cdk init app --language csharp

    Visual Studio を使用している場合は、 src ディレクトリでソリューションファイルを開きます。

    Go
    $ cdk init app --language go

    アプリを作成したら、次のコマンドを入力して、アプリに必要な AWS コンストラクトライブラリモジュールをインストールします。

    $ go get

cdk init コマンドは、 hello-cdk ディレクトリ内にファイルとフォルダの構造を作成し、CDKアプリケーションのソースコードを整理しやすくします。このファイルとフォルダの構造はCDK、プロジェクト と呼ばれます。少し時間をとってCDKプロジェクトを探索してください。

Git がインストールされている場合、 を使用して作成した各プロジェクトcdk initもGitリポジトリとして初期化されます。

プロジェクトの初期化中に、 は 1 つのCDKスタックを含むCDKアプリケーションCDKCLIを作成します。CDK アプリケーションインスタンスは、 Appコンストラクトを使用して作成されます。以下は、CDKアプリケーションファイルからのこのコードの一部です。

TypeScript

にありますbin/hello-cdk.ts

#!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { HelloCdkStack } from '../lib/hello-cdk-stack'; const app = new cdk.App(); new HelloCdkStack(app, 'HelloCdkStack', { });
JavaScript

にありますbin/hello-cdk.js

#!/usr/bin/env node const cdk = require('aws-cdk-lib'); const { HelloCdkStack } = require('../lib/hello-cdk-stack'); const app = new cdk.App(); new HelloCdkStack(app, 'HelloCdkStack', { });
Python

にありますapp.py

#!/usr/bin/env python3 import os import aws_cdk as cdk from hello_cdk.hello_cdk_stack import HelloCdkStack app = cdk.App() HelloCdkStack(app, "HelloCdkStack",) app.synth()
Java

にありますsrc/main/java/.../HelloCdkApp.java

package com.myorg; import software.amazon.awscdk.App; import software.amazon.awscdk.Environment; import software.amazon.awscdk.StackProps; import java.util.Arrays; public class HelloCdkApp { public static void main(final String[] args) { App app = new App(); new HelloCdkStack(app, "HelloCdkStack", StackProps.builder() .build()); app.synth(); } }
C#

にありますsrc/HelloCdk/Program.cs

using Amazon.CDK; using System; using System.Collections.Generic; using System.Linq; namespace HelloCdk { sealed class Program { public static void Main(string[] args) { var app = new App(); new HelloCdkStack(app, "HelloCdkStack", new StackProps {}); app.Synth(); } } }
Go

にありますhello-cdk.go

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) // ... func main() { defer jsii.Close() app := awscdk.NewApp(nil) NewHelloCdkStack(app, "HelloCdkStack", &HelloCdkStackProps{ awscdk.StackProps{ Env: env(), }, }) app.Synth(nil) } // ...

CDK スタックは Stackコンストラクトを使用して作成されます。CDK スタックファイルからこのコードの一部を次に示します。

TypeScript

にありますlib/hello-cdk-stack.ts

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define your constructs here } }
JavaScript

にありますlib/hello-cdk-stack.js

const { Stack } = require('aws-cdk-lib'); class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define your constructs here } } module.exports = { HelloCdkStack }
Python

にありますhello_cdk/hello_cdk_stack.py

from aws_cdk import ( Stack, ) from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define your constructs here
Java

にありますsrc/main/java/.../HelloCdkStack.java

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define your constructs here } }
C#

にありますsrc/HelloCdk/HelloCdkStack.cs

using Amazon.CDK; using Constructs; namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define your constructs here } } }
Go

にありますhello-cdk.go

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) type HelloCdkStackProps struct { awscdk.StackProps } func NewHelloCdkStack(scope constructs.Construct, id string, props *HelloCdkStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) return stack } // ...

ステップ 2: AWS 環境を設定する

このステップでは、CDKスタックの AWS 環境を設定します。これにより、CDKスタックをデプロイする環境を指定します。

まず、使用する AWS 環境を決定します。 AWS 環境は AWS アカウント と で構成されます AWS リージョン。

を使用してローカルマシンでセキュリティ認証情報 AWS CLI を設定する場合、 を使用して特定のプロファイルの AWS 環境情報 AWS CLI を取得できます。

を使用して AWS アカウント ID AWS CLI を取得するには
  1. 次の AWS CLI コマンドを実行して、defaultプロファイルの AWS アカウント ID を取得します。

    $ aws sts get-caller-identity --query "Account" --output text
  2. 名前付きプロファイルを使用する場合は、 --profileオプションを使用してプロファイルの名前を指定します。

    $ aws sts get-caller-identity --profile your-profile-name --query "Account" --output text
を使用して AWS CLI を取得するには AWS リージョン
  1. 次の AWS CLI コマンドを実行して、defaultプロファイルに設定したリージョンを取得します。

    $ aws configure get region
  2. 名前付きプロファイルを使用する場合は、 --profileオプションを使用してプロファイルの名前を指定します。

    $ aws configure get region --profile your-profile-name

次に、アプリケーションファイル HelloCdkStackインスタンスを変更して、CDKスタックの AWS 環境を設定します。このチュートリアルでは、 AWS 環境情報をハードコーディングします。これは本番環境で推奨されます。環境を設定するその他の方法については、「」を参照してくださいで使用する環境を設定する AWS CDK

CDK スタックの環境を設定するには
  • アプリケーションファイル でStackコンストラクトの envプロパティを使用して環境を設定します。以下に例を示します。

    TypeScript

    にありますbin/hello-cdk.ts

    #!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { HelloCdkStack } from '../lib/hello-cdk-stack'; const app = new cdk.App(); new HelloCdkStack(app, 'HelloCdkStack', { env: { account: '123456789012', region: 'us-east-1' }, });
    JavaScript

    にありますbin/hello-cdk.js

    #!/usr/bin/env node const cdk = require('aws-cdk-lib'); const { HelloCdkStack } = require('../lib/hello-cdk-stack'); const app = new cdk.App(); new HelloCdkStack(app, 'HelloCdkStack', { env: { account: '123456789012', region: 'us-east-1' }, });
    Python

    にありますapp.py

    #!/usr/bin/env python3 import os import aws_cdk as cdk from hello_cdk.hello_cdk_stack import HelloCdkStack app = cdk.App() HelloCdkStack(app, "HelloCdkStack", env=cdk.Environment(account='123456789012', region='us-east-1'), ) app.synth()
    Java

    にありますsrc/main/java/.../HelloCdkApp.java

    package com.myorg; import software.amazon.awscdk.App; import software.amazon.awscdk.Environment; import software.amazon.awscdk.StackProps; import java.util.Arrays; public class HelloCdkApp { public static void main(final String[] args) { App app = new App(); new HelloCdkStack(app, "HelloCdkStack", StackProps.builder() .env(Environment.builder() .account("123456789012") .region("us-east-1") .build()) .build()); app.synth(); } }
    C#

    にありますsrc/HelloCdk/Program.cs

    using Amazon.CDK; using System; using System.Collections.Generic; using System.Linq; namespace HelloCdk { sealed class Program { public static void Main(string[] args) { var app = new App(); new HelloCdkStack(app, "HelloCdkStack", new StackProps { Env = new Amazon.CDK.Environment { Account = "123456789012", Region = "us-east-1", } }); app.Synth(); } } }
    Go

    にありますhello-cdk.go

    package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" ) // ... func main() { defer jsii.Close() app := awscdk.NewApp(nil) NewHelloCdkStack(app, "HelloCdkStack", &HelloCdkStackProps{ awscdk.StackProps{ Env: env(), }, }) app.Synth(nil) } func env() *awscdk.Environment { return &awscdk.Environment{ Account: jsii.String("123456789012"), Region: jsii.String("us-east-1"), } }

ステップ 3: AWS 環境をブートストラップする

このステップでは、前のステップで設定した AWS 環境をブートストラップします。これにより、環境をCDKデプロイする準備が整います。

環境をブートストラップするには、CDKプロジェクトのルートから以下を実行します。

$ cdk bootstrap

CDK プロジェクトのルートからブートストラップすることで、追加情報を提供する必要はありません。は、プロジェクトから環境情報CDKCLIを取得します。CDK プロジェクトの外部でブートストラップする場合は、 cdk bootstrap コマンドを使用して環境情報を提供する必要があります。詳細については、「で使用する環境をブートストラップする AWS CDK」を参照してください。

ステップ 4: CDKアプリを構築する

ほとんどのプログラミング環境では、変更後にコードを構築またはコンパイルします。はこのステップを自動的に実行する AWS CDK ためCDKCLI、 では必要ありません。ただし、構文と型エラーをキャッチする場合は、手動で構築できます。以下に例を示します。

TypeScript
$ npm run build > hello-cdk@0.1.0 build > tsc
JavaScript

ビルドステップは必要ありません。

Python

ビルドステップは必要ありません。

Java
$ mvn compile -q

または、Eclipse Control-Bで を押します (他の Java IDEsは異なる場合があります)

C#
$ dotnet build src

または、Visual Studio で F6 キーを押します。

Go
$ go build

ステップ 5: アプリ内のCDKスタックを一覧表示する

この時点で、1 つのCDKスタックを含むCDKアプリが必要です。確認するには、 CDK CLI cdk list コマンドを使用してスタックを表示します。出力には、 という名前のスタックが 1 つ表示されますHelloCdkStack

$ cdk list HelloCdkStack

この出力が表示されない場合は、プロジェクトの正しい作業ディレクトリにあることを確認し、もう一度試してください。それでもスタックが表示されない場合は、 を繰り返しステップ 1: CDKプロジェクトを作成するて再試行してください。

ステップ 6: Lambda 関数を定義する

このステップでは、 AWS コンストラクトライブラリからaws_lambdaモジュールをインポートし、L2 Function コンストラクトを使用します。

CDK スタックファイルを次のように変更します。

TypeScript

にありますlib/hello-cdk-stack.ts

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; // Import the Lambda module import * as lambda from 'aws-cdk-lib/aws-lambda'; export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), }); } }
JavaScript

にありますlib/hello-cdk-stack.js

const { Stack } = require('aws-cdk-lib'); // Import the Lambda module const lambda = require('aws-cdk-lib/aws-lambda'); class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `), }); } } module.exports = { HelloCdkStack }
Python

にありますhello_cdk/hello_cdk_stack.py

from aws_cdk import ( Stack, aws_lambda as _lambda, # Import the Lambda module ) from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define the Lambda function resource my_function = _lambda.Function( self, "HelloWorldFunction", runtime = _lambda.Runtime.NODEJS_20_X, # Provide any supported Node.js runtime handler = "index.handler", code = _lambda.Code.from_inline( """ exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; """ ), )
Java

にありますsrc/main/java/.../HelloCdkStack.java

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; // Import Lambda function import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Runtime; public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define the Lambda function resource Function myFunction = Function.Builder.create(this, "HelloWorldFunction") .runtime(Runtime.NODEJS_20_X) // Provide any supported Node.js runtime .handler("index.handler") .code(Code.fromInline( "exports.handler = async function(event) {" + " return {" + " statusCode: 200," + " body: JSON.stringify('Hello World!')" + " };" + "};")) .build(); } }
C#

にありますsrc/main/java/.../HelloCdkStack.java

using Amazon.CDK; using Constructs; // Import the Lambda module using Amazon.CDK.AWS.Lambda; namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define the Lambda function resource var myFunction = new Function(this, "HelloWorldFunction", new FunctionProps { Runtime = Runtime.NODEJS_20_X, // Provide any supported Node.js runtime Handler = "index.handler", Code = Code.FromInline(@" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; "), }); } } }
Go

にありますhello-cdk.go

package main import ( "github.com/aws/aws-cdk-go/awscdk/v2" "github.com/aws/constructs-go/constructs/v10" "github.com/aws/jsii-runtime-go" // Import the Lambda module "github.com/aws/aws-cdk-go/awscdk/v2/awslambda" ) type HelloCdkStackProps struct { awscdk.StackProps } func NewHelloCdkStack(scope constructs.Construct, id string, props *HelloCdkStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define the Lambda function resource myFunction := awslambda.NewFunction(stack, jsii.String("HelloWorldFunction"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_20_X(), // Provide any supported Node.js runtime Handler: jsii.String("index.handler"), Code: awslambda.Code_FromInline(jsii.String(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; `)), }) return stack } // ...

Function コンストラクトを詳しく見てみましょう。すべてのコンストラクトと同様に、 Function クラスは 3 つのパラメータを取ります。

  • scopeStackインスタンスを Functionコンストラクトの親として定義します。 AWS リソースを定義するすべてのコンストラクトは、スタックの範囲内で作成されます。コンストラクト内でコンストラクトを定義し、階層 (ツリー) を作成できます。ここで、ほとんどの場合、スコープは this (self の ) ですPython。

  • ID – AWS CDK アプリFunction内の の論理 ID。この ID と、スタック内の関数の場所に基づくハッシュは、デプロイ中に関数を一意に識別します。は、アプリで コンストラクトを更新し、デプロイされたリソースを更新するために再デプロイするときに AWS CDK も、この ID を参照します。ここで、論理 ID は ですHelloWorldFunction。関数には、 functionNameプロパティで指定された名前を付けることもできます。これは論理 ID とは異なります。

  • props – 関数のプロパティを定義する値のバンドル。ここでは、runtime、、handlerおよび codeプロパティを定義します。

    Props は、 でサポートされている言語で異なる表現になっています AWS CDK。

    • TypeScript および ではJavaScript、 propsは単一の引数であり、目的のプロパティを含むオブジェクトを渡します。

    • ではPython、props はキーワード引数として渡されます。

    • ではJava、props を渡すための Builder が提供されています。2 つあります。1 つは 用FunctionProps、もう 1 つは 用で、コンストラクトとその props オブジェクトを 1 ステップで構築Functionできます。このコードは後者を使用します。

    • ではC#、FunctionPropsオブジェクトイニシャライザを使用してオブジェクトをインスタンス化し、3 番目のパラメータとして渡します。

    コンストラクトの props がオプションの場合、 propsパラメータを完全に省略できます。

すべてのコンストラクトはこれらと同じ 3 つの引数を取るため、新しい引数について学習しても、常に向きを合わせることは簡単です。また、予想どおり、任意のコンストラクトをサブクラスして、ニーズに合わせて拡張したり、デフォルトを変更したりできます。

ステップ 7: Lambda 関数を定義する URL

このステップでは、 FunctionコンストラクトのaddFunctionUrlヘルパーメソッドを使用して Lambda 関数 を定義しますURL。デプロイURL時にこの値を出力するには、 CfnOutputコンストラクトを使用して AWS CloudFormation 出力を作成します。

CDK スタックファイルに以下を追加します。

TypeScript

にありますlib/hello-cdk-stack.ts

// ... export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Define the Lambda function resource // ... // Define the Lambda function URL resource const myFunctionUrl = myFunction.addFunctionUrl({ authType: lambda.FunctionUrlAuthType.NONE, }); // Define a CloudFormation output for your URL new cdk.CfnOutput(this, "myFunctionUrlOutput", { value: myFunctionUrl.url, }) } }
JavaScript

にありますlib/hello-cdk-stack.js

const { Stack, CfnOutput } = require('aws-cdk-lib'); // Import CfnOutput class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Define the Lambda function resource // ... // Define the Lambda function URL resource const myFunctionUrl = myFunction.addFunctionUrl({ authType: lambda.FunctionUrlAuthType.NONE, }); // Define a CloudFormation output for your URL new CfnOutput(this, "myFunctionUrlOutput", { value: myFunctionUrl.url, }) } } module.exports = { HelloCdkStack }
Python

にありますhello_cdk/hello_cdk_stack.py

from aws_cdk import ( # ... CfnOutput # Import CfnOutput ) from constructs import Construct class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Define the Lambda function resource # ... # Define the Lambda function URL resource my_function_url = my_function.add_function_url( auth_type = _lambda.FunctionUrlAuthType.NONE, ) # Define a CloudFormation output for your URL CfnOutput(self, "myFunctionUrlOutput", value=my_function_url.url)
Java

にありますsrc/main/java/.../HelloCdkStack.java

package com.myorg; // ... // Import Lambda function URL import software.amazon.awscdk.services.lambda.FunctionUrl; import software.amazon.awscdk.services.lambda.FunctionUrlAuthType; import software.amazon.awscdk.services.lambda.FunctionUrlOptions; // Import CfnOutput import software.amazon.awscdk.CfnOutput; public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Define the Lambda function resource // ... // Define the Lambda function URL resource FunctionUrl myFunctionUrl = myFunction.addFunctionUrl(FunctionUrlOptions.builder() .authType(FunctionUrlAuthType.NONE) .build()); // Define a CloudFormation output for your URL CfnOutput.Builder.create(this, "myFunctionUrlOutput") .value(myFunctionUrl.getUrl()) .build(); } }
C#

にありますsrc/main/java/.../HelloCdkStack.java

// ... namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Define the Lambda function resource // ... // Define the Lambda function URL resource var myFunctionUrl = myFunction.AddFunctionUrl(new FunctionUrlOptions { AuthType = FunctionUrlAuthType.NONE }); // Define a CloudFormation output for your URL new CfnOutput(this, "myFunctionUrlOutput", new CfnOutputProps { Value = myFunctionUrl.Url }); } } }
Go

にありますhello-cdk.go

// ... func NewHelloCdkStack(scope constructs.Construct, id string, props *HelloCdkStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Define the Lambda function resource // ... // Define the Lambda function URL resource myFunctionUrl := myFunction.AddFunctionUrl(&awslambda.FunctionUrlOptions{ AuthType: awslambda.FunctionUrlAuthType_NONE, }) // Define a CloudFormation output for your URL awscdk.NewCfnOutput(stack, jsii.String("myFunctionUrlOutput"), &awscdk.CfnOutputProps{ Value: myFunctionUrl.Url(), }) return stack } // ...
警告

このチュートリアルを簡単にするために、Lambda 関数URLは認証なしで定義されます。デプロイすると、関数の呼び出しに使用できるパブリックにアクセス可能なエンドポイントが作成されます。このチュートリアルが完了したら、 ステップ 12: アプリケーションを削除するに従ってこれらのリソースを削除します。

ステップ 8: CloudFormation テンプレートを合成する

このステップでは、 CDK CLI cdk synth コマンドを使用して CloudFormation テンプレートを合成することで、デプロイの準備をします。このコマンドは、CDKコードの基本的な検証を実行し、CDKアプリケーションを実行し、CDKスタックから CloudFormation テンプレートを生成します。

アプリケーションに複数のスタックが含まれている場合は、合成するスタックを指定する必要があります。アプリケーションには 1 つのスタックが含まれているため、 は合成するスタックCDKCLIを自動的に検出します。

テンプレートを合成しない場合、デプロイ時に CDKCLIが自動的にこのステップを実行します。ただし、合成エラーをチェックするには、各デプロイの前にこのステップを実行することをお勧めします。

テンプレートを合成する前に、オプションでアプリケーションを構築して構文と型エラーをキャッチできます。手順については、ステップ 4: CDKアプリを構築する を参照してください。

CloudFormation テンプレートを合成するには、プロジェクトのルートから以下を実行します。

$ cdk synth
注記

次のようなエラーが表示された場合は、 hello-cdk ディレクトリにあることを確認し、もう一度試してください。

--app is required either in command-line, in cdk.json or in ~/.cdk.json

成功すると、 CDKCLIは YAMLにフォーマットされた CloudFormation テンプレートを出力stdoutし、 JSONフォーマットされたテンプレートをプロジェクトの cdk.out ディレクトリに保存します。

テンプレートの出力例を次に示します CloudFormation 。

Resources: HelloWorldFunctionServiceRoleunique-identifier: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: lambda.amazonaws.com Version: "2012-10-17" ManagedPolicyArns: - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/ServiceRole/Resource HelloWorldFunctionunique-identifier: Type: AWS::Lambda::Function Properties: Code: ZipFile: " \ exports.handler = async function(event) { \ return { \ statusCode: 200, \ body: JSON.stringify('Hello World!'), \ }; \ }; \ " Handler: index.handler Role: Fn::GetAtt: - HelloWorldFunctionServiceRoleunique-identifier - Arn Runtime: nodejs20.x DependsOn: - HelloWorldFunctionServiceRoleunique-identifier Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/Resource HelloWorldFunctionFunctionUrlunique-identifier: Type: AWS::Lambda::Url Properties: AuthType: NONE TargetFunctionArn: Fn::GetAtt: - HelloWorldFunctionunique-identifier - Arn Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/FunctionUrl/Resource HelloWorldFunctioninvokefunctionurlunique-identifier: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunctionUrl FunctionName: Fn::GetAtt: - HelloWorldFunctionunique-identifier - Arn FunctionUrlAuthType: NONE Principal: "*" Metadata: aws:cdk:path: HelloCdkStack/HelloWorldFunction/invoke-function-url CDKMetadata: Type: AWS::CDK::Metadata Properties: Analytics: v2:deflate64:unique-identifier Metadata: aws:cdk:path: HelloCdkStack/CDKMetadata/Default Condition: CDKMetadataAvailable Outputs: myFunctionUrlOutput: Value: Fn::GetAtt: - HelloWorldFunctionFunctionUrlunique-identifier - FunctionUrl Parameters: BootstrapVersion: Type: AWS::SSM::Parameter::Value<String> Default: /cdk-bootstrap/unique-identifier/version Description: Version of the CDK Bootstrap resources in this environment, automatically retrieved from SSM Parameter Store. [cdk:skip] 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.
注記

生成されたすべてのテンプレートには、デフォルトで AWS::CDK::Metadataリソースが含まれています。 AWS CDK チームはこのメタデータを使用して AWS CDK 使用状況を把握し、改善する方法を見つけます。バージョンレポートをオプトアウトする方法などの詳細については、「」を参照してくださいバージョンレポート

単一の L2 コンストラクトを定義することで、 AWS CDK は Lambda リソースを含む広範な CloudFormation テンプレートを作成し、リソースがアプリケーション内でやり取りするために必要なアクセス許可とグルーロジックを作成します。

ステップ 9: CDKスタックをデプロイする

このステップでは、 CDK CLI cdk deploy コマンドを使用してCDKスタックをデプロイします。このコマンドは、生成された CloudFormation テンプレートを取得し、 を介してデプロイします。これにより AWS CloudFormation、 CloudFormation スタックの一部としてリソースがプロビジョニングされます。

プロジェクトのルートから、以下を実行します。プロンプトが表示されたら、変更を確認します。

$ cdk deploy ✨ Synthesis time: 2.69s HelloCdkStack: start: Building unique-identifier:current_account-current_region HelloCdkStack: success: Built unique-identifier:current_account-current_region HelloCdkStack: start: Publishing unique-identifier:current_account-current_region HelloCdkStack: success: Published unique-identifier:current_account-current_region This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening). Please confirm you intend to make the following modifications: IAM Statement Changes ┌───┬───────────────────────────────────────┬────────┬──────────────────────────┬──────────────────────────────┬───────────┐ │ │ Resource │ Effect │ Action │ Principal │ Condition │ ├───┼───────────────────────────────────────┼────────┼──────────────────────────┼──────────────────────────────┼───────────┤ │ + │ ${HelloWorldFunction.Arn} │ Allow │ lambda:InvokeFunctionUrl │ * │ │ ├───┼───────────────────────────────────────┼────────┼──────────────────────────┼──────────────────────────────┼───────────┤ │ + │ ${HelloWorldFunction/ServiceRole.Arn} │ Allow │ sts:AssumeRole │ Service:lambda.amazonaws.com │ │ └───┴───────────────────────────────────────┴────────┴──────────────────────────┴──────────────────────────────┴───────────┘ IAM Policy Changes ┌───┬───────────────────────────────────┬────────────────────────────────────────────────────────────────────────────────┐ │ │ Resource │ Managed Policy ARN │ ├───┼───────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────┤ │ + │ ${HelloWorldFunction/ServiceRole} │ arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole │ └───┴───────────────────────────────────┴────────────────────────────────────────────────────────────────────────────────┘ (NOTE: There may be security-related changes not in this list. See https://github.com/aws/aws-cdk/issues/1299) Do you wish to deploy these changes (y/n)? y

と同様にcdk synth、アプリケーションには 1 つの AWS CDK スタックが含まれているため、スタックを指定する必要はありません。

デプロイ中、スタックがデプロイされると、 に進行状況情報CDKCLIが表示されます。完了したら、AWS CloudFormation コンソールに移動してHelloCdkStackスタックを表示できます。Lambda コンソールに移動してHelloWorldFunctionリソースを表示することもできます。

デプロイが完了すると、 CDKCLIはエンドポイント を出力しますURL。これを次のステップURLにコピーします。以下に例を示します。

... HelloCdkStack: deploying... [1/1] HelloCdkStack: creating CloudFormation changeset... ✅ HelloCdkStack ✨ Deployment time: 41.65s Outputs: HelloCdkStack.myFunctionUrlOutput = https://<api-id>.lambda-url.<Region>.on.aws/ Stack ARN: arn:aws:cloudformation:Region:account-id:stack/HelloCdkStack/unique-identifier ✨ Total time: 44.34s

ステップ 10: でアプリケーションを操作する AWS

このステップでは、 関数 を介して Lambda 関数を呼び出す AWS ことで、 でアプリケーションとやり取りしますURL。にアクセスするとURL、Lambda 関数はHello World!メッセージを返します。

関数を呼び出すには、URLブラウザまたはコマンドラインから関数にアクセスします。以下に例を示します。

$ curl https://<api-id>.lambda-url.<Region>.on.aws/ "Hello World!"%

ステップ 11: アプリケーションを変更する

このステップでは、Lambda 関数が呼び出されたときに返すメッセージを変更します。CDK CLI cdk diff コマンドを使用して差分を実行し、変更をプレビューし、デプロイしてアプリケーションを更新します。次に、 でアプリケーションとやり取り AWS して、新しいメッセージを確認します。

CDK スタックファイルのmyFunctionインスタンスを次のように変更します。

TypeScript

にありますlib/hello-cdk-stack.ts

// ... export class HelloCdkStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); // Modify the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; `), }); // ...
JavaScript

にありますlib/hello-cdk-stack.js

// ... class HelloCdkStack extends Stack { constructor(scope, id, props) { super(scope, id, props); // Modify the Lambda function resource const myFunction = new lambda.Function(this, "HelloWorldFunction", { runtime: lambda.Runtime.NODEJS_20_X, // Provide any supported Node.js runtime handler: "index.handler", code: lambda.Code.fromInline(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; `), }); // ... } } module.exports = { HelloCdkStack }
Python

にありますhello_cdk/hello_cdk_stack.py

# ... class HelloCdkStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # Modify the Lambda function resource my_function = _lambda.Function( self, "HelloWorldFunction", runtime = _lambda.Runtime.NODEJS_20_X, # Provide any supported Node.js runtime handler = "index.handler", code = _lambda.Code.from_inline( """ exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; """ ), ) # ...
Java

にありますsrc/main/java/.../HelloCdkStack.java

// ... public class HelloCdkStack extends Stack { public HelloCdkStack(final Construct scope, final String id) { this(scope, id, null); } public HelloCdkStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // Modify the Lambda function resource Function myFunction = Function.Builder.create(this, "HelloWorldFunction") .runtime(Runtime.NODEJS_20_X) // Provide any supported Node.js runtime .handler("index.handler") .code(Code.fromInline( "exports.handler = async function(event) {" + " return {" + " statusCode: 200," + " body: JSON.stringify('Hello CDK!')" + " };" + "};")) .build(); // ... } }
C#

// ... namespace HelloCdk { public class HelloCdkStack : Stack { internal HelloCdkStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // Modify the Lambda function resource var myFunction = new Function(this, "HelloWorldFunction", new FunctionProps { Runtime = Runtime.NODEJS_20_X, // Provide any supported Node.js runtime Handler = "index.handler", Code = Code.FromInline(@" exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; "), }); // ... } } }
Go

// ... type HelloCdkStackProps struct { awscdk.StackProps } func NewHelloCdkStack(scope constructs.Construct, id string, props *HelloCdkStackProps) awscdk.Stack { var sprops awscdk.StackProps if props != nil { sprops = props.StackProps } stack := awscdk.NewStack(scope, &id, &sprops) // Modify the Lambda function resource myFunction := awslambda.NewFunction(stack, jsii.String("HelloWorldFunction"), &awslambda.FunctionProps{ Runtime: awslambda.Runtime_NODEJS_20_X(), // Provide any supported Node.js runtime Handler: jsii.String("index.handler"), Code: awslambda.Code_FromInline(jsii.String(` exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; `)), }) // ...

現在、コードの変更によって、デプロイされた Lambda リソースに直接更新されていません。コードは、リソースの目的の状態を定義します。デプロイされたリソースを変更するには、 CDK CLI を使用して目的の状態を新しい AWS CloudFormation テンプレートに合成します。次に、新しい CloudFormation テンプレートを変更セットとしてデプロイします。変更セットは、新しい目的の状態に到達するために必要な変更のみを行います。

変更をプレビューするには、 cdk diff コマンドを実行します。以下に例を示します。

$ cdk diff Stack HelloCdkStack Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff) Resources [~] AWS::Lambda::Function HelloWorldFunction HelloWorldFunctionunique-identifier └─ [~] Code └─ [~] .ZipFile: ├─ [-] exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello World!'), }; }; └─ [+] exports.handler = async function(event) { return { statusCode: 200, body: JSON.stringify('Hello CDK!'), }; }; ✨ Number of stacks with differences: 1

この差分を作成するために、 は AWS アカウント アカウントに対してHelloCdkStackスタックの最新の AWS CloudFormation テンプレートをCDKCLIクエリします。次に、最新のテンプレートと、アプリケーションから合成したばかりのテンプレートを比較します。

変更を実装するには、 cdk deploy コマンドを実行します。以下に例を示します。

$ cdk deploy ✨ Synthesis time: 2.12s HelloCdkStack: start: Building unique-identifier:current_account-current_region HelloCdkStack: success: Built unique-identifier:current_account-current_region HelloCdkStack: start: Publishing unique-identifier:current_account-current_region HelloCdkStack: success: Published unique-identifier:current_account-current_region HelloCdkStack: deploying... [1/1] HelloCdkStack: creating CloudFormation changeset... ✅ HelloCdkStack ✨ Deployment time: 26.96s Outputs: HelloCdkStack.myFunctionUrlOutput = https://unique-identifier.lambda-url.<Region>.on.aws/ Stack ARN: arn:aws:cloudformation:Region:account-id:stack/HelloCdkStack/unique-identifier ✨ Total time: 29.07s

アプリケーションを操作するには、 を繰り返しますステップ 10: でアプリケーションを操作する AWS。以下に例を示します。

$ curl https://<api-id>.lambda-url.<Region>.on.aws/ "Hello CDK!"%

ステップ 12: アプリケーションを削除する

このステップでは、 CDK CLI cdk destroy コマンドを使用してアプリケーションを削除します。このコマンドは、作成したリソースを含む、 CloudFormation スタックに関連付けられたCDKスタックを削除します。

アプリケーションを削除するには、 cdk destroy コマンドを実行し、アプリケーションを削除するリクエストを確認します。以下に例を示します。

$ cdk destroy Are you sure you want to delete: HelloCdkStack (y/n)? y HelloCdkStack: destroying... [1/1] ✅ HelloCdkStack: destroyed

次のステップ

お疲れ様でした。このチュートリアルを完了し、 を使用して でリソースを AWS CDK 正常に作成、変更、削除しました AWS クラウド。これで、 の使用を開始する準備ができました AWS CDK。

AWS CDK 任意のプログラミング言語で を使用する方法の詳細については、「」を参照してくださいAWS CDK ライブラリの操作

その他のリソースについては、以下を参照してください。

  • より複雑なプロジェクトを含むより詳細なツアーについては、 CDKワークショップをお試しください。

  • API リファレンスを参照して、お好みのサービスで使用できるCDKコンストラクトの探索を開始してください AWS 。

  • Construct Hub にアクセスして、 AWS などによって作成されたコンストラクトを見つけます。

  • の使用をご覧ください AWS CDK。

AWS CDK はオープンソースプロジェクトです。貢献するには、「 への貢献 AWS Cloud Development Kit (AWS CDK)」を参照してください。