Amazon Web Services ブログ

パラメータラベルを活用した環境をまたいだパラメータ更新

AWS Systems Manager の機能の1つであるパラメータストアはテキストデータ (例えば URL) や機密データ (例えばパスワードや API キー) などの設定データの暗号化、保存、一元管理を提供します。

パラメータストアへは AWS CLI、API、SDK でアクセスできます。これにより AWS Lambda や Amazon Elastic Container Service(ECS) のような AWS サービスからパラメータを簡単に参照することができます。設定パラメータのセットに名前をつけることで複数のパラメータバージョンを管理するためにパラメータストアラベルを利用することができます。ラベルはパラメータの値を更新するときに意図していない上書きを防ぐことに役立ちます。設定の更新をしたときに何か問題が発生しても、ラベルを使って以前のバージョンに簡単にロールバックすることができます。このブログポストではパラメータバージョンのエイリアスとしてどのようにパラメータラベルを使うか紹介します。ラベルを使うことで階層をまたいでパラメータバージョンをグルーピングできます。また、階層とラベルを使うことで環境をまたいでパラメータを更新することができます。

パラメータのグルーピングの違い – 階層、タグ、ラベル

パラメータ階層 :パラメータストアを使用すると、環境 (例えば、dev/test/prod) やアプリケーション (例えば、/Config/Prod/Fleet/MinHealthyHosts, /Config/Beta/Fleet/MinHealthyHosts) などの一般的なグループを表すために、パラメータを階層的に作ることができます。それぞれのパラメータはパージョンで管理されており、またパラメータごとにアクセス管理をすることができます。パラメータ階層の詳細な情報はこちらのブログをご確認ください。

タグ : 他の AWS リソースと同様にタグパラメータを利用することができ、タグによるパラメータのアクセス制御を設定することができます。

ラベル : ラベルを使うことで1つのパラメータにおいて様々な環境や構成の値を管理することができます。例えば、ベータ環境と本番環境で異なった API キーを利用する場合は、API キーのパラメータを 1 つ作成して、ベータ用と本番用の異なるパラメータバージョンにラベルをつけるだけです。ラベルはパラメータバージョンの履歴を作成でき、またどのパラメータにどのユーザがラベルをアタッチできるかをコントロールすることもできます。

パラメータラベル

パラメータが更新されると、新しいバージョンが作成され、またユニークなバージョン番号が割り振られます。パラメータバージョンを特定するために人が読み取れるような任意のエイリアスとしてラベルをアタッチすることができ、ラベルを使って過去のバージョンの値を取得することができます。ラベルはユニークである必要があり、1 つのパラメータバージョンにしか関連づけることができません。同じラベルを 2 つ以上のパラメータバージョンにアタッチすることができないということです。ラベルがアタッチされると、そのラベルは削除することができず、同じパラメータのバージョン間で付け替えることしかできません。なお各パラメータバージョンにおいて 10 個までラベルをアタッチすることができます。

次の例では、パラメータ P1 に 5 つのバージョンがあります。パラメータの過去のバージョンにラベルをアタッチすることができ、次のような構文で指定することで特定のラベルがアタッチされたパラメータの値を取得することができます。

<parameter-name>:<label>

設定更新のためにパラメータラベルを活用する

例えば、 API キーやデータベースの接続文字列のようなアプリケーションの設定パラメータのセットをベータおよび本番環境にわたって管理しているシナリオを考えます。これらのパラメータは頻繁に更新され、アプリケーションからは特定のバージョンのパラメータを利用したいとします。本番環境において、あなたはデータベースの接続文字列はバージョン 4 を、API キーはバージョン 6 を必要としました。ベータ環境においては、あなたはデータベースの接続文字列はバージョン 1 を、API キーはバージョン 3 を必要としました。ラベルを使うことで、階層をまたいだパラメータバージョンのセットのスナップショットを作成することができます。

 

Step 1: パラメータの作成

AWS CLI か AWS マネジメントコンソールでパラメータを作成します。例えば API キーパラメータを作成する CLI コマンドは次のようになります。
aws ssm put-parameter --name "/Config/Prod/XYZService/APIKey" --type SecureString --value "MyAPIKey"

パラメータを更新するためには overwrite オプションを使います。

aws ssm put-parameter --name "/Config/Prod/XYZService/APIKey" --type SecureString --value "MyNewAPIKey" --overwrite

パラメータを何度か更新することで、本番環境用のデータベースの接続文字列のバージョン 4 と API キーのバージョン 6、およびベータ環境用のデータベースの接続文字列のバージョン 2、API キーのバージョン 3 を用意することができたかと思います。

Step 2: パラメータラベルのアタッチ

適切なパラメータバージョンに “Current” ラベルをつけます。API キーパラメータは最新バージョンを必要とするため、パラメータバージョンを指定する必要はありません。

aws ssm label-parameter-version --name /Config/Prod/DB/ConnectionString --labels Current --parameter-version 4
aws ssm label-parameter-version --name /Config/Prod/XYZService/APIKey --labels Current

