
Amazon EC2 Systems Manager の Automation をやってみた #reinvent
この記事は公開されてから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 とします。

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

Policy に AmazonEC2AutomationRole を選択します。

作成した 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 を選択します。

下記を設定します。
| 設定項目 | 説明 |
|---|---|
| Name | 任意の名前 |
| Document Type | Automation を選択 |
| Content | JSONで処理内容を順番に定義 |

作成が開始されます。

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

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 を選択します。

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

実行が開始されます。

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

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

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

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







