AWS

EventBridgeルールを使用して、SSM Automationランブックを定期的に実行する

EventBridgeルールを使用して、SSM Automationランブックを定期的に実行する

以下のページで、SSM Automationランブックを実行する方法をご紹介しました。

上記のページでは、ランブックを定期的に実行するために、メンテナンスウィンドウを使用する方法を取り上げました。

今回はEventBridgeルールを使用して、ランブックを定期的に実行することを考えます。

ランブックで実行する内容ですが、上述のページと同様に、EC2インスタンスのAMIを作成することとします。

構築する環境

Diagram of Use EventBridge rule to run SSM Automation runbook periodically.

1つのプライベートサブネット内に2つのEC2インスタンスを作成します。
インスタンスは最新のAmazon Linux 2とします。
インスタンスには、タグを付与し、後述のランブックの対象とします。

SSM Automationランブックを作成します。
ランブックの実行内容ですが、AWSが所有するランブックAWS-CreateImageを実行するものです。
同ブックを実行する対象ですが、特定のタグが付与されているインスタンスとします。

EventBridgeルールを作成します。
定期的(10分に1回)、ランブックを実行するように設定します。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/122

テンプレートファイルのポイント解説

(参考)EC2インスタンス

Resources:
  Instance:
    Type: AWS::EC2::Instance
    Properties:
      IamInstanceProfile: !Ref InstanceProfile
      ImageId: !Ref ImageId
      InstanceType: !Ref InstanceType
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref PrivateSubnet
          GroupSet:
            - !Ref InstanceSecurityGroup
      Tags:
        - Key: !Ref TagKey
          Value: !Ref TagValue
Code language: YAML (yaml)

タグ設定がポイントです。
タグ情報を使って、SSM Automationランブックの実行対象を指定します。

今回は以下の通りにタグを設定します。

  • タグ名:CreateImage
  • タグの値:Group1

SSM Automationランブック

Resources:
  CreateImageRunbook:
    Type: AWS::SSM::Document
    Properties: 
      Content:
        assumeRole: "{{AutomationAssumeRole}}"
        description: Create an AMI for an EC2 instance with a specific tag.
        schemaVersion: "0.3"
        parameters:
          AutomationAssumeRole:
            type: String
            description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
            default: !GetAtt CreateImageRole.Arn
          TagKey:
            type: String
            description: (Required) The tag key of Instance.
            default: !Ref TagKey
          TagValue:
            type: String
            description: (Required) The tag value of Instance.
            default: !Ref TagValue
        mainSteps:
          - name: createImage
            action: aws:executeAutomation
            maxAttempts: 1
            timeoutSeconds: !Ref WaitForSuccessTimeoutSeconds
            onFailure: Abort
            inputs:
              DocumentName: AWS-CreateImage
              TargetParameterName: InstanceId
              Targets:
                - Key: "tag:{{TagKey}}"
                  Values:
                    - "{{TagValue}}"
      DocumentFormat: YAML
      DocumentType: Automation
      Name: !Sub "${Prefix}-CreateImageRunbook"
      TargetType: /AWS::EC2::Instance
Code language: YAML (yaml)

タグで指定したインスタンスを対象として、AMIを作成するためのSSM Automationランブックを作成します。

ランブックを自作する方法については、以下のページをご確認ください。

ポイントはステップに関する設定です。

actionsプロパティに「aws:executeAutomation」と設定することで、ランブック内から別のランブックを実行することができます。
今回はinputs内のDocumentNameプロパティに「AWS-CreateImage」を指定することで、AMIを作成します。

Tragetsプロパティに先述のタグ情報を、TargetParameterNameに「InstanceId」を指定することで、タグが付与されているインスタンスを対象として、AWS-CreateImageが実行されます。

ランブック用IAMロール

Resources:
  CreateImageRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Delete
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service:
                - ssm.amazonaws.com
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AmazonSSMAutomationRole
      Policies:
        - PolicyName: CreateImagePolicy
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - tag:GetResources
                Resource:
                  - "*"
Code language: YAML (yaml)

AWS管理ポリシーAmazonSSMAutomationRoleに加えて、インラインポリシーでtag:GetResourcesを許可するように設定します。

EventBridgeルール

