演練:修補 AMI 和更新 Auto Scaling 群組 - AWS Systems Manager

演練:修補 AMI 和更新 Auto Scaling 群組

以下範例以 演練:使用自動化、AWS Lambda 和 Parameter Store 簡化 AMI 修補 範例為基礎,新增了一個步驟,以新修補的 AMI 更新 Auto Scaling 群組。此方法可確保新的映像會自動提供給使用 Auto Scaling 群組的不同運算環境。

此範例中自動化的最後步驟使用 AWS Lambda 函數來複製現有的啟動組態並將 AMI ID 設為新修補的 AMI。Auto Scaling 群組接著會以新的啟動組態更新。在此類型的 Auto Scaling 情況下,使用者可以在 Auto Scaling 群組中終止現有的執行個體,以強制新的執行個體啟動並使用新映像。或者,使用者可以等待並允許縮減或擴展事件自然啟動較新的執行個體。

開始之前

開始此範例之前,請先完成以下任務。

  • 為 Automation 設定 IAM 角色 (AWS Systems Manager 功能)。Systems Manager 需要執行個體描述檔角色和服務角色 ARN 以處理自動化。如需更多詳細資訊,請參閱 設定自動化

  • 如果您不熟悉 Lambda,建議您藉由使用《AWS Lambda 開發人員指南》中的建立簡易 Lambda 函數主題建立簡易 Lambda 函數。該主題會協助您詳細了解建立 Lambda 函數所需的某些步驟。

任務 1:建立 AWS Lambda 的 IAM 角色

使用以下程序為 AWS Lambda 建立 IAM 服務角色。此角色包含 AWSLambdaExecuteAutoScalingFullAccess 受管政策。這些政策會提供 Lambda 許可,以使用 Lambda 函數藉由最新且修補過的 AMI 建立新 Auto Scaling 群組。

建立適用於 Lambda 的 IAM 服務角色

  1. 在以下網址開啟 IAM 主控台:https://console.aws.amazon.com/iam/

  2. 在導覽窗格中,選擇 Roles (角色),然後選擇 Create role (建立角色)

  3. Select type of trusted entity (選取信任的實體類型) 頁面中,選擇 AWS service (AWS 服務)。

  4. Choose a use case (選擇使用案例) 區段中,選擇 Lambda (Lambda),然後選擇 Next: Permissions (下一步:許可)。

  5. Attach permissions policy (連接許可政策) 頁面上,搜尋 AWSLambdaExecute,然後選擇旁邊的選項。搜尋 AutoScalingFullAccess,接著選擇旁邊的選項。

  6. 選擇 Next: Tags (下一步:標籤)

  7. (選用) 新增一或多個標籤來組織鍵值組、追蹤或控制存取此角色,然後選擇 Next: Review (下一步:檢視)

  8. Review (檢閱) 頁面,確認 AWSLambdaExecuteAutoScalingFullAccess 均列於 Policies (政策) 之下。

    
                                    貼上範本程式碼至 lambda_function 欄位
  9. Role name (角色名稱) 方塊中輸入名稱,接著輸入描述。

  10. 選擇 Create role (建立角色)。系統會讓您回到 Roles (角色) 頁面。

任務 2:建立 AWS Lambda 函數

使用以下程序建立 Lambda 函數,以藉由最新且修補過的 AMI 自動更新現有的 Auto Scaling 群組。

建立 Lambda 函數

  1. 請登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/lambda/ 的 AWS Lambda 主控台。

  2. 選擇 Create function (建立函數)

  3. 確認已選取 Author from scratch (從頭開始撰寫)

  4. 函式名稱中輸入 Automation-UpdateAsg

  5. Runtime (執行時間) 清單中,選擇 Python 3.7 (Python 3.7)。

  6. 展開 Permissions (許可)下的 Change default execution role (變更預設執行角色),驗證是否已選取 Use an existing role (使用現有角色)。

  7. Existing role (現有角色) 清單中,選擇您先前建立的角色。

  8. 選擇 Create function (建立函數)。系統會顯示 Automation-UpdateAsg 的程式碼和組態頁面。

  9. Designer (設計工具) 部分不做變更。

  10. Code source (程式碼來源) 區段中,刪除於 lambda_function 欄位預先填入的程式碼,接著貼上以下範本程式碼。

    
                                    貼上範本程式碼至 lambda_function 欄位
    from __future__ import print_function import json import datetime import time import boto3 print('Loading function') def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) # get autoscaling client client = boto3.client('autoscaling') # get object for the ASG we're going to update, filter by name of target ASG response = client.describe_auto_scaling_groups(AutoScalingGroupNames=[event['targetASG']]) if not response['AutoScalingGroups']: return 'No such ASG' # get name of InstanceID in current ASG that we'll use to model new Launch Configuration after sourceInstanceId = response.get('AutoScalingGroups')[0]['Instances'][0]['InstanceId'] # create LC using instance from target ASG as a template, only diff is the name of the new LC and new AMI timeStamp = time.time() timeStampString = datetime.datetime.fromtimestamp(timeStamp).strftime('%Y-%m-%d %H-%M-%S') newLaunchConfigName = 'LC '+ event['newAmiID'] + ' ' + timeStampString client.create_launch_configuration( InstanceId = sourceInstanceId, LaunchConfigurationName=newLaunchConfigName, ImageId= event['newAmiID'] ) # update ASG to use new LC response = client.update_auto_scaling_group(AutoScalingGroupName = event['targetASG'],LaunchConfigurationName = newLaunchConfigName) return 'Updated ASG `%s` with new launch configuration `%s` which includes AMI `%s`.' % (event['targetASG'], newLaunchConfigName, event['newAmiID'])
  11. 指定此頁面剩餘的組態選項。

  12. 選擇 Save (儲存)。

  13. 選擇 Deploy (部署)

  14. 選擇 Test (測試)

  15. Configure test event (設定測試事件) 頁面,確認已選取 Create new test event (建立新測試事件)

  16. Event template (事件範本) 清單中,確認已選取 Hello World

  17. Event name (事件名稱) 欄位輸入名稱。

  18. 將現有範本取代為以下的 JSON:輸入 AMI ID 和 Auto Scaling 群組。

    { "newAmiID":"valid AMI ID", "targetASG":"name of your Auto Scaling group" }
  19. 選擇 Create (建立)。

  20. 選擇 Test (測試)。輸出聲明 Auto Scaling 群組已藉由新的啟動組態成功更新。

