参考
SSMパッチマネージャー利用時のハマりポイントをまとめてみた
スケジュール作成
System Manager > パッチマネージャ
「パッチ適用の設定」ボタンをクリックパッチを適用するインスタンス
項目 値 選択 インスタンスタグを入力する インスタンスタグ/キー ForceWindowsUpdat インスタンスタグ/値 true パッチ適用スケジュール
項目 値 パッチ適用の指定方法 新しいメンテナンスウィンドウでスケジュールを作成する メンテナンスの指定方法 CRON スケジュールビルダーを使用 メンテナンスの実行頻度 毎日 / 11:00 UTC メンテナンスの最大時間 2時間 (※) メンテナンス名 ForceWindowsUpdate (※)
20:00 JST から、WindowsUpdateを開始する
22:00 JST にOSを停止を実行するので、2時間あればUpdate終わると予想パッチ適用オペレーション
項目 値 アクション スキャンのみ ※「インストール」は、パッチ適用後に再起動が発生するので注意
「パッチ適用の設定」ボタンをクリック
スケジュールを確認する方法
System Manager > メンテナンスウィンドウ
※
Patch Managerからのパッチ適用は
内部的には、Run Command で、AWS-RunPatchBaseline を実行しているだけ※
AWS-RunPatchBaseline は
ベースライン(適用するパッチの種類(クリティカルとか)指定)をパラメータに取らない※
パッチのあたったインスタンスは強制的に再起動がかかります
対象インスタンスをセット
EC2インスタンスにタグをつける
項目 値 タグ名 ForceWindowsUpdate 値 true
SNS通知用の IAMポリシーを作成する
IAM > ポリシー > ポリシーの作成 > JSONタブ
1
2
3
4
5
6
7
8
9
10
11
12{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"sns:Publish"
],
"Resource": "*"
}
]
}ポリシーの確認
項目 値 Name SNSPublishPermissions ポリシーの作成ボタンをクリック
SNS通知用の IAMロールを作成する
IAM > ロール > ロールの作成
AWSサービス > EC2 を選択し、「次のステップ:アクセス権限」ボタンをクリック
アタッチするポリシー選択画面で、作成した「SNSPublishPermissions」を選択
「次のステップ:タグ」ボタンをクリック
「次のステップ:確認」ボタンをクリックロール名 を入力
項目 値 Name AmazonSNSFullAccess 「ロールの作成」ボタンをクリック
作成したロールを選択
「信頼関係」タブを選択し、”ssm.amazonaws.com” を既存のポリシーに追加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": [
"ec2.amazonaws.com",
"ssm.amazonaws.com"
]
},
"Action": "sts:AssumeRole"
}
]
}※
EC2 / SNS- IAMロール: AmazonSNSFullAccess
- IAMポリシー: SNSPublishPermissions
- IAMロール: AmazonSNSFullAccess
通知用のSNSトピックを作成
SNS > トピック > トピックの作成
項目 値 名前 run_command_report_to_slack 表示名 - 暗号化 無効 アクセスポリシー 基本 メッセージ発行を許可するユーザー トピック所有者のみ トピックにサブスクライブを許可するユーザー トピック所有者のみ 再送ポリシー デフォルト ログ記録 なし トピックの作成
通知用のLambda関数を作成
Lambda関数
項目 値 名前 Func-PatchManager_slack ランタイム Node.js v10 実行ロール lambda_basic_exection 説明 PatchMangerがEC2のアップデートを実行した結果をSlack通知 ネットワーク 非VPC 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42console.log('Loading function');
const https = require('https');
const url = require('url');
const slack_url = 'https://hooks.slack.com/services/xxxxxxxx';
const slack_req_opts = url.parse(slack_url);
slack_req_opts.method = 'POST';
slack_req_opts.headers = {'Content-Type': 'application/json'};
exports.handler = function(event, context) {
(event.Records || []).forEach(function (rec) {
if (rec.Sns) {
var req = https.request(slack_req_opts, function (res) {
if (res.statusCode === 200) {
context.succeed('posted to slack');
} else {
context.fail('status code: ' + res.statusCode);
}
});
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
context.fail(e.message);
});
var message = JSON.parse(rec.Sns.Message);
var str = "*Subject* :" + rec.Sns.Subject + "\n" +
"*CommandId* :" + message.commandId + "\n" +
"*Status* :" + message.status + "\n" +
"*DocumentName* :" + message.documentName ; "\n" +
"*InstanceID* :" + message.instanceId + "\n" +
"*RequestedDatetime* : " + message.RequestedDatetime + "\n" +
"*EventTime* :" + message.eventTime;
req.write(JSON.stringify({text: str}));
req.end();
}
});
};Lambdaに SNSのトリガーを追加
項目 値 トリガー SNS トピック arn:aws:sns:ap-northeast-1:xxx:run_command_report_to_slack 有効化 on
メンテナンスの通知
System Manager > メンテナンスウインドウ > 対象を選択
「タスク」タブ > 対象を選択 > 編集
SNS通知
項目 値 SNS通知を有効化 ON ロール AmazonSNSFullAccess SNSトピック arn:aws:sns:ap-northeast-1:xxx:run_command_report_to_slack 次の場合通知する 成功/タイムアウト/キャンセル済/失敗 通知 コマンドのステータスが変更された場合のコマンド概要