任意のコマンドで監視するために、まずはオンプレサーバーにSSM Agentをインストールします。
今回もAnsibleでの実行を行いました。
大元のプレイブックはこちらをご覧ください。
AWS System Managerのアクティベーションコードの発行
- まずAWS System Managerのコンソールを開き、左ペインの「ノード管理」-「ハイブリッドアクティベーション」をクリックします。下のような画面が表示されるので、「アクティベーションの作成」をクリックします。
2. デフォルトのインスタンス名 だけサーバーのホスト名に変えて、他はデフォルトで「アクティベーションの作成」をクリック
3. 下の画像のように「Activation Code」と「Activation ID」が表示されるので、控えておきます。
参考:
SSMのインストールとアクティベート
アクティベーションコードの発行が終わったら、実際にサーバーにSSMをインストールしてアクティベートしていきます。
家のNUCにはCentOS 7 が入っているので、以下のような形になりました。
- インストール用のプレイブック
# install_ssm.yml
- name: confirm exists ssm rpm
stat:
path: /tmp/amazon-ssm-agent.rpm
register: ssm_rpm
- name: ssm rpm download
get_url:
url: https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/linux_amd64/amazon-ssm-agent.rpm
dest: /tmp
when: ssm_rpm.stat.exists == false
- name: install ssm agent (yum)
become: yes
yum:
name:
- /tmp/amazon-ssm-agent.rpm
state: present
when: ssm_rpm.stat.exists == false
check_mode: no
notify: ssm activate
CloudWatch Agentと同じように、get_urlでrpmを取得してきたあと、yumモジュールでインストールしています。
インストールが行われたならhandlerのssm activateを呼ぶようにしています。
- handler
- name: ssm activate
become: yes
shell: |
systemctl stop amazon-ssm-agent &&
amazon-ssm-agent -register \
-code "{{ ssm_activation_code }}" \
-id "{{ ssm_activation_id }}" \
-region "ap-northeast-1" &&
systemctl start amazon-ssm-agent
公式ページのインストールコマンドに従って、ssm-agentの停止、アクティベート、起動を行っています。
group_varsの方で、ssm_activation_codeとssm_activation_idを先ほど控えたものを設定しておいて、こちらで読み込んでいます。
参考:
プライベートキーの自動ローテーション設定
アクティベートした後のプライベートキーは、自動ローテーションが設定できるようなのでこちらも設定します。
ssmをインストールした後に出来る amazon-ssm-agent.json.templateをAnsible実行端末側にもってきて、そちらを書き換えてAnsibleでコピーしています。
- name: config ssm
become: yes
copy:
src: amazon-ssm-agent.json
dest: /etc/amazon/ssm/amazon-ssm-agent.json
notify:
- Restart ssm daemon
handlerではただデーモンを再起動しているだけです。
- name: Restart ssm daemon
become: yes
service:
name: amazon-ssm-agent
state: restarted
amazon-ssm-agent.json はこのようにしています。
ローテーションの設定として、ProfileのKeyAutoRotateDaysを1に変えているだけです。(デフォルト0)
{
"Profile":{
"ShareCreds" : true,
"ShareProfile" : "",
"ForceUpdateCreds" : false,
"KeyAutoRotateDays": 1
},
"Mds": {
"CommandWorkersLimit" : 5,
"StopTimeoutMillis" : 20000,
"Endpoint": "",
"CommandRetryLimit": 15
},
"Ssm": {
"Endpoint": "",
"HealthFrequencyMinutes": 5,
"CustomInventoryDefaultLocation" : "",
"AssociationLogsRetentionDurationHours" : 24,
"RunCommandLogsRetentionDurationHours" : 336,
"SessionLogsRetentionDurationHours" : 336,
"PluginLocalOutputCleanup": "",
"OrchestrationDirectoryCleanup": ""
},
"Mgs": {
"Region": "",
"Endpoint": "",
"StopTimeoutMillis" : 20000,
"SessionWorkersLimit" : 1000
},
"Agent": {
"Region": "",
"OrchestrationRootDir": "",
"SelfUpdate": false,
"TelemetryMetricsToCloudWatch": false,
"TelemetryMetricsToSSM": true,
"AuditExpirationDay" : 7,
"LongRunningWorkerMonitorIntervalSeconds": 60
},
"Os": {
"Lang": "en-US",
"Name": "",
"Version": "1"
},
"S3": {
"Endpoint": "",
"Region": "",
"LogBucket":"",
"LogKey":""
},
"Kms": {
"Endpoint": ""
}
}
まとめ
これで一応コマンド等を実行できる環境が整いました。
RunCommandで任意のコマンド実行結果をCloudWatchで監視するまでもう一息です。。。
コメント