チュートリアル: オートメーション、AWS Lambda、Parameter Store を使用した AMI パッチ適用の簡素化 - AWS Systems Manager

チュートリアル: オートメーション、AWS Lambda、Parameter Store を使用した AMI パッチ適用の簡素化

次の例は、AMI で説明している Windows チュートリアル: Windows Server AMI にパッチを適用する を更新する方法を拡張したものです。この例では、Amazon Elastic Compute Cloud (Amazon EC2) AMIs から構築するのではなく、組織が独自の AMIs を維持し、定期的にパッチを適用するモデルを使用しています。

次の手順は、最新または 最後 の AMI であると既にみなされている Windows AMI にオペレーティングシステム (OS) のパッチを自動的に適用する方法を示しています。この例では、パラメータ SourceAmiId のデフォルト値は、AWS Systems Manager という Parameter Store latestAmi のパラメータによって定義されます。latestAmi の値は、オートメーションの終了時に呼び出される AWS Lambda 関数によって更新されます。このオートメーションプロセスの結果として、パッチ適用が常に最新の AMI に適用されるため、AMIs のパッチ適用に費やされる時間と労力が最小限に抑えられます。Parameter Store とオートメーションは、AWS Systems Manager の機能です。

開始する前に

Automation ロール、およびオプションで、Automation 用の Amazon EventBridge を設定します。詳細については、「」を参照してくださいオートメーションの設定

タスク 1: Systems Manager Parameter Store でパラメータを作成する

Parameter Store で以下の情報を使用する文字列パラメータを作成します。

  • Name (名前)latestAmi]: 。

  • [Value]: Windows AMI ID。例: ami-188d6e0e

Parameter Store の文字列パラメータの作成方法については、「Systems Manager パラメータを作成する」を参照してください。

タスク 2: 用の IAM ロールを作成するAWS Lambda

の IAM サービスロールを作成するために、次の手順を使用しますAWS Lambda これらのポリシーは、Lambda に Lambda 関数および Systems Manager を使用して、latestAmi パラメータの値を更新する権限を与えます。

Lambda の IAM サービスロールを作成するには

  1. AWS Management Console にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションペインで、[Policies] を選択し、次に [Create policy] を選択します。

  3. [JSON] タブを選択します。

  4. デフォルトコンテンツを以下のものと置き換えます。us-west-2 および 123456789012 を、使用するリージョンとアカウントに置き換えてください。updateAmiFunction を Lambda 関数の名前に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-west-2:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-west-2:123456789012:log-group:/aws/lambda/updateAmiFunction:*" ] } ] }
  5. [ポリシーの確認] を選択します。

  6. [Review policy (ポリシーの確認)] ページで、[Name (名前)] にインラインポリシーの名前を入力します (amiLambda など)。

  7. [Create policy] を選択します。

  8. ステップ 2 と 3 を繰り返します。

  9. デフォルトコンテンツを以下のものと置き換えます。us-west-2 および 123456789012 を、使用するリージョンとアカウントに置き換えてください。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:us-west-2:123456789012:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }
  10. [ポリシーの確認] を選択します。

  11. [Review policy (ポリシーの確認)] ページで、[Name (名前)] にインラインポリシーの名前を入力します (amiParameter など)。

  12. [Create policy] を選択します。

  13. ナビゲーションペインで [Roles] を選択し、続いて [Create role] を選択します。

  14. [このロールを使用するサービスを選択] のすぐ下で、[Lambda]、[Next: Permissions (次の手順: アクセス許可)] を選択します。

  15. [Attach permissions policies (アクセス許可ポリシーをアタッチする)] ページで、[検索] フィールドを使用して、前に作成した 2 つのポリシーを見つけます。

  16. ポリシーの横にあるチェックボックスをオンにし、[Next: Tags (次の手順: タグ)] を選択します。

  17. (オプション) 1 つ以上のタグキーと値のペアを追加して、このロールのアクセスを整理、追跡、または制御し、[次へ: 確認] を選択します。

  18. [ロール名] に、新しいロールの名前を入力 (lambda-ssm-role など) するか、希望する別の名前を入力します。

    注記

    多くのエンティティによりロールが参照されるため、作成後にロール名を変更することはできません。

  19. [ロールの作成] を選択します。

タスク 3: AWS Lambda 関数を作成する

latestAmi パラメータの値を自動的に更新する Lambda 関数を作成するには、次の手順を使用します。