Resources:
  EventsRule:
    Type: AWS::Events::Rule
    Properties: 
      Name: !Sub "${Prefix}-EventsRule"
      ScheduleExpression: rate(10 minutes)
      State: ENABLED
      Targets: 
        - Arn: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:automation-definition/${Runbook}:$DEFAULT"
          Id: !Ref Runbook
          RoleArn: !GetAtt EventsRuleRole.Arn
Code language: YAML (yaml)

ランブックを定期的に実行するために、EventBridgeルールを作成します。

ScheduleExpressionプロパティに「rate(10 minutes)」と指定することで、10分ごとにランブックを実行できます。

Targetsプロパティに、先述のランブックのARN等を指定します。

EventBridgeルール用IAMロール

Resources:
  EventsRuleRole:
    Type: AWS::IAM::Role
    DeletionPolicy: Delete
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action: sts:AssumeRole
            Principal:
              Service: events.amazonaws.com
      Policies:
        - PolicyName: !Sub "${Prefix}-StartAutomationExecutionPolicy"
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action: ssm:StartAutomationExecution
                Resource: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:automation-definition/${Runbook}:$DEFAULT"
              - Effect: Allow
                Action: iam:PassRole
                Resource: !Ref RunbookRoleArn
Code language: YAML (yaml)

インラインポリシーで2つのアクションを許可します。

1つ目はssm:StartAutomationExecutionです。
文字通り、ランブックの実行を許可する内容です。

2つ目はiam:PassRoleです。
先ほど確認したSSM Automationランブック用のIAMロールを、ランブックに渡すためです。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • EC2インスタンス:i-06de272d94a13fcef
  • SSM Automationランブック:fa-122-CreateImageRunbook
  • EventBridgeルール:fa-122-EventsRule

AWSマネージメントコンソールからSSM Automationランブックを確認します。

Detail of SSM 1.
Detail of SSM 2.
Detail of SSM 3.

ランブックが正常に作成されています。
このランブックを実行するためには、3つのパラメータを指定する必要がありますが、いずれもデフォルト値が設定されていることがわかります。

EventBridgeルールを確認します。

Detail of EventBridge 1.
Detail of EventBridge 2.

10分ごとにスケジュールされていることがわかります。
ターゲットに先述のランブックが指定されていることも確認できます。

動作確認

1回目のAMI作成

準備が整いましたので、SSM Automationランブックの動作を確認します。

Detail of SSM 4.

EventBridgeルールに従って、ランブックの実行が開始されました。
1度に3つのAutomationが実行されています。

1番下のAutomation実行の詳細を確認します。

Detail of SSM 5.

今回作成されたランブックが実行されたことがわかります。
また実行されたステップを見ると、aws:executeAutomationが実行されていることがわかります。

このステップの詳細を確認します。

Detail of SSM 6.

Input parametersを見ると、所定のタグが付与されているインスタンスを対象として、AWS-CreateImageを実行するものであることがわかります。

このAutomationを実行したことによって、3つのAutomation実行の内、中段のAutomationの実行が開始されたことがわかります。

次はこの中段のAutomationの詳細を確認します。

Detail of SSM 7.

AWS-CreateImageが実行されたことがわかります。
また実行されたステップを見ると、3つのAutomation実行の内、1番上のAutomationの実行が開始されたことがわかります。

このAutomationの詳細を確認します。

Detail of SSM 8.

Outputsを見ると、Automationの実行の結果、AMIが作成されたことがわかります。

作成されたAMIとこれに紐づくスナップショットを確認します。

Detail of AMI 1.
Detail of AMI 2.

確かに対象のインスタンスのAMIおよびスナップショットが作成されていることがわかります。

このようにEventBridgeルールによって、SSM Automationランブックが自動的に実行されて、タグによって対象に指定されたインスタンスのAMIを作成することができます。

2回目のAMI作成

EventBridgeルールによって、定期的にAMIが作成されることを確認します。

初回の実行からしばらく待機します。

Detail of SSM 9.

初回から10分後に、2回目のAutomation実行が開始されました。

Detail of SSM 10.

Automationが実行されて、AMIが作成されました。

作成されたAMIを確認します。

Detail of AMI 3.
Detail of AMI 4.

確かにAMIとスナップショットが作成されました。

確かにEventBridgeルールによって、SSM Automationランブックが定期的に自動的に実行されて、タグによって対象に指定されたインスタンスのAMIを作成することができました。

まとめ

EventBridgeルールを使用して、SSM Automationランブックを定期的に実行することによって、AMIを取得する方法を確認しました。

タイトルとURLをコピーしました