Perbarui emas AMI menggunakan Otomasi, AWS Lambda, dan Parameter Store - AWS Systems Manager

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

Perbarui emas AMI menggunakan Otomasi, AWS Lambda, dan Parameter Store

Contoh berikut menggunakan model di mana organisasi memelihara dan secara berkala menambal milik mereka sendiri AMIs daripada membangun dari Amazon Elastic Compute Cloud (Amazon). EC2 AMIs

Prosedur berikut menunjukkan cara menerapkan patch sistem operasi (OS) secara otomatis ke patch AMI yang sudah dianggap paling up-to-date atau terbaruAMI. Dalam contoh, nilai default parameter SourceAmiId ditentukan oleh AWS Systems Manager Parameter Store parameter yang disebutlatestAmi. Nilai diperbarui latestAmi oleh AWS Lambda fungsi yang dipanggil pada akhir otomatisasi. Sebagai hasil dari proses Otomasi ini, waktu dan upaya yang dihabiskan untuk menambal AMIs diminimalkan karena penambalan selalu diterapkan secara maksimal. up-to-date AMI Parameter Storedan otomatisasi adalah kemampuan AWS Systems Manager.

Sebelum Anda mulai

Konfigurasikan peran Otomasi dan, secara opsional, Amazon EventBridge untuk Otomasi. Untuk informasi selengkapnya, lihat Menyiapkan Otomatisasi.

Tugas 1: Buat parameter di Systems Manager Parameter Store

Buat parameter string Parameter Store yang menggunakan informasi berikut:

  • Nama: latestAmi.

  • Nilai: Sebuah AMI ID. Sebagai contoh: ami-188d6e0e.

Untuk informasi tentang cara membuat parameter Parameter Store string, lihatMembuat Parameter Store parameter Systems Manager.

Tugas 2: Buat IAM peran untuk AWS Lambda

Gunakan prosedur berikut untuk membuat peran IAM layanan AWS Lambda. Kebijakan ini memberikan izin Lambda untuk memperbarui nilai latestAmi parameter menggunakan fungsi Lambda dan Systems Manager.

Untuk membuat peran IAM layanan untuk Lambda
  1. Masuk ke AWS Management Console dan buka IAM konsol di https://console.aws.amazon.com/iam/.

  2. Di panel navigasi, pilih Kebijakan dan kemudian pilih Buat kebijakan.

  3. Pilih JSONtab.

  4. Ganti konten default dengan kebijakan berikut. Ganti masing-masing example resource placeholder dengan informasi Anda sendiri.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:region:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:region:123456789012:log-group:/aws/lambda/function name:*" ] } ] }
  5. Pilih Berikutnya: Tag

  6. (Opsional) Tambahkan satu atau beberapa pasangan nilai kunci tag untuk mengatur, melacak, atau mengontrol akses kebijakan ini.

  7. Pilih Berikutnya: Tinjau.

  8. Pada halaman Tinjau kebijakan, untuk Nama, masukkan nama untuk kebijakan inline, seperti amiLambda.

  9. Pilih Buat kebijakan.

  10. Ulangi langkah 2 dan 3.

  11. Tempel kebijakan berikut. Ganti masing-masing example resource placeholder dengan informasi Anda sendiri.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:region:123456789012:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }
  12. Pilih Berikutnya: Tag

  13. (Opsional) Tambahkan satu atau beberapa pasangan nilai kunci tag untuk mengatur, melacak, atau mengontrol akses kebijakan ini.

  14. Pilih Berikutnya: Tinjau.

  15. Pada halaman Tinjau kebijakan, untuk Nama, masukkan nama untuk kebijakan inline, seperti amiParameter.

  16. Pilih Buat kebijakan.

  17. Di panel navigasi, pilih Peran, lalu pilih Buat peran.

  18. Segera di bawah Kasus penggunaan, pilih Lambda, lalu pilih Berikutnya.

  19. Pada halaman Tambahkan izin, gunakan bidang Pencarian untuk menemukan dua kebijakan yang Anda buat sebelumnya.

  20. Pilih kotak centang di samping kebijakan, lalu pilih Berikutnya.

  21. Untuk Nama peran, masukkan nama untuk peran baru Anda, seperti lambda-ssm-role atau nama lain yang Anda inginkan.

    catatan

    Karena berbagai entitas mungkin mereferensikan peran, Anda tidak dapat mengubah nama peran setelah dibuat.

  22. (Opsional) Tambahkan satu atau beberapa pasangan nilai kunci tag untuk mengatur, melacak, atau mengontrol akses untuk peran ini, lalu pilih Buat peran.

