Ini adalah Panduan Pengembang AWS CDK v2. CDK v1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.
Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Aset adalah file lokal, direktori, atau gambar Docker yang dapat dibundel ke dalam AWS CDK pustaka dan aplikasi. Misalnya, aset mungkin merupakan direktori yang berisi kode handler untuk suatu AWS Lambda fungsi. Aset dapat mewakili artefak apa pun yang dibutuhkan aplikasi untuk beroperasi.
Video tutorial berikut memberikan gambaran menyeluruh tentang aset CDK, dan menjelaskan bagaimana Anda dapat menggunakannya dalam insfrastructure as code (IAc) Anda.
Anda menambahkan aset melalui APIs yang diekspos oleh AWS konstruksi tertentu. Misalnya, saat Anda mendefinisikan konstruksi Lambda.function, properti code memungkinkan Anda meneruskan aset (direktori). Function
menggunakan aset untuk menggabungkan isi direktori dan menggunakannya untuk kode fungsi. Demikian pula, ecs. ContainerImage.fromAsset menggunakan image Docker yang dibangun dari direktori lokal saat mendefinisikan definisi tugas Amazon ECS.
Aset secara detail
Saat Anda merujuk ke aset di aplikasi Anda, rakitan cloud yang disintesis dari aplikasi Anda menyertakan informasi metadata dengan instruksi untuk CLI. AWS CDK Instruksi termasuk di mana menemukan aset pada disk lokal dan jenis bundling apa yang harus dilakukan berdasarkan jenis aset, seperti direktori untuk dikompres (zip) atau gambar Docker yang akan dibuat.
Ini AWS CDK menghasilkan hash sumber untuk aset. Ini dapat digunakan pada waktu konstruksi untuk menentukan apakah isi aset telah berubah.
Secara default, AWS CDK membuat salinan aset di direktori perakitan cloud, yang defaultnyacdk.out
, di bawah hash sumber. Dengan cara ini, perakitan cloud mandiri, jadi jika dipindahkan ke host yang berbeda untuk penerapan, itu masih dapat digunakan. Lihat Rakitan awan untuk detail.
Saat AWS CDK menerapkan aplikasi yang mereferensikan aset (baik secara langsung dengan kode aplikasi atau melalui pustaka), AWS CDK CLI terlebih dahulu menyiapkan dan menerbitkan aset tersebut ke bucket Amazon S3 atau repositori Amazon ECR. (Bucket atau repositori S3 dibuat selama bootstrap.) Hanya dengan begitu sumber daya yang ditentukan dalam tumpukan digunakan.
Bagian ini menjelaskan tingkat rendah yang APIs tersedia dalam kerangka kerja.
Jenis aset
AWS CDK Mendukung jenis aset berikut:
- Aset Amazon S3
-
Ini adalah file dan direktori lokal yang AWS CDK diunggah ke Amazon S3.
- Gambar Docker
-
Ini adalah gambar Docker yang AWS CDK diunggah ke Amazon ECR.
Jenis aset ini dijelaskan di bagian berikut.
Aset Amazon S3
Contoh berikut mendefinisikan aset direktori lokal dan aset file.
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')
});
Dalam kebanyakan kasus, Anda tidak perlu langsung menggunakan aws-s3-assets
modul APIs dalam. Modul yang mendukung aset, sepertiaws-lambda
, memiliki metode kemudahan sehingga Anda dapat menggunakan aset. Untuk fungsi Lambda, metode statis fromAsset () memungkinkan Anda menentukan direktori atau file.zip di sistem file lokal.
Contoh fungsi Lambda
Kasus penggunaan umum adalah membuat fungsi Lambda dengan kode handler sebagai aset Amazon S3.
Contoh berikut menggunakan aset Amazon S3 untuk menentukan handler Python di direktori lokal. handler
Ini juga menciptakan fungsi Lambda dengan aset direktori lokal sebagai properti. code
Berikut ini adalah kode Python untuk handler.
def lambda_handler(event, context):
message = 'Hello World!'
return {
'message': message
}
Kode untuk AWS CDK aplikasi utama akan terlihat seperti berikut.
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
Metode ini menggunakan aset untuk menggabungkan isi direktori dan menggunakannya untuk kode fungsi.
Tip
.jar
File Java adalah file ZIP dengan ekstensi berbeda. Ini diunggah apa adanya ke Amazon S3, tetapi ketika digunakan sebagai fungsi Lambda, file yang dikandungnya diekstraksi, yang mungkin tidak Anda inginkan. Untuk menghindari hal ini, tempatkan .jar
file dalam direktori dan tentukan direktori itu sebagai aset.
Contoh atribut deploy-time
Jenis aset Amazon S3 juga mengekspos atribut waktu penerapan yang dapat direferensikan di pustaka dan aplikasi. AWS CDK Perintah AWS CDK CLI cdk synth menampilkan properti aset sebagai AWS CloudFormation parameter.
Contoh berikut menggunakan atribut deploy-time untuk meneruskan lokasi aset gambar ke dalam fungsi Lambda sebagai variabel lingkungan. (Jenis file tidak masalah; gambar PNG yang digunakan di sini hanyalah sebuah contoh.)
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
}
});
Izin
Jika Anda menggunakan aset Amazon S3 secara langsung melalui modul aws-s3-assets, peran IAM, pengguna, atau grup, dan Anda perlu membaca aset saat runtime, berikan izin IAM aset tersebut melalui metode Asset.grantRead.
Contoh berikut memberikan izin baca grup IAM pada aset file.
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);
Aset gambar Docker
AWS CDK Mendukung bundling image Docker lokal sebagai aset melalui modul. aws-ecr-assets
Contoh berikut mendefinisikan image Docker yang dibangun secara lokal dan didorong ke Amazon ECR. Gambar dibuat dari direktori konteks Docker lokal (dengan Dockerfile) dan diunggah ke Amazon ECR oleh CLI atau pipeline AWS CDK CI/CD aplikasi Anda. Gambar dapat direferensikan secara alami di AWS CDK aplikasi Anda.
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
my-image
Direktori harus menyertakan Dockerfile. AWS CDK CLI membangun image Docker darimy-image
, mendorongnya ke repositori Amazon ECR, dan menentukan nama repositori sebagai parameter ke tumpukan Anda. AWS CloudFormation
Jenis aset gambar Docker mengekspos atribut waktu penerapan yang dapat direferensikan di pustaka dan aplikasi. AWS CDK Perintah AWS CDK CLI cdk
synth menampilkan properti aset sebagai AWS CloudFormation parameter.
Contoh definisi tugas Amazon ECS
Kasus penggunaan yang umum adalah membuat Amazon ECS TaskDefinitionuntuk menjalankan kontainer Docker. Contoh berikut menentukan lokasi aset image Docker yang AWS CDK dibangun secara lokal dan mendorong ke Amazon ECR.
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)
});
Contoh atribut deploy-time
Contoh berikut menunjukkan cara menggunakan atribut deploy-time repository
dan imageUri
membuat definisi tugas Amazon ECS dengan tipe peluncuran. AWS Fargate Perhatikan bahwa pencarian repo Amazon ECR memerlukan tag gambar, bukan URI-nya, jadi kami memotongnya dari akhir URI aset.
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())
});
Membangun contoh argumen
Anda dapat memberikan argumen build yang disesuaikan untuk langkah build Docker melalui opsi properti buildArgs
(Pythonbuild_args
:) saat AWS CDK CLI membangun gambar selama penerapan.
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image'),
buildArgs: {
HTTP_PROXY: 'http://10.20.30.2:1234'
}
});
Izin
Jika Anda menggunakan modul yang mendukung aset image Docker, seperti aws-ecs, akan AWS CDK mengelola izin untuk Anda saat Anda menggunakan aset secara langsung atau melalui. ContainerImage fromEcrRepository (Python:from_ecr_repository
). Jika Anda menggunakan aset image Docker secara langsung, pastikan bahwa prinsipal konsumsi memiliki izin untuk menarik gambar.
Dalam kebanyakan kasus, Anda harus menggunakan metode asset.repository.GrantPull (Python:. grant_pull
Ini memodifikasi kebijakan IAM dari prinsipal untuk memungkinkannya menarik gambar dari repositori ini. Jika prinsipal yang menarik gambar tidak berada di akun yang sama, atau jika itu adalah AWS layanan yang tidak berperan dalam akun Anda (seperti AWS CodeBuild), Anda harus memberikan izin tarik pada kebijakan sumber daya dan bukan pada kebijakan prinsipal. Gunakan asset.repository. addToResourceMetode kebijakan (Python:add_to_resource_policy
) untuk memberikan izin utama yang sesuai.
AWS CloudFormation metadata sumber daya
catatan
Bagian ini hanya relevan untuk penulis konstruksi. Dalam situasi tertentu, alat perlu mengetahui bahwa sumber daya CFN tertentu menggunakan aset lokal. Misalnya, Anda dapat menggunakan AWS SAM CLI untuk menjalankan fungsi Lambda secara lokal untuk tujuan debugging. Lihat AWS SAM integrasi untuk detail.
Untuk mengaktifkan kasus penggunaan seperti itu, alat eksternal berkonsultasi dengan satu set entri metadata tentang sumber daya: AWS CloudFormation
-
aws:asset:path
— Menunjuk ke jalur lokal aset. -
aws:asset:property
— Nama properti sumber daya tempat aset digunakan.
Dengan menggunakan dua entri metadata ini, alat dapat mengidentifikasi bahwa aset digunakan oleh sumber daya tertentu, dan memungkinkan pengalaman lokal tingkat lanjut.
Untuk menambahkan entri metadata ini ke sumber daya, gunakan metode (asset.addResourceMetadata
Python:). add_resource_metadata