タグ指定でEC2インスタンスを起動・停止する


概要

起動・停止自体の方法は以下の記事に記載されている通りですが、内容がよくわからなかったので、設定の詳細について調べてみました。

https://qiita.com/uzresk/items/504d52bf1042c1067dde

結論

  • SystemManagerの機能でタグによる絞込がサポートされているので有効活用しましょう。
  • タイトルはEC2ですが、EC2に限らず、RDSやタグをサポートしているリソースであれば一通り操作できそうな感じがあります。

読み解く対象

設定するymlの中身は以下の通りです。

description: StartEC2Instances Using Tags:StartTime
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  StartTime:
    type: String
    default: 8am
    description: (Required) 7am,8am,9am
    allowedValues:
    - 7am
    - 8am
    - 9am
  AutomationAssumeRole:
    type: String
    description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
    default: ""
mainSteps:
  - name: StartEC2Instances
    action: aws:executeAwsApi
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StartEC2Instance
      TargetParameterName: "InstanceId"
      Targets:
        -
           Key: tag:StartTime
           Values: 
             - "{{ StartTime }}"

mainStepsの中身を見ていきます。

action

input

  • Service
    • 名前空間を指定します。
    • 今回はssmなのでSystemManagerを指定しています。
  • Api
  • DocumentName
  • TargetParameterName
    • DocumentNameで指定したrunbookのパラメータを指定します
    • 対象のrunbookはinstanceIdを指定するので、InstanceIdを設定しています。
  • Targets
    • ターゲットの名称を指定します。
    • tag:StartTimeなので、StartTimeのタグがStartTimeを指定しています。

Tagの指定方法はどこにあるのか

  • AWS-StartEC2Instanceの引数はinstanceIdのみです。実際にEventBridgeの画面から対象のSystemManagerを設定する場合はインスタンスIDを直接指定します

  • SystemManagerの画面からでもinstanceIdの指定になります。

  • しかし、記載しているスクリプトではInstanceIdを指定せずにtagのみを指定して動作させています。botoのリファレンスにもTagの記述の仕方はあるものの、絞込として使えるかについて記述がなく、非公式かと疑っていました。

  • SystemManagerのドキュメントを見ていたところ、以下の記述がありました

Amazon Elastic Compute Cloud (Amazon EC2) (中略) などの多くの AWS リソースはタグをサポートしています。タグをターゲットにすることにより、AWS リソースに対するオートメーションをすばやく実行できます。
  • また、例 1: Amazon EC2 インスタンスを再起動するために、キーと値のペアを使用してタグをターゲットにする が例として挙げられていました。
  • コマンドとしては以下の通りです。
aws ssm start-automation-execution \
    --document-name AWS-RestartEC2Instance \
    --targets Key=tag:Department,Values=HumanResources \
    --target-parameter-name InstanceId \
    --parameters "AutomationAssumeRole=arn:aws:iam::111122223333:role/AutomationServiceRole"

結論

SystemManagerのstart-automation-executionが実行するときにTagで対象のInstanceIdを絞込してくれて、InstanceIdの分だけAWS-RestartEC2Instanceを実行していました。
EventBridgeのルールとSystemManagerのrunbook(オートメーション)が混ざっててわかりにくいですが、まとめてすっきりしました。