Amazon EC2 Systems Manager の Automation をやってみた #reinvent

2016.12.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、藤本です。

AWS re:Invent 2016 の 2日目のキーノートで発表された新機能、Amazon EC2 Systems Manager

今回は Amazon EC2 Systems Manager の Automation を触ってみました。

Amazon EC2 Systems Manager

Amazon EC2 Systems Manager に関しては下記エントリで概要を説明していますので、ご参照ください。

【速報】Amazon EC2 Systems Manager を発表 #reinvent

Systems Manager Automation

Systems Manager Automation は EC2インスタンスの保守作業、デプロイ作業を自動化します。EC2インスタンスのオペレーションと、順番を定義することでワークフロー化できます。オペレーションはオペレーション単位で成否を確認することができ、どのオペレーションで失敗したのか、というのを実行後に簡単に追うことができます。例えば、今回のエントリで取り上げるのは、AMIのOSパッチの適用です。AMIのOSパッチ適用は、AMIからインスタンスを作成、起動したインスタンスでOSパッチ適用、(静止点を設けるためには)インスタンスの停止、AMI取得、インスタンスの削除という流れのオペレーションが必要になります。今までは頑張ってスクリプトを実装したり、ジョブスケジューラを用意する必要がありました。Automation はコードレスでJSONを定義するだけでこれらのジョブ処理を実行することができます。

今現在サポートされているオペレーションは以下となります。

設定項目 説明
aws:runInstance AMI からインスタンスを起動
aws:runCommand Run Command の実行
aws:invokeLambdaFunction Lambda Function の実行
aws:changeInstanceState インスタンスの起動、停止、終了
aws:createImage インスタンスから AMI 作成
aws:deleteImage AMI の削除

Run Command、Lambda Function があれば大概のことはできそうですね。Lambda Function 使うなら Step Functoins でもいいのか。うーん、棲み分けがまだ分かってない。

やってみた

Automation を利用するには下記の流れで実施します。

  • IAM Role 作成
  • Automation の Document を定義
  • Automation の実行

今回はSystems Manager Automation WalkthroughsのAmazon Linux版をやってみました。

Walkthroughs の Automation で実施する処理は以下となります。

  • AMI からインスタンスを起動
  • RunCommand によりシステムアップデート
  • インスタンスを停止
  • 停止したインスタンスから AMI を取得
  • インスタンスを終了

上記だと、Packer をイメージしました。簡単な Packer の処理ならできそうですね。

IAM Role 作成

SSM から実行できる IAM Role を作成します。

Name は AutomationRole とします。

IAM_Management_Console

Role Type に Amazon EC2 を選択します。

IAM_Management_Console

Policy に AmazonEC2AutomationRole を選択します。

IAM_Management_Console

作成した AutomationRole への権限の追加、Trusted Relationship を設定します。

まずは権限を追加します。追加する権限は iam:PassRole です。

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

続いて、Trusted Relastion へ ssm.amazonaws.com からの呼び出し設定を追加します。

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

Automation の Document 定義

続いて、Automation の Document を定義します。Automation は RunCommand の Document同様、JSON で定義します。

今回はサンプルをそのまま利用します。IAM Role の ARN と ProfileName だけ上で作成した IAM Role の情報に置き換えます。

Document の一覧から Create Document を選択します。

EC2_Management_Console 5

下記を設定します。

設定項目 説明
Name 任意の名前
Document Type Automation を選択
Content JSONで処理内容を順番に定義

EC2_Management_Console 2

作成が開始されます。

EC2_Management_Console 3

作成されると、Owner が自身の AWSアカウントIDで一覧に追加されます。

EC2_Management_Console 4

Content の書き方

Content は JSON形式で Automation のジョブフローを定義します。Automation に対する設定と、一つのオペレーションに対する設定の大きく2種類があります。

まずは Automation の設定です。

設定項目 説明
description Automation Document の説明
schemaVersion 現在は 0.3 です
assumeRole Automation がオペレーションを行う権限を定義した IAM Role の ARN
parameters Document に埋め込みたくない外部注入した値をパラメータ化
mainSteps オペレーションを処理順に定義 オペレーションの設定は後述
outputs Automation の実行結果で出力したいものをパラメータを使って選択できます

次に、オペレーション に対する設定です。

設定項目 説明
name オペレーションを識別する名前
action 下記のいずれか aws:runInstance aws:runCommand aws:invokeLambdaFunction aws:changeInstanceState aws:createImage aws:deleteImage
timeoutSeconds オペレーションのタイムアウト時間
maxAttempts 最大リトライ回数
onFailure 処理失敗時の対応 Continue : 失敗しても次の処理を実行 Abort : 失敗したら Automation を中断
その他 action によってその他のパラメータは異なります

詳細は下記ページをご参照ください。

Actions Reference for Automation Documents

Automation の実行

それでは作成した Automation を実行しましょう。

Automation のページへ移動し、Run automation を選択します。

EC2_Management_Console

下記設定項目を入力します。

設定項目 説明
Document Name 作成した Automation の Document をプルダウンから選択
Version Document はバージョン管理されます。作成時は 1 のみ
Input Pamameters Document でパラメータ化した設定を入力 今回はベースとなる AMI の ID、および作成するAMIの名前を設定

EC2_Management_Console

実行が開始されます。

EC2_Management_Console

一覧にも表示されます。処理が順次実行される様子がわかります。

EC2_Management_Console

Status が Success になれば完了です。各ステップも全て Success になっています。

EC2_Management_Console

AMI ページに行くと指定した名前で AMI が作成されています。

EC2_Management_Console

まとめ

いかがでしたでしょうか?

Automation により限られた操作ではありますが、簡略な処理のジョブ化ができるようになりました。今回の発表で他にも、Step Functions、AWS Batch、以前からあったData Pipeline、Simple WorkFrowと多くのワークフローサービスがあります。棲み分けを理解し、適材適所で実行できるようになりたいです。