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が東京リージョンでは共有することが出来ません。