Lambda 関数を作成するには

  1. AWS Management Console にサインインして AWS Lambda コンソール (https://console.aws.amazon.com/lambda/) を開きます。

  2. [Create function] を選択します。

  3. [Create function] ページで、[Author from scratch] を選択します。

  4. [Function name] に「Automation-UpdateSsmParam」と入力します。

  5. [Runtime] リストで、[Python 3.8] を選択します。

  6. [Permissions (アクセス許可)] セクションで、[実行ロールの選択または作成] を選択します。

  7. [Use an existing role (既存のロールの使用)] を選択し、タスク 2 で作成した Lambda のサービスロールを選択します。

  8. [Create function] を選択します。

  9. [Function code (関数コード)] 領域の [lambda_function] タブで、フィールドにあらかじめ入力されているコードを削除し、以下のコードサンプルを貼り付けます。

    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 ) reponseString = 'Updated parameter %s with value %s.' % (event['parameterName'], event['parameterValue']) return reponseString
  10. [Save] を選択します。

  11. Lambda 関数をテストするには、[テストイベントの選択] メニューから、[テストイベントの設定] を選択します。

  12. [Event name] で、MyTestEvent など、テストイベントの名前を入力します。

  13. 既存のテキストを次の JSON に置き換えます。your-ami-idlatestAmi パラメータ値として設定する新しい AMI の ID に置き換えます。

    { "parameterName":"latestAmi", "parameterValue":"your-ami-id" }
  14. [Create] を選択します。

  15. [テスト (Test)] を選択して関数をテストします。出力は、パラメータの正常な更新と更新の詳細を示す必要があります。たとえば、「値 ami-123456 で、パラメータ latestAmi を更新しました」などです。

タスク 4: ランブックを作成し、AMI にパッチを適用する

以下の手順を使用して、[latestAmi] パラメータに指定した AMI にパッチを適用したランブックを作成して実行します。オートメーションが完了すると、latestAmi の値は、新しくパッチ適用された AMI の ID で更新されます。以降のオートメーションは、以前の実行で作成された AMI を使用します。

ランブックを作成し、AMI にパッチを適用するには

  1. AWS Systems Manager コンソール (https://console.aws.amazon.com/systems-manager/) を開きます。

  2. ナビゲーションペインで、[ドキュメント] を選択します。

    -または-

    AWS Systems Manager ホームページが最初に開く場合は、メニューアイコン ( ) を選択してナビゲーションペインを開き、[ドキュメント] を選択します。

  3. [Create automation (オートメーションを作成)] を選択します。

  4. [Name (名前)] フィールドに、UpdateMyLatestWindowsAmi と入力します。

  5. [Editor (エディタ)] タブを選択し、次に [Edit (編集)] を選択します。

  6. [Document editor (ドキュメントエディタ)] フィールドのデフォルトの内容を、次の JSON サンプルランブックに置き換えます。

    注記

    このサンプルの assumeRoleIamInstanceProfileName の値は、オートメーションの設定 の作成時にサービスロール ARN とインスタンスプロファイルのロールを使用して変更する必要があります。

    { "description":"Systems Manager Automation Demo – Patch AMI and Update SSM Param", "schemaVersion":"0.3", "assumeRole":"the role ARN you created", "parameters":{ "sourceAMIid":{ "type":"String", "description":"AMI to patch", "default":"{{ssm:latestAmi}}" }, "targetAMIname":{ "type":"String", "description":"Name of new AMI", "default":"patchedAMI-{{global:DATE_TIME}}" } }, "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 IAM role you created" } }, { "name":"installMissingWindowsUpdates", "action":"aws:runCommand", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "DocumentName":"AWS-InstallWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "SeverityLevels":"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":"updateSsmParam", "action":"aws:invokeLambdaFunction", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs":{ "FunctionName":"Automation-UpdateSsmParam", "Payload":"{\"parameterName\":\"latestAmi\", \"parameterValue\":\"{{createImage.ImageId}}\"}" } } ], "outputs":[ "createImage.ImageId" ] }
  7. [Create automation (オートメーションを作成)] を選択してランブックを保存します。

  8. ナビゲーションペインで、[オートメーション]、[オートメーションの実行] の順に選択します。

  9. [Choose document (ドキュメントの選択)] ページで、[Owned by me (所有者)] タブを選択し、[UpdateMyLatestWindowsAmi] のカードのボタンを選択します。

  10. [Document details] セクションで、[Document version] が [1 (Default)] に設定されていることを確認します。

  11. [Next] を選択します。

  12. [ Simple execution (シンプルな実行)] を選択します。

  13. [Execute] を選択します。

  14. 実行の完了後に、ナビゲーションペインで [Parameter Store] を選択し、latestAmi の新しい値がオートメーションから返された値と一致することを確認します。新しい AMI ID が、Amazon EC2 コンソールの [AMIs] セクションに表示される Automation の出力と一致することを確認することもできます。