Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Walkthrough: Buat mekanisme penundaan dengan sumber daya khusus yang didukung Lambda
Panduan ini menunjukkan kepada Anda cara mengonfigurasi dan meluncurkan sumber daya kustom yang didukung Lambda menggunakan templat sampel. CloudFormation Template ini menciptakan mekanisme penundaan yang menjeda penerapan tumpukan untuk waktu yang ditentukan. Ini dapat berguna ketika Anda perlu memperkenalkan penundaan yang disengaja selama penyediaan sumber daya, seperti saat menunggu sumber daya stabil sebelum sumber daya dependen dibuat.
catatan
Meskipun sumber daya kustom yang didukung Lambda sebelumnya direkomendasikan untuk mengambil IDs AMI, kami sekarang merekomendasikan penggunaan AWS Systems Manager parameter. Pendekatan ini membuat template Anda lebih dapat digunakan kembali dan lebih mudah dirawat. Untuk informasi selengkapnya, lihat Dapatkan nilai plaintext dari Systems Manager Parameter Store.
Topik
Gambaran umum
Templat tumpukan sampel yang digunakan dalam panduan ini membuat sumber daya kustom yang didukung Lambda. Sumber daya khusus ini memperkenalkan penundaan yang dapat dikonfigurasi (60 detik secara default) selama pembuatan tumpukan. Penundaan terjadi selama pembaruan tumpukan hanya ketika properti sumber daya kustom diubah.
Template menyediakan sumber daya berikut:
-
sumber daya khusus,
-
fungsi Lambda, dan
-
peran IAM yang memungkinkan Lambda untuk menulis log ke. CloudWatch
Ini juga mendefinisikan dua output:
-
Waktu sebenarnya fungsi menunggu.
-
Pengidentifikasi unik yang dihasilkan selama setiap eksekusi fungsi Lambda.
catatan
CloudFormation adalah layanan gratis tetapi Lambda mengenakan biaya berdasarkan jumlah permintaan untuk fungsi Anda dan waktu kode Anda dijalankan. Untuk informasi selengkapnya tentang harga Lambda, lihat AWS Lambda harga.
Templat sampel
Anda dapat melihat template sampel sumber daya kustom yang didukung Lambda dengan mekanisme penundaan di bawah ini:
JSON
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Statement": [{ "Effect": "Allow", "Principal": { "Service": ["lambda.amazonaws.com"] }, "Action": ["sts:AssumeRole"] }] }, "Path": "/", "Policies": [{ "PolicyName": "AllowLogs", "PolicyDocument": { "Statement": [{ "Effect": "Allow", "Action": ["logs:*"], "Resource": "*" }] } }] } }, "CFNWaiter": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Runtime": "python3.9", "Timeout": 900, "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] }, "Code": { "ZipFile": { "Fn::Join": ["\n", [ "from time import sleep", "import json", "import cfnresponse", "import uuid", "", "def handler(event, context):", " wait_seconds = 0", " id = str(uuid.uuid1())", " if event[\"RequestType\"] in [\"Create\", \"Update\"]:", " wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))", " sleep(wait_seconds)", " response = {", " \"TimeWaited\": wait_seconds,", " \"Id\": id ", " }", " cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)" ]]} } } }, "CFNWaiterCustomResource": { "Type": "AWS::CloudFormation::CustomResource", "Properties": { "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] }, "ServiceTimeout": 60 } } }, "Outputs": { "TimeWaited": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] }, "Export": { "Name": "TimeWaited" } }, "WaiterId": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] }, "Export": { "Name": "WaiterId" } } } }
YAML
AWSTemplateFormatVersion: "2010-09-09" Resources: LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: "Allow" Principal: Service: - "lambda.amazonaws.com" Action: - "sts:AssumeRole" Path: "/" Policies: - PolicyName: "AllowLogs" PolicyDocument: Statement: - Effect: "Allow" Action: - "logs:*" Resource: "*" CFNWaiter: Type: AWS::Lambda::Function Properties: Handler: index.handler Runtime: python3.9 Timeout: 900 Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: !Sub | from time import sleep import json import cfnresponse import uuid def handler(event, context): wait_seconds = 0 id = str(uuid.uuid1()) if event["RequestType"] in ["Create", "Update"]: wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0)) sleep(wait_seconds) response = { "TimeWaited": wait_seconds, "Id": id } cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id) CFNWaiterCustomResource: Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt CFNWaiter.Arn ServiceTimeout: 60 Outputs: TimeWaited: Value: !GetAtt CFNWaiterCustomResource.TimeWaited Export: Name: TimeWaited WaiterId: Value: !GetAtt CFNWaiterCustomResource.Id Export: Name: WaiterId
Contoh panduan templat
Cuplikan berikut menjelaskan bagian yang relevan dari template sampel untuk membantu Anda memahami bagaimana fungsi Lambda dikaitkan dengan sumber daya khusus dan memahami hasilnya.
- AWS::Lambda::Functionsumber daya
CFNWaiter -
AWS::Lambda::FunctionResource menentukan kode sumber fungsi, nama handler, lingkungan runtime, dan peran eksekusi Amazon Resource Name (ARN).HandlerProperti diatur keindex.handlerkarena menggunakan kode sumber Python. Untuk informasi selengkapnya tentang pengidentifikasi handler yang diterima saat menggunakan kode sumber fungsi inline, lihat Kode. AWS::Lambda::FunctionRuntimeIni ditentukan sebagaipython3.9karena file sumber adalah kode Python.TimeoutIni diatur ke 900 detik.RoleProperti menggunakanFn::GetAttfungsi untuk mendapatkan ARN dari peranLambdaExecutionRoleeksekusi yang dideklarasikan dalamAWS::IAM::Rolesumber daya dalam template.CodeProperti mendefinisikan kode fungsi inline menggunakan fungsi Python. Fungsi Python dalam template sampel melakukan hal berikut:-
Buat ID unik menggunakan UUID
-
Periksa apakah permintaan tersebut adalah permintaan buat atau perbarui
-
Tidur selama durasi yang ditentukan
ServiceTimeoutselamaCreateatauUpdatepermintaan -
Kembalikan waktu tunggu dan ID unik
-
JSON
... "CFNWaiter": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Runtime": "python3.9", "Timeout": 900, "Role": { "Fn::GetAtt": ["LambdaExecutionRole", "Arn"] }, "Code": { "ZipFile": { "Fn::Join": ["\n", [ "from time import sleep", "import json", "import cfnresponse", "import uuid", "", "def handler(event, context):", " wait_seconds = 0", " id = str(uuid.uuid1())", " if event[\"RequestType\"] in [\"Create\", \"Update\"]:", " wait_seconds = int(event[\"ResourceProperties\"].get(\"ServiceTimeout\", 0))", " sleep(wait_seconds)", " response = {", " \"TimeWaited\": wait_seconds,", " \"Id\": id ", " }", " cfnresponse.send(event, context, cfnresponse.SUCCESS, response, \"Waiter-\"+id)" ]]} } } }, ...
YAML
... CFNWaiter: Type: AWS::Lambda::Function Properties: Handler: index.handler Runtime: python3.9 Timeout: 900 Role: !GetAtt LambdaExecutionRole.Arn Code: ZipFile: !Sub | from time import sleep import json import cfnresponse import uuid def handler(event, context): wait_seconds = 0 id = str(uuid.uuid1()) if event["RequestType"] in ["Create", "Update"]: wait_seconds = int(event["ResourceProperties"].get("ServiceTimeout", 0)) sleep(wait_seconds) response = { "TimeWaited": wait_seconds, "Id": id } cfnresponse.send(event, context, cfnresponse.SUCCESS, response, "Waiter-"+id) ...
- AWS::IAM::Rolesumber daya
LambdaExecutionRole -
AWS::IAM:RoleSumber daya menciptakan peran eksekusi untuk fungsi Lambda, yang mencakup kebijakan peran asumsi yang memungkinkan Lambda menggunakannya. Ini juga berisi kebijakan yang memungkinkan akses CloudWatch Log.
JSON
... "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Statement": [{ "Effect": "Allow", "Principal": { "Service": ["lambda.amazonaws.com"] }, "Action": ["sts:AssumeRole"] }] }, "Path": "/", "Policies": [{ "PolicyName": "AllowLogs", "PolicyDocument": { "Statement": [{ "Effect": "Allow", "Action": ["logs:*"], "Resource": "*" }] } }] } }, ...
YAML
... LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: "Allow" Principal: Service: - "lambda.amazonaws.com" Action: - "sts:AssumeRole" Path: "/" Policies: - PolicyName: "AllowLogs" PolicyDocument: Statement: - Effect: "Allow" Action: - "logs:*" Resource: "*" ...
- AWS::CloudFormation::CustomResourcesumber daya
CFNWaiterCustomResource -
Sumber daya khusus menautkan ke fungsi Lambda dengan penggunaan ARN-nya.
!GetAtt CFNWaiter.ArnIni akan menerapkan waktu tunggu 60 detik untuk membuat dan memperbarui operasi, seperti yang diaturServiceTimeout. Sumber daya hanya akan dipanggil untuk operasi pembaruan jika properti diubah.
JSON
... "CFNWaiterCustomResource": { "Type": "AWS::CloudFormation::CustomResource", "Properties": { "ServiceToken": { "Fn::GetAtt": ["CFNWaiter", "Arn"] }, "ServiceTimeout": 60 } } }, ...
YAML
... CFNWaiterCustomResource: Type: "AWS::CloudFormation::CustomResource" Properties: ServiceToken: !GetAtt CFNWaiter.Arn ServiceTimeout: 60 ...
Outputs-
Template ini adalah
TimeWaiteddanWaiterId.OutputsTimeWaitedNilai menggunakanFn::GetAttfungsi untuk memberikan jumlah waktu sumber daya pelayan benar-benar menunggu.WaiterIdMenggunakanFn::GetAttfungsi untuk memberikan ID unik yang dihasilkan dan terkait dengan eksekusi.
JSON
... "Outputs": { "TimeWaited": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "TimeWaited"] }, "Export": { "Name": "TimeWaited" } }, "WaiterId": { "Value": { "Fn::GetAtt": ["CFNWaiterCustomResource", "Id"] }, "Export": { "Name": "WaiterId" } } } } ...
YAML
... Outputs: TimeWaited: Value: !GetAtt CFNWaiterCustomResource.TimeWaited Export: Name: TimeWaited WaiterId: Value: !GetAtt CFNWaiterCustomResource.Id Export: Name: WaiterId ...
Prasyarat
Anda harus memiliki izin IAM untuk menggunakan semua layanan terkait, seperti Lambda dan. CloudFormation
Meluncurkan tumpukan
Untuk membuat tumpukan
-
Temukan template preferensi Anda (YAMAL atau JSON) dari Templat sampel bagian dan simpan ke mesin Anda dengan nama.
samplelambdabackedcustomresource.template -
Buka CloudFormation konsol di https://console.aws.amazon.com/cloudformation/
. -
Dari halaman Stacks, pilih Buat tumpukan di kanan atas, lalu pilih Dengan sumber daya baru (standar).
-
Untuk Prasyarat - Siapkan template, pilih Pilih template yang ada.
-
Untuk Menentukan templat, pilih Unggah file templat, lalu pilih Pilih file.
-
Pilih file
samplelambdabackedcustomresource.templatetemplate yang Anda simpan sebelumnya. -
Pilih Berikutnya.
-
Untuk nama Stack, ketik
SampleCustomResourceStackdan pilih Berikutnya. -
Untuk panduan ini, Anda tidak perlu menambahkan tanda atau menentukan pengaturan lanjutan, jadi pilih Selanjutnya.
-
Pastikan nama tumpukan terlihat benar, lalu pilih Buat.
Mungkin perlu beberapa menit CloudFormation untuk membuat tumpukan Anda. Untuk memantau kemajuan, tampilkan peristiwa tumpukan. Untuk informasi selengkapnya, lihat Lihat informasi tumpukan dari CloudFormation konsol.
Jika pembuatan tumpukan berhasil, semua sumber daya dalam tumpukan, seperti fungsi Lambda dan sumber daya khusus, dibuat. Anda telah berhasil menggunakan fungsi Lambda dan sumber daya khusus.
Jika fungsi Lambda mengembalikan kesalahan, lihat log fungsi di konsol CloudWatch Log.
Membersihkan sumber daya
Hapus tumpukan untuk membersihkan semua sumber daya tumpukan yang Anda buat sehingga Anda tidak dikenakan biaya untuk sumber daya yang tidak diperlukan.
Untuk menghapus tumpukan
-
Dari CloudFormation konsol, pilih SampleCustomResourceStacktumpukan.
-
Pilih Tindakan, dan kemudian Hapus Tumpukan.
-
Pada pesan konfirmasi, pilih Ya, Hapus.
Semua sumber daya yang telah Anda buat sebelumnya akan dihapus.
Sekarang setelah Anda memahami cara membuat dan menggunakan sumber daya kustom yang didukung Lambda, Anda dapat menggunakan contoh template dan kode dari panduan ini untuk membangun dan bereksperimen dengan tumpukan dan fungsi lain.