Tugas 3: Buat AWS Lambda fungsi

Gunakan prosedur berikut untuk membuat fungsi Lambda yang secara otomatis memperbarui nilai latestAmi parameter.

Untuk membuat fungsi Lambda
  1. Masuk ke AWS Management Console dan buka AWS Lambda konsol di https://console.aws.amazon.com/lambda/.

  2. Pilih Buat fungsi.

  3. Pilih halaman Buat fungsi, pilih Penulis dari scratch.

  4. Untuk Nama fungsi, masukkan Automation-UpdateSsmParam.

  5. Untuk Waktu pengoperasian, pilih Python 3.8.

  6. Untuk Arsitektur, pilih jenis prosesor komputer untuk Lambda untuk digunakan untuk menjalankan fungsi, x86_64 atau arm64,

  7. Di bagian Izin, perluas Ubah peran eksekusi default.

  8. Pilih Gunakan peran yang sudah ada, dan kemudian pilih peran layanan untuk Lambda yang Anda buat di Tugas 2.

  9. Pilih Buat fungsi.

  10. Di area sumber Kode, pada tab lambda_function, hapus kode yang telah diisi sebelumnya di bidang, lalu tempel contoh kode berikut.

    from __future__ import print_function import json import boto3 print('Loading function') #Updates an SSM parameter #Expects parameterName, parameterValue def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) # get SSM client client = boto3.client('ssm') #confirm parameter exists before updating it response = client.describe_parameters( Filters=[ { 'Key': 'Name', 'Values': [ event['parameterName'] ] }, ] ) if not response['Parameters']: print('No such parameter') return 'SSM parameter not found.' #if parameter has a Description field, update it PLUS the Value if 'Description' in response['Parameters'][0]: description = response['Parameters'][0]['Description'] response = client.put_parameter( Name=event['parameterName'], Value=event['parameterValue'], Description=description, Type='String', Overwrite=True ) #otherwise just update Value else: response = client.put_parameter( Name=event['parameterName'], Value=event['parameterValue'], Type='String', Overwrite=True ) responseString = 'Updated parameter %s with value %s.' % (event['parameterName'], event['parameterValue']) return responseString
  11. Pilih File, Simpan.

  12. Untuk menguji fungsi Lambda, dari menu Test, pilih Configure test event.

  13. Untuk Nama peristiwa, masukkan nama untuk peristiwa pengujian, seperti MyTestEvent.

  14. Ganti teks yang ada dengan yang berikut iniJSON. Ganti AMI ID dengan informasi Anda sendiri untuk mengatur nilai latestAmi parameter Anda.

    { "parameterName":"latestAmi", "parameterValue":"AMI ID" }
  15. Pilih Simpan.

  16. Pilih Uji untuk menguji fungsi. Pada tab Hasil eksekusi, status harus dilaporkan sebagai Berhasil, bersama dengan detail lain tentang pembaruan.

Tugas 4: Buat runbook dan tambal AMI

Gunakan prosedur berikut untuk membuat dan menjalankan runbook yang menambal parameter yang AMI Anda tentukan latestAmi. Setelah otomatisasi selesai, nilai latestAmidiperbarui dengan ID yang baru AMI ditambal. Otomatisasi berikutnya menggunakan AMI yang dibuat oleh eksekusi sebelumnya.

