EC2 Systems Manager の Automation を使ってみた

記事タイトルとURLをコピーする

こんにちは、サービス開発課の柳瀬です。普段は Cloud Automatorの開発をしています。

先日アメリカのラスベガスでは AWS re:Invent が開催されており、たくさんのサービスが公開されました。そんなとき私はというと、福岡県に旅行に行っておりまして、美味しいものを食べてリフレッシュしてきました。初日に茅乃舎というところで食事をしたのですが、オススメです。レストランは博多市内から少し離れた山の中にあり、空気が良いところで美味しい食事を頂くことができます。
月ごとに食材が変わっているようなので、季節ごとに行ってみたいと思わせてくれるようなお店でした。人気のお店なので、予約はした方が良さそうです。4名以上ですと、送迎もあるようなので是非行ってみて下さい。

さて AWS re:Invent で発表された EC2 Systems Manager ですが、既に提供されていた Run Command の他に State Manager と Automation という機能が追加されているようです。今回は Automation の使い方について書いてみようと思います。

EC2 Systems Manager Automation とは

EC2 Systems Manager Automation は、EC2 Systems Manager が提供する機能の1つとなります。公式サイトにかかれている英語をGoogle翻訳に入力してみると、以下のように翻訳されます。Google翻訳素晴らしい。

EC2 Systems Managerの自動化機能は、Amazonマシンイメージ(AMI)のアップデートなど、一般的なメンテナンスおよびデプロイメントタスクを簡素化します。オートメーションによって、AMIのメンテナンスが大幅に簡素化され、合理化され、再現性があり、監査可能なプロセスを使用してAMIにパッチを適用したり、エージェントをアップデートしたり、アプリケーションをベイクすることができます。オートメーションを使用して、ワークフローを迅速に構築して複雑なタスクを実行できます。事前に定義されたワークフローを使用するか、JSONベースのドキュメントを使用して独自のワークフローを構築して実行することができます。

EC2 Systems Manager Automation を使う

EC2 Systems Manager Automation へのアクセス

EC2 Systems Manager へアクセスするには、EC2 のウェブコンソール画面か、AWS CLIからアクセスします。
ウェブコンソールから EC2 Systems Mangaer へアクセスする場合は、左メニューの SYSTEMS MANAGER SERVICES 内の Automations から利用します。また、Automations は定義済みの JSON Document を使って利用するのですが、Document を作成する場合は SYSTEMS MANAGER SHARED RESOURCES 内の Documents から作成します。
Documents は公式ドキュメントに書かれているように AWS が公開しているものもありますし、ユーザー自身で定義することも出来ます。例えば、現時点では AWS-UpdateLinuxAmi というドキュメントが AWS から公開されているようです。

EC2 Systems Manager Automation を利用するめに必要となるIAM

EC2 Systems Manager Automation を使うためには IAM ロールの作成が必要です。公式サイトに手順が記載されているので、手順に従ってIAMロールを作成します。

1 IAM のウェブコンソールを開き、左メニューの Role から Create New Role をクリックします
2 Role Name に任意のロール名を入力して次に進みます
3 Role Type は AWS Service Roles の Amazon EC2 を選択します
4 AmazonSSMAutomationRoleをアタッチして次に進みます
5 内容を確認して Role を作成します
6 左メニューの Roles から作成した IAM Role を選択します
7 Permissions タブの Inline Policies に以下のようなポリシーを追加します

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:PassRole"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

8 Trust Relationships タブの Edit Trust Relationship から 以下のように Trust Relationship を編集します

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

AWS-UpdateLinuxAmi を使って Automation を実行する

次に AWS が公開している AWS-UpdateLinuxAmi を使って Automation を実行してみます。

  1. SSM エージェントがインストールされた、Amazon Linux AMI を用意しておきます
  2. 起動した EC2 インスタンスにアタッチする AmazonEC2RoleforSSM をアタッチした IAM Role を用意しておきます
  3. EC2 のウェブコンソールを開き、左メニューの SYSTEMS MANAGER SERVICES 内の Automation から Run Automation をクリックします
  4. Document name はプルダウンから AWS-UpdateLinuxAmi を選択します
  5. Version は プルダウンから 1 を選択します
  6. SourceAmiId に用意した Amazon Linux AMI の AMI ID を入力します
  7. InstanceIamRole には先程作成した IAM Role Name を入力します
  8. AutomationAssumeRole には先程作成した IAM Role の ARN を入力します

自分自身で Document を書く場合

自分自身で JSON で Document を書く場合は、Systems Manager Automation Walkthroughs を読んで感触を掴んでから書き始めると良さそうです。また、Actions Reference や、変数について書かれた Automation System Variables などが参照になります。
Document のパラメーターは Input Parameter で Automation Execution を作成するタイミングで定義出来るようにすると再利用しやすくなると思います。 例えば特定のEC2インスタンスからAMIを取得するだけのシンプルな Document であれば以下のようになります。

{
   "description":"Create image from instance",
   "schemaVersion":"0.3",
   "assumeRole":"{{ AssumeRoleArn }}",
    "parameters":{
      "AssumeRoleArn":{
         "type":"String",
         "description":"(Required) Role under which to execute this automation."
      },
      "SourceInstanceId":{
         "type":"String",
         "description":"(Required) Target EC2 instance of new AMI"
      },
      "TargetAmiName":{
         "type":"String",
         "description":"Name of new AMI",
         "default":"newAMI-{{global:DATE_TIME}}"
      }
   },
   "mainSteps":[
      {
         "name":"createImage",
         "action":"aws:createImage",
         "maxAttempts":1,
         "onFailure":"Continue",
         "inputs":{
            "InstanceId":"{{ SourceInstanceId }}",
            "ImageName":"{{ TargetAmiName }}",
            "NoReboot":true,
            "ImageDescription":"AMI created by EC2 Automation"
         }
      }
   ],
   "outputs":[
      "createImage.ImageId"
   ]
}

JSON Document を作成したら、SYSTEMS MANAGER SHARED RESOURCES 内の Documents にある Create Document から Document を作成します。
Name に任意の名前を、Document Type は Automation を指定します。

ユースケース

AWS から提供されているドキュメントのように、ゴールデンイメージのような AMI のパッチングや、決められたアプリケーションのインストールやその前後作業などを Document にしておくと日々の運用を簡略化出来ると思います。Auto Scalig などにも対応すると、ゴールデンイメージへのパッチング後に Launch Configuration をアップデートすることなども自動化出来ると思うので、今後が楽しみです。

まとめ

公式サイトに記載されているとおり、Systems Manager Automation を使うことで簡単な運用業務の自動化が出来ました。EC2 Systems Manager は利用そのものに関しては料金がかかりませんので、同等のことを AWS Lambda などを使っている場合に費用の削減が出来そうです。上述したように Document は JSON で定義することを考えると、より高度な処理は今まで通り AWS Lambda などを使って定義するようになりそうです。また、State Managerとは違ってスケジューリングの機能は現時点で提供されていないようですが、今後に期待したいです。
冒頭に書きましたとおり、私が所属するサービス開発課でも Cloud Automator という AWS の運用を自動化するサービスを開発しておりますので、是非ご検討下さい。

Cloud Automator(クラウドオートメーター)とは、バックアップや災害対策、AWS費用の削減といった「ジョブ」と、AWSがガイドライン通りに運用されていることを継続的に確認する「構成レビュー」という2つのAWS運用を自動化し、AWSの利用メリットを最大限に引き出すサービスです。

Cloud Automator

参考リンクまとめ