Systems Manager

AWS Systems Managerでタグを設定したEC2インスタンスを自動停止する【失敗】

これまでEC2インスタンスの自動起動停止は、EC2を一台起動し、AWS CLIにより実現していました。

しかし、この方法はcronとシェルと駆使するのでとても管理が煩雑でした。
IAMユーザーの追加も必要だったので、セキュリティ的にも今ひとつ。
シェルでインスタンスIDを一台一台定義する必要もあったので、台数が増えれば増えるほどコーディングも複雑になり大変でした。

一番いいのは、せっかくインスタンスにもタグを付ける機能があるので、タグでまとめて停止したり起動したりできるようになることです。

たまたまインターネットを見てみたらこちらの記事を発見!

これは行けるかも?と思ってチャレンジしてみましたが、うまく動作させることができませんでした(T_T)

 

AWS Systems Manager ドキュメントの作成

AWSマネージメントコンソール

サービスを「systems」で検索します。
下に「Systems Manager」が表示されるのでクリックします。

AWS Systems Manager

左のサイドバーを下にスクロールすると、一番下にドキュメントが表示されるのでクリックします。

AWS Systems Managrer Document

「AWS-ASGEnterStandby」をクリックした後に、画面右上の「Create automation」をクリックします。

Create automation ドキュメントの作成

名前を入力します。
コンテンツをクリックします。
Editをクリックします。

---
description: Exec AWS-StopEC2Instances
schemaVersion: "0.3"
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  AutoStopTime:
    type: String
    default: PM06
    description: (Required) PM06 or PM11 
    allowedValues:
    - PM06
    - PM11
  AutomationAssumeRole:
    type: String
    description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
    default: ""
mainSteps:
  - name: StopEC2Instances
    action: aws:executeAwsApi
    inputs:
      Service: ssm
      Api: StartAutomationExecution
      DocumentName: AWS-StopEC2Instance
      TargetParameterName: "InstanceId"
      Targets:
        -
           Key: tag:AutoStopTime
           Values: 
             - "{{ AutoStopTime }}"

 

こちらの内容を貼り付けます。

「Create automation」をクリックします。

ドキュメントの確認

「自己所有」をクリックして、先程作成したドキュメントが作成されていることを確認します。

 

テストします

実際にインスタンスを停止します!
EC2タグ追加

停止させるEC2インスタンスに、キーがAutoStopTimeで、値がPM06というタグを追加します。

オートメーションを実行する

先程作成したドキュメントを開き、「オートメーションを実行する」をクリックします。

ドキュメント実行

「PM06」を選択します。
「実行」をクリックします。

成功

ドキュメントの実行が成功しました。

実際にEC2インスタンスが停止していることを確認します。

 

CloudWatch Eventで自動実行設定

午後6時にPM06タグが付与されているEC2インスンタンスを停止するようにCloudWatch Eventsに設定します。

IAM ロールの作成

EC2の起動停止はSSM Automationの機能を利用します。
CloudWatch EventsがSSMを呼び出すためのIAMロールを作成。

IAMにアクセスします。
ロールをクリックします。
ロールの作成をクリックします。
EC2をクリックします。
「次のステップ:アクセス権限」をクリックします。
「AmazonSSMAutomationRole」をチェックします。
「次のステップ:タグ」をクリックします。
「次のステップ:確認」をクリックします。

IAMロール作成

ポリシーに「AmazonSSMAutomationRole」が選択されていることを確認し、「ロールの作成」をクリックします。

IAMロール信頼関係

信頼関係を編集します。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "events.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

 

信頼されたエンティティが「IDプロバイダー events.amazonaws.com」なっていることを確認します。

 

CloudWatch Eventsの作成

土日は動作させないので、停止は月曜日〜金曜日となります。

CloudWatch events設定
Cron式はUTCで入力します
ルールの名前

ルール名は、「EC2AutoStopPM06」としました。

 

失敗しました

StopEC2InstancesUsingTagsのオートメーション実行は成功する

自分で作成したStopEC2InstncesUsingTagsを「オートメーションを実行する」で実行すると成功します。

AWS-StopEC2Instanceを直接指定なら成功する

失敗状況

CloudWatchイベントで、自分で作成したドキュメントStopEC2InstancesUsingTagsは失敗しますが、Amazonが所有しているAWS-StopEC2Instanceの実行は成功します。

エラー内容

エラーメッセージ

やはり権限か何かが足らないのか?

 

さいごに

タグを指定してのEC2インスタンスの停止は失敗しました。

とりあえず、EC2インスタンスを直接指定しての停止は成功しているので、このままで運用します。

失敗例も記事にしておくことで、上手くいくようになったときにはすぐに変更するようにします。