Panduan: Cari ID AMI dengan sumber daya khusus yang didukung Lambda - AWS CloudFormation

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Panduan: Cari ID AMI dengan sumber daya khusus yang didukung Lambda

Panduan ini menunjukkan cara menggunakan Lambda dan sumber daya khusus untuk mencari ID Amazon Machine Image (AMI) secara dinamis di template Anda. CloudFormation Ini dapat membantu Anda merampingkan cara Anda memperbarui ID AMI di CloudFormation templat Anda.

Saat Anda membuat CloudFormation template untuk meluncurkan instans Amazon EC2, Anda harus menentukan ID AMI, yang seperti templat untuk sistem operasi dan perangkat lunak yang akan diinstal pada instance. ID AMI yang benar bergantung pada jenis instans dan Wilayah AWS Anda meluncurkan instance Anda di. ID ini dapat berubah secara teratur, seperti ketika AMI diperbarui dengan pembaruan perangkat lunak.

Anda biasanya menentukan ID AMI di bagian pemetaan yang memetakan ID AMI ke tipe dan Wilayah instans tertentu. Ini berarti bahwa untuk memperbarui ID, Anda harus mengubahnya secara manual di setiap templat Anda. Namun, dengan menggunakan sumber daya khusus dan Lambda, Anda dapat membuat fungsi yang mendapatkan ID AMI terbaru untuk jenis instans dan Wilayah yang Anda gunakan. Dengan cara ini, Anda tidak perlu memelihara pemetaan antara ID AMI, tipe instans, dan Wilayah secara manual di templat tumpukan Anda.

Panduan ini menunjukkan kepada Anda cara membuat sumber daya khusus dan mengaitkan fungsi Lambda dengannya untuk mencari ID AMI. Ini mengasumsikan bahwa Anda terbiasa dengan sumber daya khusus dan fungsi Lambda. Untuk pengenalan sumber daya khusus dan cara kerjanya, lihatSumber daya khusus. Untuk informasi tentang Lambda, lihat Panduan AWS Lambda Pengembang.

catatan

CloudFormation adalah layanan gratis; namun, Anda dikenakan biaya untuk AWS sumber daya, seperti fungsi Lambda dan instans EC2, yang Anda sertakan dalam tumpukan Anda dengan tarif saat ini untuk masing-masing. Untuk informasi lebih lanjut tentang AWS harga, lihat halaman detail untuk setiap produk di http://aws.amazon.com.

Gambaran Umum

Langkah-langkah berikut memberikan gambaran umum tentang implementasi ini.

  1. Simpan paket sampel yang berisi kode fungsi Lambda ke bucket Amazon S3 di tempat yang Wilayah AWS sama di mana Anda ingin membuat instans EC2 Anda.

  2. Gunakan templat sampel untuk membuat tumpukan Anda dengan sumber daya khusus, fungsi Lambda, instans EC2, dan peran IAM yang digunakan Lambda untuk melakukan panggilan ke Amazon EC2.

  3. Tumpukan mengaitkan fungsi Lambda dengan sumber daya khusus. Saat tumpukan dibuat, CloudFormation memanggil fungsi dan mengirimkannya informasi, seperti jenis permintaan, data input, dan URL Amazon S3 yang telah ditandatangani sebelumnya.

  4. Fungsi Lambda menggunakan data input untuk mencari ID AMI terbaru dan mengirimkan ID AMI sebagai respons terhadap URL yang telah ditandatangani sebelumnya.

  5. CloudFormation mendapat respons di lokasi URL yang telah ditandatangani sebelumnya dan melanjutkan dengan membuat tumpukan. Saat CloudFormation membuat instance, ia menggunakan ID AMI yang disediakan oleh fungsi Lambda untuk membuat instans EC2 dengan AMI terbaru.

Panduan templat

Untuk melihat seluruh templat sampel, lihat:

Cuplikan berikut menjelaskan bagian yang relevan dari template sampel untuk membantu Anda memahami cara mengaitkan fungsi Lambda dengan sumber daya khusus dan cara menggunakan respons fungsi.

