演練:修補 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 服務角色。此角色包含 AWSLambdaExecute 和 AutoScalingFullAccess 受管政策。這些政策會提供 Lambda 許可,以使用 Lambda 函數藉由最新且修補過的 AMI 建立新 Auto Scaling 群組。
建立適用於 Lambda 的 IAM 服務角色
在以下網址開啟 IAM 主控台:https://console.aws.amazon.com/iam/
。 -
在導覽窗格中,選擇 Roles (角色),然後選擇 Create role (建立角色)。
-
在 Select type of trusted entity (選取信任的實體類型) 頁面中,選擇 AWS service (AWS 服務)。
-
在 Choose a use case (選擇使用案例) 區段中,選擇 Lambda (Lambda),然後選擇 Next: Permissions (下一步:許可)。
-
在 Attach permissions policy (連接許可政策) 頁面上,搜尋 AWSLambdaExecute,然後選擇旁邊的選項。搜尋 AutoScalingFullAccess,接著選擇旁邊的選項。
-
選擇 Next: Tags (下一步:標籤)。
-
(選用) 新增一或多個標籤來組織鍵值組、追蹤或控制存取此角色,然後選擇 Next: Review (下一步:檢視)。
-
在 Review (檢閱) 頁面,確認 AWSLambdaExecute 和 AutoScalingFullAccess 均列於 Policies (政策) 之下。
-
在 Role name (角色名稱) 方塊中輸入名稱,接著輸入描述。
-
選擇 Create role (建立角色)。系統會讓您回到 Roles (角色) 頁面。
任務 2:建立 AWS Lambda 函數
使用以下程序建立 Lambda 函數,以藉由最新且修補過的 AMI 自動更新現有的 Auto Scaling 群組。
若要建立 Lambda 函數
請登入 AWS Management Console,並開啟位於 https://console.aws.amazon.com/lambda/
的 AWS Lambda 主控台。 -
選擇 Create function (建立函數)。
-
確認已選取 Author from scratch (從頭開始撰寫)。
-
在函式名稱中輸入
Automation-UpdateAsg
。 -
在 Runtime (執行時間) 清單中,選擇 Python 3.7。
-
展開 Permissions (許可)下的 Change default execution role (變更預設執行角色),驗證是否已選取 Use an existing role (使用現有角色)。
-
在 Existing role (現有角色) 清單中,選擇您先前建立的角色。
-
選擇 Create function (建立函數)。系統會顯示 Automation-UpdateAsg 的程式碼和組態頁面。
-
在 Designer (設計工具) 部分不做變更。
-
在 Code source (程式碼來源) 區段中,刪除於 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'])
-
指定此頁面剩餘的組態選項。
-
選擇 Save (儲存)。
-
選擇 Deploy (部署)。
-
選擇 Test (測試)。
-
在 Configure test event (設定測試事件) 頁面,確認已選取 Create new test event (建立新測試事件)。
-
在 Event template (事件範本) 清單中,確認已選取 Hello World。
-
在 Event name (事件名稱) 欄位輸入名稱。
-
將現有範本取代為以下的 JSON:輸入 AMI ID 和 Auto Scaling 群組。
{ "newAmiID":"
valid AMI ID
", "targetASG":"name of your Auto Scaling group
" } -
選擇 Create (建立 OpsItem)。
-
選擇 Test (測試)。輸出聲明 Auto Scaling 群組已藉由新的啟動組態成功更新。
任務 3:建立 Runbook、修補 AMI 及更新 Auto Scaling 群組
使用以下程序建立和執行 Runbook,以修補您針對 latestAmi 參數指定的 AMI。自動化接著會更新 Auto Scaling 群組以使用最新且修補過的 AMI。
建立和執行 Runbook
開啟位於 AWS Systems Managerhttps://console.aws.amazon.com/systems-manager/ 的 主控台。https://console.aws.amazon.com/systems-manager/
在導覽窗格中,選擇 Documents (文件)。
-或-
如果 AWS Systems Manager 首頁先開啟,選擇選單圖示 (
) 以開啟導覽窗格,然後在導覽窗格中,選擇 Documents (文件)。
-
在 Create document (建立文件) 下拉式清單中,選擇 Automation (自動化)。
-
在 Name (名稱) 欄位中,輸入
PatchAmiandUpdateAsg
。 -
選擇 Editor (編輯器) 標籤,然後選擇 Edit (編輯) 按鈕。
-
出現提示時選擇 OK (確定),然後在 Document editor (文件編輯器) 欄位中刪除預留位置內容。
-
在 Document editor (文件編輯器) 欄位中,貼上下列 JSON 範例 Runbook 內容。
注意 您必須將此範本中的
assumeRole
和IamInstanceProfileName
值變更為您在 設定自動化 時建立的服務角色 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" ] } -
選擇 Create automation (建立自動化) 以儲存 Runbook。
-
選擇 Automation (自動化),接著選擇 Execute automation (執行自動化)。
-
在 Automation document (自動化文件) 清單中,選擇 PatchAmiandUpdateAsg。
-
選擇 Next (下一步)。
-
在 Document details (文件詳細資訊) 部分,確認 Document version (文件版本) 設為 1。
-
在 Execution mode (執行模式) 部分,選擇 Execute the entire automation at once (一次執行整個自動化)。
-
讓 Targets and Rate Control (目標和速率控制) 選項維持為停用。
-
指定
sourceAMIid
的 Windows AMI ID、targetASG
的 Auto Scaling 群組名稱以及subnetId
輸入參數的值。 -
選擇 Execute (執行)。
-
執行完成後,在 Amazon EC2 主控台選擇 Auto Scaling (Auto Scaling),接著選擇 Launch Configurations (啟動組態)。確認您看到了新的啟動組態,且其使用新的 AMI ID。
-
選擇 Auto Scaling (Auto Scaling),然後選擇 Auto Scaling Groups (Auto Scaling 群組)。確認 Auto Scaling 群組使用新的啟動組態。
-
在您的 Auto Scaling 群組中終止一個或多個執行個體。替換執行個體會以新的 AMI ID 啟動。
您可以編輯 Lambda 函數以正常終止執行個體,藉此進一步自動化新 AMI 的部署。您也可以呼叫自己的 Lambda 函數並利用 AWS CloudFormation 的功能來更新 Auto Scaling 群組。如需詳細資訊,請參閱 UpdatePolicy 屬性。