Amazon EC2 Systems Manager の Automation をやってみた #reinvent
こんにちは、藤本です。
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と多くのワークフローサービスがあります。棲み分けを理解し、適材適所で実行できるようになりたいです。