Untuk membuat dan menjalankan runbook
  1. Buka AWS Systems Manager konsol di https://console.aws.amazon.com/systems-manager/.

  2. Di panel navigasi, pilih Dokumen.

  3. Untuk Buat dokumen, pilih Otomasi.

  4. Untuk Nama, masukkan UpdateMyLatestWindowsAmi.

  5. Pilih tab Editor, dan kemudian pilih Edit.

  6. Pilih OK saat diminta.

  7. Di bidang Editor dokumen, ganti konten default dengan YAML contoh konten runbook berikut.

    --- description: Systems Manager Automation Demo - Patch AMI and Update ASG schemaVersion: '0.3' assumeRole: '{{ AutomationAssumeRole }}' parameters: AutomationAssumeRole: type: String description: '(Required) The ARN of the role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to execute this document.' default: '' SourceAMI: type: String description: The ID of the AMI you want to patch. default: '{{ ssm:latestAmi }}' SubnetId: type: String description: The ID of the subnet where the instance from the SourceAMI parameter is launched. SecurityGroupIds: type: StringList description: The IDs of the security groups to associate with the instance that's launched from the SourceAMI parameter. NewAMI: type: String description: The name of of newly patched AMI. default: 'patchedAMI-{{global:DATE_TIME}}' InstanceProfile: type: String description: The name of the IAM instance profile you want the source instance to use. SnapshotId: type: String description: (Optional) The snapshot ID to use to retrieve a patch baseline snapshot. default: '' RebootOption: type: String description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.' allowedValues: - NoReboot - RebootIfNeeded default: RebootIfNeeded Operation: type: String description: (Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline. allowedValues: - Install - Scan default: Install mainSteps: - name: startInstances action: 'aws:runInstances' timeoutSeconds: 1200 maxAttempts: 1 onFailure: Abort inputs: ImageId: '{{ SourceAMI }}' InstanceType: m5.large MinInstanceCount: 1 MaxInstanceCount: 1 IamInstanceProfileName: '{{ InstanceProfile }}' SubnetId: '{{ SubnetId }}' SecurityGroupIds: '{{ SecurityGroupIds }}' - name: verifyInstanceManaged action: 'aws:waitForAwsResourceProperty' timeoutSeconds: 600 inputs: Service: ssm Api: DescribeInstanceInformation InstanceInformationFilterList: - key: InstanceIds valueSet: - '{{ startInstances.InstanceIds }}' PropertySelector: '$.InstanceInformationList[0].PingStatus' DesiredValues: - Online onFailure: 'step:terminateInstance' - name: installPatches action: 'aws:runCommand' timeoutSeconds: 7200 onFailure: Abort inputs: DocumentName: AWS-RunPatchBaseline Parameters: SnapshotId: '{{SnapshotId}}' RebootOption: '{{RebootOption}}' Operation: '{{Operation}}' InstanceIds: - '{{ startInstances.InstanceIds }}' - name: stopInstance action: 'aws:changeInstanceState' maxAttempts: 1 onFailure: Continue inputs: InstanceIds: - '{{ startInstances.InstanceIds }}' DesiredState: stopped - name: createImage action: 'aws:createImage' maxAttempts: 1 onFailure: Continue inputs: InstanceId: '{{ startInstances.InstanceIds }}' ImageName: '{{ NewAMI }}' NoReboot: false ImageDescription: Patched AMI created by Automation - name: terminateInstance action: 'aws:changeInstanceState' maxAttempts: 1 onFailure: Continue inputs: InstanceIds: - '{{ startInstances.InstanceIds }}' DesiredState: terminated - name: updateSsmParam action: aws:invokeLambdaFunction timeoutSeconds: 1200 maxAttempts: 1 onFailure: Abort inputs: FunctionName: Automation-UpdateSsmParam Payload: '{"parameterName":"latestAmi", "parameterValue":"{{createImage.ImageId}}"}' outputs: - createImage.ImageId
  8. Pilih Buat otomatisasi.

  9. Di panel navigasi, pilih Otomatisasi, lalu pilih Eksekusi otomatisasi.

  10. Di halaman Pilih dokumen, pilih tab Dimiliki oleh saya.

  11. Cari UpdateMyLatestWindowsAmirunbook, dan pilih tombol di UpdateMyLatestWindowsAmikartu.

  12. Pilih Berikutnya.

  13. Pilih Eksekusi sederhana.

  14. Tentukan nilai untuk parameter input.

  15. Pilih Eksekusi.

  16. Setelah otomatisasi selesai, pilih Parameter Storedi panel navigasi dan konfirmasikan bahwa nilai baru untuk latestAmi cocok dengan nilai yang dikembalikan oleh otomatisasi. Anda juga dapat memverifikasi AMI ID baru cocok dengan output Otomasi di AMIsbagian EC2 konsol Amazon.