コンソールを使ってもパラメータバージョンに “Current” ラベルをつけることができます。AWS のシステムマネージャのコンソール画面で、パラメータストアを開き、パラメータヒストリービューでバージョンを選び、ラベルをアタッチします。

同様に “Current” ラベルをベータ環境のパラメータの適切なパラメータバージョンにアタッチします。

Step 3: Current ラベルを使ってアプリケーションの設定パラメータを検索する

“/Config/” パス配下かつ “Current” ラベルがアタッチされた全てのパラメータを読みだすためには GetParametersByPath コマンドを使います。下記のコマンドでラベルフィルターを使用しなかった場合は、API はパラメータの最新の値を返します。

aws ssm get-parameters-by-path --path /Config --recursive --with-decryption --parameter-filters Key=Label,Values=Current,Option=Equals

ラベルとともにパラメータを指定して、GetParameters コマンドを使うこともできます。

aws ssm get-parameters --names /Config/Prod/XYZService/APIKey:Current /Config/Prod/DB/ConnectionString:Current --with-decryption

Step 4: パラメータの更新

アプリケーションが 、ステップ 3 で説明した “Current” ラベルを用いてGet API アクションを使用してパラメータを取得するようになったため、パラメータに更新が発生してもただちに影響はしません。 したがって、想定外のパラメータの上書きがあってもアプリケーションには影響しません。

aws ssm put-parameter --name "/Config/Prod/XYZService/APIKey" --type SecureString --value "MyLatestAPIKey" --overwrite

Step 5: 更新したパラメータに “Current” ラベルをつけかえる

パラメータがアプリケーションによって取得可能となった後、パラメータ管理者は “Current” ラベルを別のバージョンに付け替えることができます。そして、前の値には “Fallback” ラベルをアタッチします。

aws ssm label-parameter-version --name /Config/Prod/XYZService/APIKey --labels Current
aws ssm label-parameter-version --name /Config/Prod/XYZService/APIKey --labels Fallback --parameter-version 6

アプリケーションが設定値を確認するためにパラメータストアをポーリングする場合は、”Current” ラベルが移動された後は、更新された値が取得されます。特定のバージョンのパラメータを参照するためにコードを修正する必要はありません。

アプリケーションのサンプルコード


apiKey = get-parameters(/Config/<env>/XYZService/APIKey:Current)
Validate the API key value retrieved
If any failures
Get the fallback value and use the previous valid configuration
apiKey = get-parameters(/Config/<env>/XYZService/APIKey:Fallback)

Step6 : 各パラメータのバージョンにアタッチされているラベルを表示する

パラメータの全バージョンのパラメータとアタッチされたラベルを検索するために、コンソールでパラメータヒストリビューを開きます。

また、CLI を使ってパラメータの全バージョンのパラメータと付与されたラベルを検索することができます。

aws ssm get-parameter-history --name /Config/Prod/XYZService/APIKey

ラベル付与によるアクセス管理

ラベルプロモーションとは、アプリケーションで使用するパラメータがどのバージョンのものなのかを制御することです。ラベルプロモーションの操作を制限するには、ラベル付与に使われるLabelParameterVersion API の実行を拒否します。例えば次の IAM ポリシーは本番環境のパラメータに対する LabelParameterVersion API の実行を制限します。これによってベータ環境など他の環境へのパラメータのみにラベルを付与することができるようになります。

{
"Effect": "Deny",
"Action": "ssm:LabelParameterVersion",
"Resource": "arn:aws:ssm:<region>:<accountid>:parameter/Config/Prod*"
}

ラベル更新時の通知とイベントの設定

ラベルがアタッチされた時や別のバージョンに付け替えられた時に通知をするために、Amazon CloudWatch や Amazon Simple Notification Service (Amazon SNS) を使うことができます。この例では、ラベルやパラメータ更新時のメール通知をどのように設定するかを紹介しています。

イベントパターンでは、どのパラメータの更新がイベントをトリガーするかを表しており、修正することができます。次の例では、本番環境のデータベースの接続文字列かAPIキーのパラメータに更新があった時に通知の送付とイベントのトリガーをします。

{
  "source": [
    "aws.ssm"
  ],
  "detail-type": [
    "Parameter Store Change"
  ],
  "detail": {
    "name": [
      "/Config/Prod/DB/ConnectionString",
      "/Config/Prod/XYZService/APIKey"
    ],
    "operation": [
      "Update",
      "Delete",
      "LabelParameterVersion"
    ]
  }
}

まとめ

このブログポストではパラメータストアのラベル機能を紹介しました。ラベル機能はパラメータのバージョン管理の上に提供され、シンプルなパラメータのバージョン管理を可能とします。ラベルはユーザが定義可能なパラメータバージョンのエイリアスであり、階層をまたいでパラメータバージョンをグループ化することができます。ラベルはパラメータ更新における保護レイヤーを提供し、以前のバージョンのパラメータへの迅速なフェールバックを可能とします。また、IAM ポリシーを使うことでラベルによるコントロールを制御することができます。加えて、ラベルが更新された時や別のバージョンに付け替えられた時に CloudWatch を使って通知することができます。

原文は こちら。翻訳は SA 三上が担当しました