これは v2 AWS CDK デベロッパーガイドです。旧版の CDK v1 は 2022 年 6 月 1 日にメンテナンスを開始し、2023 年 6 月 1 日にサポートを終了しました。
翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
アセットは、 AWS CDK ライブラリやアプリケーションにバンドルできるローカルファイル、ディレクトリ、または Docker イメージです。たとえば、アセットは、 AWS Lambda 関数のハンドラーコードを含むディレクトリである場合があります。アセットは、アプリが動作するために必要なアーティファクトを表すことができます。
以下のチュートリアルビデオでは、CDK アセットの包括的な概要と、Insfrastructure as Code (IaC ) でそれらを使用する方法について説明します。
特定の AWS コンストラクトによって公開される APIs を使用してアセットを追加します。たとえば、lambda.Function コンストラクトを定義すると、コードプロパティによってアセット (ディレクトリ) を渡すことができます。Function
はアセットを使用してディレクトリの内容をバンドルし、関数のコードに使用します。同様に、ecs.ContainerImage.fromAsset は、Amazon ECS タスク定義を定義するときに、ローカルディレクトリから構築された Docker イメージを使用します。
アセットの詳細
アプリでアセットを参照すると、アプリケーションから合成されたクラウドアセンブリには、CLI AWS CDK の手順を含むメタデータ情報が含まれます。手順には、ローカルディスク上のアセットの場所と、アセットタイプに基づいて実行するバンドルのタイプが含まれます。たとえば、圧縮するディレクトリ (zip) や構築する Docker イメージなどです。
はアセットのソースハッシュ AWS CDK を生成します。これは構築時に、アセットの内容が変更されたかどうかを判断するために使用できます。
デフォルトでは、 はクラウドアセンブリディレクトリにアセットのコピー AWS CDK を作成します。このディレクトリは、デフォルトでソースハッシュの cdk.out
になります。これにより、クラウドアセンブリは自己完結型であるため、デプロイのために別のホストに移動してもデプロイできます。詳細については、「クラウドアセンブリ」を参照してください。
がアセットを参照するアプリを (アプリケーションコードから直接、またはライブラリを介して) AWS CDK デプロイすると、 AWS CDK CLI はまずアセットを準備して Amazon S3 バケットまたは Amazon ECR リポジトリに公開します。(S3 バケットまたはリポジトリはブートストラップ中に作成されます)。その後のみ、スタックで定義されたリソースがデプロイされます。
このセクションでは、 フレームワークで使用できる低レベル APIs について説明します。
アセットタイプ
では、次のタイプのアセット AWS CDK がサポートされています。
- Amazon S3 アセット
-
これらは、 が Amazon S3 AWS CDK にアップロードするローカルファイルとディレクトリです。
- Docker イメージ
-
これらは、 が Amazon ECR AWS CDK にアップロードする Docker イメージです。
これらのロールについては、以降のセクションで説明します。
Amazon S3 アセット
ローカルファイルとディレクトリをアセットとして定義し、 AWS CDK パッケージ化して aws-s3-assets モジュールを介して Amazon S3 にアップロードできます。 https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_s3_assets-readme.html
以下の例では、ローカルディレクトリアセットとファイルアセットを定義します。
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
// Archived and uploaded to Amazon S3 as a .zip file
const directoryAsset = new Asset(this, "SampleZippedDirAsset", {
path: path.join(__dirname, "sample-asset-directory")
});
// Uploaded to Amazon S3 as-is
const fileAsset = new Asset(this, 'SampleSingleFileAsset', {
path: path.join(__dirname, 'file-asset.txt')
});
ほとんどの場合、aws-s3-assets
モジュールで API を直接使用する必要はありません。aws-lambda
などのアセットをサポートするモジュールには、アセットを使用できる便利な方法があります。Lambda 関数の場合、静的メソッド fromAsset () を使用すると、ローカルファイルシステム内のディレクトリまたは .zip ファイルを指定できます。
Lambda 関数の例
一般的なユースケースは、ハンドラーコードを Amazon S3 アセットとして指定した Lambda 関数の作成です。
以下の例では、Amazon S3 アセットを使用して、ローカルディレクトリ handler
に Python ハンドラーを定義します。また、ローカルディレクトリアセットを code
プロパティとして Lambda 関数を作成します。ハンドラーの Python コードは以下のとおりです。
def lambda_handler(event, context):
message = 'Hello World!'
return {
'message': message
}
メイン AWS CDK アプリのコードは次のようになります。
import * as cdk from 'aws-cdk-lib';
import { Constructs } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
export class HelloAssetStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new lambda.Function(this, 'myLambdaFunction', {
code: lambda.Code.fromAsset(path.join(__dirname, 'handler')),
runtime: lambda.Runtime.PYTHON_3_6,
handler: 'index.lambda_handler'
});
}
}
Function
メソッドはアセットを使用してディレクトリの内容をバンドルし、関数のコードに使用します。
ヒント
Java .jar
ファイルは、異なる拡張子を持つ ZIP ファイルです。これらはそのまま Amazon S3 にアップロードされますが、Lambda 関数としてデプロイされると、含まれているファイルが抽出されます。これは必要ではない場合があります。これを回避するには、.jar
ファイルをディレクトリに配置し、そのディレクトリをアセットとして指定します。
デプロイ時間属性の例
Amazon S3 アセットタイプは、 AWS CDK ライブラリやアプリケーションで参照できるデプロイ時間属性も公開します。 AWS CDK CLI コマンドは、アセットプロパティを AWS CloudFormation パラメータとしてcdk synth表示します。
以下の例では、デプロイ時間属性を使用して、イメージアセットの場所を環境変数として Lambda 関数に渡します。(ファイルの種類は関係ありません。ここで使用する PNG イメージは例にすぎません)。
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
import * as path from 'path';
const imageAsset = new Asset(this, "SampleAsset", {
path: path.join(__dirname, "images/my-image.png")
});
new lambda.Function(this, "myLambdaFunction", {
code: lambda.Code.asset(path.join(__dirname, "handler")),
runtime: lambda.Runtime.PYTHON_3_6,
handler: "index.lambda_handler",
environment: {
'S3_BUCKET_NAME': imageAsset.s3BucketName,
'S3_OBJECT_KEY': imageAsset.s3ObjectKey,
'S3_OBJECT_URL': imageAsset.s3ObjectUrl
}
});
アクセス許可
aws-s3-assets モジュール、IAM ロール、ユーザー、またはグループを介して Amazon S3 アセットを直接使用していて、ランタイムにアセットを読み取る必要がある場合は、それらのアセットに asset.grantRead メソッドを介して IAM アクセス許可を付与します。
以下の例では、ファイルアセットに対する IAM グループの読み取りアクセス許可を付与します。
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
import * as path from 'path';
const asset = new Asset(this, 'MyFile', {
path: path.join(__dirname, 'my-image.png')
});
const group = new iam.Group(this, 'MyUserGroup');
asset.grantRead(group);
Docker イメージアセット
は、aws-ecr-assets モジュールを介したアセットとしてのローカル Docker イメージのバンドル AWS CDK をサポートしています。
以下の例では、ローカルに構築され、Amazon ECR にプッシュされる Docker イメージを定義します。イメージはローカル Docker コンテキストディレクトリ (Dockerfile を使用) から構築され、CLI AWS CDK またはアプリケーションの CI/CD パイプラインによって Amazon ECR にアップロードされます。イメージは AWS CDK アプリで自然に参照できます。
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
my-image
ディレクトリには Dockerfile を含める必要があります。 AWS CDK CLI は から Docker イメージを構築しmy-image
、Amazon ECR リポジトリにプッシュし、スタックのパラメータとして AWS CloudFormation リポジトリの名前を指定します。Docker イメージアセットタイプは、 AWS CDK ライブラリやアプリケーションで参照できるデプロイ時間属性を公開します。 AWS CDK CLI コマンドは、アセットプロパティを AWS CloudFormation パラメータとしてcdk synth表示します。
Amazon ECS タスク定義 - 例
一般的なユースケースは、Docker コンテナを実行する Amazon ECS TaskDefinition を作成することです。次の例では、 がローカルに AWS CDK ビルドして Amazon ECR にプッシュする Docker イメージアセットの場所を指定します。
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets';
import * as path from 'path';
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef", {
memoryLimitMiB: 1024,
cpu: 512
});
const asset = new ecr_assets.DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
taskDefinition.addContainer("my-other-container", {
image: ecs.ContainerImage.fromDockerImageAsset(asset)
});
デプロイ時間属性の例
次の例は、デプロイ時間属性repository
と imageUri
を使用して、 AWS Fargate 起動タイプで Amazon ECS タスク定義を作成する方法を示しています。Amazon ECR リポジトリルックアップには、URI ではなくイメージのタグが必要なため、アセットの URI の末尾からスニップすることに注意してください。
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as path from 'path';
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'my-image', {
directory: path.join(__dirname, "..", "demo-image")
});
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef", {
memoryLimitMiB: 1024,
cpu: 512
});
taskDefinition.addContainer("my-other-container", {
image: ecs.ContainerImage.fromEcrRepository(asset.repository, asset.imageUri.split(":").pop())
});
ビルド引数の例
デプロイ中に CLI がイメージをビルドするときに、 buildArgs
(Python: build_args
) プロパティオプションを使用して Docker AWS CDK ビルドステップ用にカスタマイズされたビルド引数を指定できます。
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image'),
buildArgs: {
HTTP_PROXY: 'http://10.20.30.2:1234'
}
});
アクセス許可
aws-ecs などの Docker イメージアセットをサポートするモジュールを使用する場合、 はアセットを直接使用するか、ContainerImage.fromEcrRepository (Python: from_ecr_repository
) を通じてアクセス許可 AWS CDK を管理します。Docker イメージアセットを直接使用する場合は、消費元プリンシパルにイメージをプルするアクセス許可があることを確認してください。
ほとんどの場合、 asset.repository.grantPull メソッド (Python: grant_pull
。 これにより、プリンシパルの IAM ポリシーが変更され、このリポジトリからイメージをプルできるようになります。 イメージをプルするプリンシパルが同じ アカウントにない場合、またはアカウントでロール AWS を引き受けるサービス ( など AWS CodeBuild) である場合は、プリンシパルのポリシーではなくリソースポリシーに対してプルアクセス許可を付与する必要があります。 asset.repository.addToResourcePolicy メソッド (Python: add_to_resource_policy
) を使用して、適切なプリンシパルアクセス許可を付与します。
AWS CloudFormation リソースメタデータ
注記
このセクションは、コンストラクト作成者にのみ関連します。特定の状況では、特定の CFN リソースがローカルアセットを使用していることをツールが把握している必要があります。たとえば、 CLI AWS SAM を使用して、デバッグ目的で Lambda 関数をローカルで呼び出すことができます。詳細については、「AWS SAM 統合」を参照してください。
このようなユースケースを有効にするために、外部ツールは AWS CloudFormation リソースのメタデータエントリのセットを参照します。
-
aws:asset:path
– アセットのローカルパスを指します。 -
aws:asset:property
– アセットが使用されるリソースプロパティの名前。
これら 2 つのメタデータエントリを使用すると、ツールはアセットが特定のリソースによって使用されていることを特定し、高度なローカルエクスペリエンスを実現できます。
これらのメタデータエントリをリソースに追加するには、asset.addResourceMetadata
(Python: add_resource_metadata
) メソッドを使用します。