任務 3:建立 Runbook、修補 AMI 及更新 Auto Scaling 群組

使用以下程序建立和執行 Runbook,以修補您針對 latestAmi 參數指定的 AMI。自動化接著會更新 Auto Scaling 群組以使用最新且修補過的 AMI。

建立和執行 Runbook

  1. 開啟位於 AWS Systems Managerhttps://console.aws.amazon.com/systems-manager/ 的 主控台。https://console.aws.amazon.com/systems-manager/

  2. 在導覽窗格中,選擇 Documents (文件)

    -或-

    如果 AWS Systems Manager 首頁先開啟,選擇選單圖示 ( ) 以開啟導覽窗格,然後在導覽窗格中,選擇 Documents (文件)。

  3. Create document (建立文件) 下拉式清單中,選擇 Automation (自動化)。

  4. Name (名稱) 欄位中,輸入 PatchAmiandUpdateAsg

  5. 選擇 Editor (編輯器) 標籤,然後選擇 Edit (編輯) 按鈕。

  6. 出現提示時選擇 OK (確定),然後在 Document editor (文件編輯器) 欄位中刪除預留位置內容。

  7. Document editor (文件編輯器) 欄位中,貼上下列 JSON 範例 Runbook 內容。

    注意

    您必須將此範本中的 assumeRoleIamInstanceProfileName 值變更為您在 設定自動化 時建立的服務角色 ARN 和執行個體描述檔角色。

    { "description":"Systems Manager Automation Demo - Patch AMI and Update ASG", "schemaVersion":"0.3", "assumeRole":"the service role ARN you created", "parameters":{ "sourceAMIid":{ "type":"String", "description":"AMI to patch" }, "subnetId":{ "type":"String", "description":"The SubnetId where the instance is launched from the sourceAMIid." }, "targetAMIname":{ "type":"String", "description":"Name of new AMI", "default":"patchedAMI-{{global:DATE_TIME}}" }, "targetASG":{ "type":"String", "description":"Auto Scaling group to Update" } }, "mainSteps":[ { "name":"startInstances", "action":"aws:runInstances", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs":{ "ImageId":"{{ sourceAMIid }}", "InstanceType":"m3.large", "MinInstanceCount":1, "MaxInstanceCount":1, "IamInstanceProfileName":"the name of the instance IAM role you created", "SubnetId":"{{ subnetId }}" } }, { "name":"installMissingWindowsUpdates", "action":"aws:runCommand", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "DocumentName":"AWS-InstallMissingWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "UpdateLevel":"Important" } } }, { "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":"{{ targetAMIname }}", "NoReboot":true, "ImageDescription":"AMI created by EC2 Automation" } }, { "name":"terminateInstance", "action":"aws:changeInstanceState", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "DesiredState":"terminated" } }, { "name":"updateASG", "action":"aws:invokeLambdaFunction", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs": { "FunctionName": "Automation-UpdateAsg", "Payload": "{\"targetASG\":\"{{targetASG}}\", \"newAmiID\":\"{{createImage.ImageId}}\"}" } } ], "outputs":[ "createImage.ImageId" ] }
  8. 選擇 Create automation (建立自動化) 以儲存 Runbook。

  9. 選擇 Automation (自動化),接著選擇 Execute automation (執行自動化)。

  10. Automation document (自動化文件) 清單中,選擇 PatchAmiandUpdateAsg

  11. 選擇 Next (下一步)

  12. Document details (文件詳細資訊) 部分,確認 Document version (文件版本) 設為 1

  13. Execution mode (執行模式) 部分,選擇 Execute the entire automation at once (一次執行整個自動化)

  14. Targets and Rate Control (目標和速率控制) 選項維持為停用。

  15. 指定 sourceAMIid 的 Windows AMI ID、targetASG 的 Auto Scaling 群組名稱以及 subnetId 輸入參數的值。

  16. 選擇 Execute (執行)

  17. 執行完成後,在 Amazon EC2 主控台選擇 Auto Scaling (Auto Scaling),接著選擇 Launch Configurations (啟動組態)。確認您看到了新的啟動組態,且其使用新的 AMI ID。

  18. 選擇 Auto Scaling (Auto Scaling),然後選擇 Auto Scaling Groups (Auto Scaling 群組)。確認 Auto Scaling 群組使用新的啟動組態。

  19. 在您的 Auto Scaling 群組中終止一個或多個執行個體。替換執行個體會以新的 AMI ID 啟動。

注意

您可以編輯 Lambda 函數以正常終止執行個體,藉此進一步自動化新 AMI 的部署。您也可以呼叫自己的 Lambda 函數並利用 AWS CloudFormation 的功能來更新 Auto Scaling 群組。如需詳細資訊,請參閱 UpdatePolicy 屬性