これは AWS CDK v2 デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
チュートリアル: 最初の AWS CDK アプリを作成する
CDK コマンドラインインターフェイス (AWS CDK CLI) を使用して最初の AWS CDK アプリケーションを開発し、 AWS 環境をブートストラップして、アプリケーションを にデプロイすることで、 AWS クラウド開発キット (AWS CDK) の使用を開始します AWS。
前提条件
このチュートリアルを開始する前に、AWS 「CDK の開始方法」のすべてのセットアップステップを完了してください。
このチュートリアルの内容
このチュートリアルでは、 AWS CDK AWS を使用して にシンプルなアプリケーションを作成してデプロイします。アプリケーションは、呼び出されたときにHello World!
メッセージを返す AWS Lambda 関数で構成されます。関数は、Lambda 関数の専用 HTTP(S) エンドポイントとして機能する Lambda 関数 URL を介して呼び出されます。
このチュートリアルでは、次の手順を実行します。
-
プロジェクトの作成 – CDK CLI cdk init
コマンドを使用して CDK プロジェクトを作成します。
-
AWS 環境の設定 – アプリケーションをデプロイする AWS 環境を設定します。
-
AWS 環境のブートストラップ – CDK CLI cdk bootstrap
コマンドを使用して AWS 環境をブートストラップして、デプロイの準備をします。
-
アプリの開発 – コンストラクトライブラリの AWS コンストラクトを使用して、Lambda 関数と Lambda 関数 URL リソースを定義します。
-
デプロイ用にアプリを準備する – CDK CLI を使用してアプリを構築し、 AWS CloudFormation テンプレートを合成します。
-
アプリケーションをデプロイする – CDK CLI cdk deploy
コマンドを使用してアプリケーションをデプロイし、 AWS リソースをプロビジョニングします。
-
アプリケーションを操作する – デプロイした Lambda 関数を呼び出してレスポンスを受け取る AWS ことで、 で操作します。
-
アプリの変更 – Lambda 関数を変更してデプロイし、変更を実装します。
-
アプリの削除 – CDK CLI cdk destroy
コマンドを使用して作成したすべてのリソースを削除します。
ステップ 1: CDK プロジェクトの作成
このステップでは、新しい CKD プロジェクトを作成します。CDK プロジェクトは、独自のローカルモジュールの依存関係を持つ独自のディレクトリにある必要があります。
- CDK プロジェクトを作成するには
-
-
選択した開始ディレクトリで、hello-cdk
という名前のディレクトリを作成して移動します。
$ mkdir hello-cdk && cd hello-cdk
こちらに示されているとおり、プロジェクトディレクトリに必ず hello-cdk
という名前を付けてください。CDK CLI は、このディレクトリ名を使用して CDK コード内のモノに名前を付けます。別のディレクトリ名を使用する場合、このチュートリアル中に問題が発生します。
-
hello-cdk
ディレクトリから、CDK CLIcdk 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 リポジトリとして初期化されます。
プロジェクトの初期化中、CDK CLI は単一の CDK スタックを含む CDK アプリケーションを作成します。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
}
// ...
このステップでは、CDK スタックの AWS 環境を設定します。これにより、CDK スタックをデプロイする環境を指定します。
まず、使用する AWS 環境を決定します。 AWS 環境は、 AWS アカウントと AWS リージョンで構成されます。
AWS CLI を使用してローカルマシンでセキュリティ認証情報を設定する場合、CLI AWS を使用して特定のプロファイルの AWS 環境情報を取得できます。
- CLI AWS を使用して AWS アカウント ID を取得するには
-
-
次の AWS CLI コマンドを実行して、default
プロファイルの AWS アカウント ID を取得します。
$ aws sts get-caller-identity --query "Account" --output text
-
名前付きプロファイルを使用する場合、--profile
オプションを使用してプロファイルの名前を指定します。
$ aws sts get-caller-identity --profile your-profile-name --query "Account" --output text
- CLI AWS を使用して AWS リージョンを取得するには
-
-
次の AWS CLI コマンドを実行して、default
プロファイル用に設定したリージョンを取得します。
$ aws configure get region
-
名前付きプロファイルを使用する場合、--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 プロジェクトのルートからブートストラップすることで、追加情報を提供する必要はありません。CDK CLI は、プロジェクトから環境情報を取得します。CDK プロジェクトの外部でブートストラップするとき、cdk bootstrap
コマンドを使用して環境情報を提供する必要があります。詳細については、AWS 「CDK で使用する環境のブートストラップ」を参照してください。
ステップ 4: CDK アプリの構築
ほとんどのプログラミング環境では、変更後にコードを構築またはコンパイルします。 AWS CDK CLI は自動的にこのステップを実行するため、これは CDK では必要ありません。ただし、構文および型エラーをキャッチするときでも、手動で構築できます。以下に例を示します。
- TypeScript
-
$ npm run build
> hello-cdk@0.1.0 build
> tsc
- JavaScript
-
構築ステップは必要ありません。
- Python
-
構築ステップは必要ありません。
- Java
-
$ mvn compile -q
または、Eclipseで Control-B
を押します (他の Java IDE は異なる場合があります)。
- C#
-
$ dotnet build src
または、Visual Studio で F6 キーを押します。
- Go
-
$ go build
ステップ 5: アプリの CDK スタックの一覧表示
この時点では、1 つの CDK スタックを含む CDK アプリが必要です。確認するには、CDK CLI cdk list
コマンドを使用してスタックを表示します。出力には、HelloCdkStack
という名前のスタックが 1 つ表示されます。
$ 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 つのパラメータを使用します。
-
scope – Stack
インスタンスを 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 を渡すビルダーが提供されます。2 つあります。1 つは FunctionProps
用で、2 つ目は 1 つのステップでコンストラクトおよびその props オブジェクトを構築できるようにするため、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 つのスタックが含まれているため、CDK CLI は合成するスタックを自動的に検出します。
テンプレートを合成しない場合、デプロイ時に CDK CLI が自動的にこのステップを実行します。ただし、合成エラーを確認するには、各デプロイの前にこのステップを実行することをお勧めします。
テンプレートを合成する前に、オプションでアプリケーションを構築し、構文および入力エラーをキャッチできます。手順については、「ステップ 4: CDK アプリを構築する」を参照してください。
CloudFormation テンプレートを合成するには、プロジェクトのルートから次の内容を実行します。
$ cdk synth
次のようなエラーが表示された場合、hello-cdk
ディレクトリにいることを確認してもう一度やり直してください。
--app is required either in command-line, in cdk.json or in ~/.cdk.json
成功すると、CDK CLI はYAML
フォーマットされた CloudFormation テンプレートを に出力stdout
し、JSON
フォーマットされたテンプレートをプロジェクトの cdk.out
ディレクトリに保存します。
次の内容は、CloudFormation テンプレートの出力の例です。
Resources:
HelloWorldFunctionServiceRole<unique-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
HelloWorldFunction<unique-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:
- HelloWorldFunctionServiceRole<unique-identifier>
- Arn
Runtime: nodejs20.x
DependsOn:
- HelloWorldFunctionServiceRole<unique-identifier>
Metadata:
aws:cdk:path: HelloCdkStack/HelloWorldFunction/Resource
HelloWorldFunctionFunctionUrl<unique-identifier>:
Type: AWS::Lambda::Url
Properties:
AuthType: NONE
TargetFunctionArn:
Fn::GetAtt:
- HelloWorldFunction<unique-identifier>
- Arn
Metadata:
aws:cdk:path: HelloCdkStack/HelloWorldFunction/FunctionUrl/Resource
HelloWorldFunctioninvokefunctionurl<unique-identifier>:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunctionUrl
FunctionName:
Fn::GetAtt:
- HelloWorldFunction<unique-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:
- HelloWorldFunctionFunctionUrl<unique-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 は、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 スタックを指定する必要はありません。
デプロイ中、CDK CLI はスタックのデプロイ時に進行状況情報を表示します。完了したら、AWS CloudFormation コンソールに移動してHelloCdkStack
スタックを表示できます。Lambda コンソールにアクセスして HelloWorldFunction
リソースを確認することもできます。
デプロイが完了すると、CDK CLI はエンドポイント 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
このステップでは、関数 URL を使用して Lambda 関数を呼び出す AWS ことで、 でアプリケーションを操作します。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 HelloWorldFunction<unique-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
この差分を作成するには、CDK CLI は AWS アカウントに対してHelloCdkStack
スタックの latest AWS CloudFormation テンプレートをクエリします。次に、最新のテンプレートとアプリから合成したばかりのテンプレートを比較します。
変更を実装するには、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
コマンドを使用してアプリケーションを削除します。このコマンドは、作成したリソースを含む CDK スタックに関連付けられた CloudFormation スタックを削除します。
アプリケーションを削除するには、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 ワークショップを試し、より複雑なプロジェクトに関連する詳細なチュートリアルを体験できます。
-
お気に入りの AWS サービスで使用できる CDK コンストラクトの探索を開始するには、 API リファレンスを参照してください。
-
Construct Hub にアクセスして、 AWS などによって作成されたコンストラクトを見つけます。
-
AWS CDK の使用例をご覧ください。
AWS CDK はオープンソースプロジェクトです。貢献するには、AWS 「 クラウド開発キット (AWS CDK) への貢献」を参照してください。