AWS::Lambda::Functionsumber daya AMIInfoFunction

AWS::Lambda::FunctionResource menentukan kode sumber fungsi, nama handler, lingkungan runtime, dan peran eksekusi Amazon Resource Name (ARN).

  • CodeProperti menentukan lokasi Amazon S3 (nama bucket dan nama file) tempat Anda mengunggah paket sampel. Templat sampel menggunakan parameter input ("Ref": "S3Bucket" dan "Ref": "S3Key") untuk mengatur bucket dan nama file agar Anda dapat menentukan nama ketika Anda membuat tumpukan. Demikian pula, nama handler, yang sesuai dengan nama file sumber ( JavaScript file) dalam .zip paket, juga menggunakan parameter input ("Ref": "ModuleName"). Karena file sumber adalah JavaScript kode, runtime ditentukan sebagainodejs18.x.

  • Untuk kode yang digunakan dalam panduan ini, waktu eksekusi untuk fungsi melebihi nilai default 3 detik, sehingga batas waktu diatur ke detik. 30 Jika Anda tidak menentukan batas waktu yang cukup lama, Lambda dapat menyebabkan batas waktu sebelum fungsi dapat selesai, menyebabkan pembuatan tumpukan gagal.

  • RoleProperti menggunakan Fn::GetAtt fungsi untuk mendapatkan ARN dari peran LambdaExecutionRole eksekusi yang dideklarasikan di tempat lain dalam template.

JSON

"AMIInfoFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "S3Bucket": { "Ref": "S3Bucket" }, "S3Key": { "Ref": "S3Key" } }, "Handler": { "Fn::Join" : [ "", [{ "Ref": "ModuleName" },".handler"] ] }, "Runtime": "nodejs18.x", "Timeout": "30", "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] } } }

YAML

AMIInfoFunction: Type: AWS::Lambda::Function Properties: Code: S3Bucket: !Ref S3Bucket S3Key: !Ref S3Key Handler: !Sub "${ModuleName}.handler" Runtime: nodejs18.x Timeout: 30 Role: !GetAtt LambdaExecutionRole.Arn

AWS::IAM::Rolesumber daya LambdaExecutionRole

Peran eksekusi memberikan izin fungsi Lambda untuk mengirim log AWS ke dan memanggil API EC2. DescribeImages

JSON

"LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": {"Service": ["lambda.amazonaws.com"]}, "Action": ["sts:AssumeRole"] }] }, "Path": "/", "Policies": [{ "PolicyName": "root", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["logs:CreateLogGroup","logs:CreateLogStream","logs:PutLogEvents"], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": ["ec2:DescribeImages"], "Resource": "*" }] } }] } }

YAML

LambdaExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: "/" Policies: - PolicyName: root PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: arn:aws:logs:*:*:* - Effect: Allow Action: - ec2:DescribeImages Resource: "*"

Kustom: :AmiInfo sumber daya AMIInfo

Untuk template Linux dan Windows, sumber daya khusus memanggil fungsi Lambda yang terkait dengannya. Untuk mengaitkan fungsi dengan sumber daya khusus, Anda menentukan ARN fungsi untuk ServiceToken properti, menggunakan fungsi Fn::GetAtt intrinsik. CloudFormation mengirimkan properti tambahan yang disertakan dalam deklarasi sumber daya kustom, seperti Region danArchitecture, ke fungsi Lambda sebagai input. Fungsi Lambda menentukan nama dan nilai yang benar untuk properti input ini.

JSON

"AMIInfo": { "Type": "Custom::AMIInfo", "Properties": { "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] }, "Region": { "Ref": "AWS::Region" }, "Architecture": { "Fn::FindInMap" : [ "AWSInstanceType2Arch", { "Ref" : "InstanceType" }, "Arch" ] } } }

YAML

AMIInfo: Type: Custom::AMIInfo Properties: ServiceToken: !GetAtt AMIInfoFunction.Arn Region: !Ref "AWS::Region" Architecture: Fn::FindInMap: - AWSInstanceType2Arch - !Ref InstanceType - Arch

Untuk Windows, sumber daya khusus menyediakan versi Windows ke fungsi Lambda alih-alih arsitektur instans.

JSON

"AMIInfo": { "Type": "Custom::AMIInfo", "Properties": { "ServiceToken": { "Fn::GetAtt": ["AMIInfoFunction", "Arn"] }, "Region": { "Ref": "AWS::Region" }, "OSName": { "Ref": "WindowsVersion" } } }

YAML

AMIInfo: Type: Custom::AMIInfo Properties: ServiceToken: !GetAtt AMIInfoFunction.Arn Region: !Ref "AWS::Region" OSName: !Ref "WindowsVersion"

Saat CloudFormation memanggil fungsi Lambda, fungsi tersebut memanggil API DescribeImages EC2, menggunakan Wilayah AWS arsitektur dan instance atau nama OS untuk memfilter daftar gambar. Kemudian fungsi menyortir daftar gambar berdasarkan tanggal dan mengembalikan ID dari AMI terbaru.

Ketika mengembalikan ID AMI terbaru, fungsi mengirimkan ID ke URL yang telah ditandatangani di Data properti objek respons. Data terstruktur sebagai pasangan nama-nilai, seperti yang ditunjukkan pada contoh berikut:

"Data": { "Id": "ami-02354e95b3example" }

AWS::EC2::Instancesumber daya SampleInstance

Cuplikan berikut menunjukkan cara mendapatkan data dari fungsi Lambda. Ia menggunakan Fn::GetAtt fungsi intrinsik, menyediakan nama sumber daya kustom dan nama atribut dari nilai yang ingin Anda dapatkan. Dalam panduan ini, nama sumber daya kustom adalah AMIInfo dan nama atribut adalah Id.

JSON

"SampleInstance": { "Type": "AWS::EC2::Instance", "Properties": { "InstanceType" : { "Ref": "InstanceType" }, "ImageId": { "Fn::GetAtt": [ "AMIInfo", "Id" ] } } }

YAML

SampleInstance: Type: AWS::EC2::Instance Properties: InstanceType: !Ref InstanceType ImageId: !GetAtt AMIInfo.Id

Prasyarat

Sebelum Anda dapat menyelesaikan langkah-langkah untuk membuat tumpukan, Anda harus sudah memiliki bucket Amazon S3. Saat membuat tumpukan dengan fungsi Lambda, Anda harus menentukan lokasi bucket Amazon S3 yang berisi kode sumber fungsi. Bucket harus sama dengan tempat Wilayah AWS Anda membuat tumpukan Anda. Untuk informasi selengkapnya tentang membuat bucket, lihat Membuat bucket di Panduan Pengguna Layanan Penyimpanan Sederhana Amazon.

Anda juga harus memiliki izin IAM untuk menggunakan semua layanan terkait, seperti Lambda, Amazon EC2, dan. CloudFormation

Langkah 1: Simpan sampel paket Lambda ke Amazon S3

Pada langkah ini, Anda mengunggah contoh paket Lambda (.zipfile) ke bucket Amazon S3 Anda.

Paket ini berisi kode sumber untuk fungsi Lambda dan perpustakaan yang diperlukan. Untuk panduan ini, fungsi tidak memerlukan pustaka tambahan.

Untuk menyimpan paket sampel di Amazon S3
  1. Unduh paket sampel dari Amazon S3. Ketika Anda menyimpan file, gunakan nama file yang sama sebagai contoh, amilookup.zip atau amilookup-win.zip.

  2. Buka konsol Amazon S3 di https://console.aws.amazon.com/s3/home.

  3. Pada bilah navigasi di bagian atas layar, pilih bucket Amazon S3 Wilayah AWS yang Anda buat.

  4. Dalam daftar Bucket, pilih nama bucket Anda. Catat nama bucket karena Anda menggunakannya saat membuat tumpukan.

  5. Pilih Unggah.

  6. Di bawah Unggah, untuk File dan folder, unggah paket sampel ke bucket. Untuk informasi selengkapnya, lihat Mengunggah objek di Panduan Pengguna Amazon Simple Storage Service.

Langkah 2: Luncurkan tumpukan

Pada langkah ini, Anda meluncurkan tumpukan dari template sampel. Tumpukan mencakup fungsi Lambda, peran IAM (peran eksekusi), sumber daya khusus yang memanggil fungsi, dan instance EC2 yang menggunakan hasil dari fungsi tersebut.

Selama pembuatan tumpukan, sumber daya kustom memanggil fungsi Lambda dan menunggu hingga fungsi mengirimkan respons ke URL Amazon S3 yang telah ditandatangani sebelumnya. Sebagai tanggapan, fungsi mengembalikan ID AMI terbaru yang sesuai dengan jenis instans EC2 dan Wilayah AWS Anda membuat instance di. Data dari respon fungsi disimpan sebagai atribut dari sumber daya kustom, yang digunakan untuk menentukan ID AMI Instans EC2.

Untuk membuat tumpukan
  1. Buka CloudFormation konsol di https://console.aws.amazon.com/cloudformation/.

  2. Pilih Buat tumpukan.

  3. Di bagian Template, pilih Tentukan URL template Amazon S3, lalu salin dan tempel URL berikut di kotak teks:

    Templat Linux

    https://s3.amazonaws.com/cloudformation-examples/lambda/LambdaAMILookupSample.template

    Templat Windows

    https://s3.amazonaws.com/cloudformation-examples/lambda/LambdaAMILookupSample-win.template

  4. Pilih Selanjutnya.

  5. Di bidang Nama tumpukan, ketik SampleEC2Instance.

  6. Di bagian Parameter, tentukan nama bucket Amazon S3 yang Anda buat, lalu pilih Berikutnya.

    Nilai default untuk parameter lainnya adalah nama yang sama yang digunakan dalam paket .zip sampel.

  7. Untuk panduan ini, Anda tidak perlu menambahkan tanda atau menentukan pengaturan lanjutan, jadi pilih Selanjutnya.

  8. Pastikan bahwa nama tumpukan dan URL templat sudah benar, lalu pilih Buat.

Mungkin perlu beberapa menit CloudFormation untuk membuat tumpukan Anda. Untuk memantau kemajuan, tampilkan peristiwa tumpukan. Untuk informasi selengkapnya, lihat Melihat data AWS CloudFormation tumpukan dan sumber daya di AWS Management Console.

Jika pembuatan tumpukan berhasil, semua sumber daya dalam tumpukan, seperti fungsi Lambda, sumber daya khusus, dan instans EC2, dibuat. Anda berhasil menggunakan fungsi Lambda dan sumber daya khusus untuk menentukan ID AMI dari instans EC2. Anda tidak perlu membuat dan memelihara pemetaan ID AMI dalam templat ini.

Untuk melihat ID AMI mana yang CloudFormation digunakan untuk membuat instans EC2, lihat output tumpukan.

Jika fungsi Lambda mengembalikan kesalahan, lihat log fungsi di konsol CloudWatch Log. Nama pengaliran log adalah ID fisik sumber daya kustom, yang dapat Anda temukan dengan melihat sumber daya tumpukan. Untuk informasi selengkapnya, lihat Melihat data log di Panduan CloudWatch Pengguna Amazon.

Langkah 3: Bersihkan 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
  1. Dari CloudFormation konsol, pilih tumpukan SampleEC2Instance.

  2. Pilih Tindakan, dan kemudian Hapus Tumpukan.

  3. Pada pesan konfirmasi, pilih Ya, Hapus.

Semua sumber daya yang telah Anda buat sebelumnya akan dihapus.

Sekarang setelah Anda memahami cara membuat dan menggunakan fungsi Lambda CloudFormation, Anda dapat menggunakan contoh template dan kode dari panduan ini untuk membangun tumpukan dan fungsi lain.

Informasi terkait