Systems Manager Distributor を活用してソフトウェア配布を行う!
園部です。
Systems Manager Distributor 利用されていますでしょうか?
コチラの機能は2018年11月にリリース された機能となります。
今まで、しっかり試す機会がなかったのですが、先日コチラ( Packaging to Distribution – Using AWS Systems Manager Distributor to deploy Datadog )で紹介されているのを拝見して改めてやってみました。
Systems Manager Distributor とは?
公式サイトより一部抜粋した内容は以下の通りです。
AWS Systems Manager は、ソフトウェアエージェントなどのソフトウェアパッケージを安全に配信およびインストールするのに役立ちます。
Systems Manager Distributor を使用すると、ソフトウェアパッケージを一元的に保存し、システムで配信しながら、バージョニング管理することができます。ソフトウェアパッケージを作成および配信するにはディストリビューター、ソフトウェアパッケージをインストールするには Systems Manager の Run Command とステートマネージャーを使用します。
(引用: https://aws.amazon.com/jp/systems-manager/features/ )
やってみた
ベースとしては、上記で紹介されているブログを踏襲した内容となります。
テストケース
管理組織(アカウントA)と利用組織(アカウントB)を分けて、管理組織で組織標準バージョン(パッケージ)を登録し、利用組織(アカウントB)ではそちらを利用しインストールを行います。
現場での大量(複数OS)対象に対するインストール作業も想定し、いくつかのOSを用意してインストールを実行します。
公式ドキュメントでも、「Distributor はどのようなユーザーに適していますか?」 にてユースケースが紹介されています。
• 一度に複数の AWS Systems Manager マネージドインスタンスに対して、AWS で公開されたパッケージを含む既存のソフトウェアパッケージを新規作成またはデプロイしたい AWS のお客様。
• ソフトウェアパッケージを作成するソフトウェア開発者。
• AWS Systems Manager のマネージドインスタンスを最新のソフトウェアパッケージで最新の状態に保つ責任がある管理者。(引用: https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/what-is-distributor.html#distributor-who )
テスト環境
- 必要なモノ
- AWS アカウント x2(今回テストケースでは2つですが、1つでも3つ以上でも可能です)
- Datadog アカウント(APIKEYが必要なため)
- アカウント
- アカウントA: ソフトウェア(Datadog)を管理するアカウント
- アカウントB: ソフトウェアがインストールされるインスタンスを保有するアカウント
- 利用するAWSサービス
- S3(アカウントA)
- Systems Manager Distributor(アカウントA)
- EC2 インスタンス(アカウントB)
- Systems Manager Run Command(アカウントB)
- Systems Manager State Manager(アカウントB)
- EC2 インスタンスの種類
OS AMI-ID AmazonLinux 1 ami-00a5245b4816c38e6 AmazonLinux 2 ami-0f9ae750e8274075b WindowsServer 2019 ami-0a39119ef6930f843 CentOS 7 ami-045f38c93733dd48d
ソフトウェアをパッケージ化する(アカウントA)
ソフトウェアのダウンロード
各OSに対応する対象ソフトウェア(Datadog agent)をDatadogサイトからダウンロードします。
OS | ddagent |
---|---|
AmazonLinux 1 | datadog-agent-6.11.1-1.x86_64.rpm |
AmazonLinux 2 | datadog-agent-6.11.1-1.x86_64.rpm |
WindowsServer 2019 | datadog-agent-6-latest.amd64.msi |
CentOS 7 | datadog-agent-6.11.1-1.x86_64.rpm |
インストール用ファイル(install.sh / install.ps1)作成
- Datadog アカウントからAPIKEYを取得
Datadog管理サイトへログイン
>>> Integrations
>>> APIs
>>> API KEYS
から取得(メモする)
- AmazonLinux 1
< APIKEY >
を先に取得したAPIKEYに置き換えます。
#!/bin/bash sudo yum install -y datadog-agent-6.11.1-1.x86_64.rpm sed 's/^[:space:]*api_key:.*/api_key: <APIKEY>/' /etc/datadog-agent/datadog.yaml.example > /etc/datadog-agent/datadog.yaml sudo initctl start datadog-agent
- AmazonLinux 2,CentOS
< APIKEY >
を先に取得したAPIKEYに置き換えます。
#!/bin/bash sudo yum install datadog-agent-6.11.1-1.x86_64.rpm --assumeyes sed 's/^[:space:]*api_key:.*/api_key: <APIKEY>/' /etc/datadog-agent/datadog.yaml.example > /etc/datadog-agent/datadog.yaml sudo systemctl start datadog-agent
- WindowsServer 2019
< APIKEY >
を先に取得したAPIKEYに置き換えます。
msiexec /qn /i datadog-agent-6-latest.amd64.msi APIKEY="<APIKEY>" TAGS="Windows"
アンインストール用ファイル(uninstall.sh / uninstall.ps1)作成
- AmazonLinux 1, AmazonLinux 2, CentOS
#!/bin/bash sudo yum remove -y datadog-agent
- WindowsServer 2019
(Get-WmiObject -Class Win32_Product -Filter "Name='Datadog Agent'").Uninstall()
zip化
各OSごとに、install.sh uninstall.sh インストーラー をzipで、1つのファイルにまとめます。
※ install.sh
install.ps1
のファイル名は固定のようなので、各OS単位でリネームするなどしてzip化してください
例: AmazonAlinux1
$ zip datadog-al1_6-11.zip install.sh uninstall.sh datadog-agent-6.11.1-1.x86_64.rpm
sha256 ハッシュ値チェックサム取得
パッケージを登録する際に作成するマニフェストファイルで利用するため、zipファイル単位で、チェックサムを取得します。
$ sha256sum datadog-al1_6-11.zip 2b93f3c4cb5b4d348fa966dc1ff74f401e28bda21fecbecaca5465f83671da72 datadog-agent-6-11.zip
マニフェストファイル(manifest.json)の作成
Distributor では、各OSバージョンとファイルの関係をJSON形式で定義する必要があります。
方法として、以下の2通りがあります。
- 「パッケージから抽出」 : manifest.json(ファイル名固定)として作成しS3へアップロードする
- 「新しいマニフェスト」 : パッケージ登録時にコンソール上で作成する
個人的には、管理の良さから「パッケージから抽出」をお勧めします。
今回はこのようなファイルを作成しました。
記述方法の詳細な説明は、公式ドキュメントをご確認ください。
{ "schemaVersion": "2.0", "version": "6.11.0", "packages": { "windows": { "_any": { "x86_64": { "file": "datadog-windows_6-11.zip" } } }, "centos": { "_any": { "x86_64": { "file": "datadog-al2_6-11.zip" } } }, "amazon": { "2018.03": { "_any": { "file": "datadog-al1_6-11.zip" } }, "_any": { "x86_64": { "file": "datadog-al2_6-11.zip" } } } }, "files": { "datadog-windows_6-11.zip": { "checksums": { "sha256": "acd591e0940327bb7bedbff3f79fbaa14b154f0962b489530670ce795f8dbd13" } }, "datadog-al1_6-11.zip": { "checksums": { "sha256": "430275340498a172fc9cf282eb565b7fe39c3ed87a9bef37ca1c24b6add5f1ed" } }, "datadog-al2_6-11.zip": { "checksums": { "sha256": "5b20c4aed9347ad1aeb3d1b957c038f70ef009555fe676e88b1d3bd5787b781d" } } } }
パッケージ登録(アカウントA)
S3へアップロード
- アカウントAに、バケットを作成します。
今回は、sonobe-blog-ssm-distributor で作成します。 -
上記で作成した、 zipファイル3つ と マニフェストファイル をアップロードします。
Systems Manager Distributorへ登録
AWS Systems Manager
>>> ディストリビューター
>>> パッケージの作成
を選択します。
- 名前: パッケージ名を入力( datadog-agent)
- バージョン: マニフェストで記載した version を入力( 6.11.0 )
- パッケージの場所: S3のパスを入力( https://s3.amazonaws.com/sonobe-blog-ssm-distributor/ )
- マニフェストの場所: いずれかを選択( 「パッケージから抽出」 )
マニフェストファイルの表示
を選択するとアップロードしているマニフェストが表示されます。
パッケージの作成
を選択します。
以下の画像は、自己所有 条件で絞り込んでいます。
アカウントBへの共有
作成したパッケージを選択します。
アクセス権限
>>> 編集
を選択します。
共有アカウントID
を選択 >>> (アカウントBの)アカウントIDを入力 >>> 追加
>>> 保存
を選択します。
アカウントB >>> AWS Systems Manager
>>> ディストリビューター
を選択します。
以下の画像は、アカウント所有:All 条件で絞り込んでいます。
インストール実行(アカウントB)
アカウントB側で、共有されたソフトウェアをインストールしていきます。
※ 対象インスタンスが、Systems Manager マネージドインスタンスとなっていることが前提となります。
(CentOSはデフォルトではインストールされていません)
手動実行
AWS Systems Manager
>>> ディストリビューター
>>> 共有されたパッケージ(datadog-agent)
を選択 >>> 1回限りインストールする
を選択します。
Run Command の画面に遷移しますので、必要なパラメータを入力し、実行します。
コマンド結果を確認します。
datadog 側にも正常に登録されています。
(何度か繰り返しているので不要なインスタンスがありますが、ミュートでないものが先ほどインストールしたインスタンスとなります。)
自動(スケジュール)実行
AWS Systems Manager
>>> ディストリビューター
>>> 共有されたパッケージ(datadog-agent)
を選択 >>> スケジュールに基づいてインストールする
を選択します。
State Manager の画面に遷移しますので、必要なパラメータを入力し、実行します。
結果を確認します。
datadog 側にも正常に登録されています。
(何度か繰り返しているので不要なインスタンスがありますが、ミュートでないものが先ほどインストールしたインスタンスとなります。)
さいごに
今回、ブログのために検証を行なっている際に、つまずいた点を最後にあげさせていただきます。
- SSM エージェント バージョン 問題
こちらにも記載がありますが本機能を利用するには、エージェント バージョンが 2.3.274.0 以降 で必要があります。
- リージョン 問題
SSM がリージョン単位のサービスのため、アカウントAがバージニアリージョン、アカウントBが東京リージョンでは共有することが出来ません。