Amazon Web Services ブログ
階層とタグによるパラメータの組織化及びAmazon EC2 Systems Manager パラメータ ストアのAmazon CloudWatchイベント
このポストはアマゾンウェブサービスのソフトウェア デベロッパーエンジニアであるLusha Zhang によって書かれました。
Amazon EC2 Sysmtes Mangager の一部であるパラメータストアは、平文データ(データベース文字列)または秘密情報データ(パスワード、APIキーなど)を問わず、設定データを管理するための集中化された暗号化ストアを提供します。パラメータストアはAWS CLI、API、およびSDKを介して利用できるため、AWSラムダやAmazon ECSなどのAWSサービス間でパラメータを簡単に参照できます。
パラメータストアのその他の記事については、以下を参照してください:
- Managing Secrets for Amazon ECS Applications Using Parameter Store and IAM Roles for Tasks
- Use Parameter Store to Securely Access Secrets and Config Data in AWS CodeDeploy
パラメータストアは最近、階層化サポートとパラメータのタグ付け、及びCloudWatchイベント サポートをローンチしました。これらの機能によって大規模にパラメータを組織化し、管理することが可能になりました。このポストでは、これらの新しい機能を使ってセキュリティ機能を拡張し改善する方法を示します。
階層化パラメータ
パラメータストアの階層化サポートによって、組織構造に基づいたパラータの構造化が可能となります。これはパラメータの編成、クエリ、および権限管理のための強力なツールを提供します。
一般的なDevOpsのシナリオでは、開発、ベータ、本番の異なる環境に対してソフトウェアの展開を自動化します。例えば、デプロイメント設定を作成する時に、設定を保存するためにパラメータストアを利用できます。おそらく各デプロイメント環境に最低限の健全なホスト数やパーセンテージを設定しなければならず、それらを環境ごとに異なる値でパラメータストアに保存したいと思うでしょう。
Step1. デプロイメント設定のパスを作成する
次のコマンドを使用して、保存するパスとパラメータを作成します:
aws ssm put-parameter --name /DeploymentConfig/Prod/FleetHealth --value 75 --type String
aws ssm put-parameter --name /DeploymentConfig/Beta/FleetHealth --value 20 --type String
秘密情報を専用のパスの下に構造化することもできます。例えば、
aws ssm put-parameter –-name /DeploymentConfig/Prod/Password/SQLPassword –-value <password> --type SecureString
AWS マネジメント コンソールまたはAWS CLから取得したパスごとにパラメータをフィルタすることも可能です。
aws ssm describe-parameters --parameter-filters Key=Path,Option=Recursive,Values=/DeploymentConfig/Prod
SecureString型パラメータの利用方法の詳細については、「Ssytem Manager パラメータについて」を参照してください。
Step 2. パラメータを使用してデプロイメント設定を管理する
AWS CloudFormationテンプレートを使用してデプロイメント設定を作成した場合は、次の例のように本番ステージに対するFleetHealthを設定することが可能です。
#!/bin/bash
fleetHealth=$(aws ssm get-parameter --name /DeploymentConfig/Prod/FleetHealth --query Parameter.Value)
aws cloudformation create-stack --stack-name <stack_name> --template-url <templateurl> --parameters ParameterKey=FleetHealth,ParameterValue=$fleetHealth
再帰フラグをを使用して、本番またはベータ環境のすべての設定パラメータを取り出すことが可能です。そして選択したパラメータを取得するために返された設定階層をパースできます。
aws ssm get-parameters-by-path --path /DeploymentConfig/Prod –-recursive
階層へのアクセスを制御する
本番およびベータ環境のデプロイメント設定のためのパラメータ階層を作成したので、パラメータへのアクセスを制限したいかもしれません。おそらく開発チームは本番環境のパラメータへはアクセスせず、ベータ環境のパラメータのみにアクセスできる必要があります。
IAMを使用して、ベータ環境のパラメータ階層へのアクセスを制御します。例えば、次のIAMポリシーはユーザーに本番環境パラメータへのアクセスを制限します。
{
"Effect": "Deny",
"Action": [
"ssm:GetParametersByPath"
],
"Condition": {
"StringEquals": {
"ssm:Recursive": [
"true"
]
}
},
"Resource":“arn:aws:ssm:<region>:<account_id>:parameter/DeploymentConfig/Prod*"
}
ユーザーが次のコマンドを実行すると、AccessDeniedException を受け取ることになります。
aws ssm get-parameters-by-path --path /DeploymentConfig/Prod —-recursive
タグ付けされたパラメータ
タグを使用するとAWSリソースを容易に管理できます。パラメータをタグ付けして、グループ化したり、クエリを行うこともできます。同じデプロイメント設定の例を使用して、タグのキー値が「Password」でタグ値が「Beta」または「Prod」のタグを追加することができます。
aws ssm add-tags-to-resource --resource-type Parameter --resource-id /DeploymentConfig/Beta/FleetHealth --tags Key=Password,Value=Beta
合体されたフィルタ結果を得るために、複数のフィルターを適用することもできます。例えば、Password タグキーと再起フラグつきの /DeploymentConfig/Beta パスを適用して、パスワードに関連したベータ環境のパラメータを取得することができます。
aws ssm describe-parameters --parameter-filters Key=tag:Password Key=Path,Option=Recursive,Values=/DeploymentConfig/Beta
IAMポリシーを使用してセキュリティ アクセスを管理できます。詳細については、「System Manager パラメータのアクセス制御」を参照してください。
CloudWatch イベント ルールからの変更通知の取得
パラメータ ストアがCloudWatch イベントのソースになりました。パラメータが作成、更新、削除される度にLambda 関数やSNSトピックのようなCloudWatchイベント ターゲットをトリガーするようにCludWatchルールをセットアップすることができます。
次の例は、CloudWatchルールを設定して、パラメータ更新のSNSトピックをトリガする方法を示しています。詳細については、「ステップ2:SNSトピックの作成」を参照してください。パラメータの更新に関する電子メール通知をトリガーするようにSNSトピックを設定したら、ターゲットのSNSトピックに関連付けるCloudWatchルールを作成します。 イベントパターンの値を編集して、通知を発生する特定のパラメータを指定することができます。
{
"source": [
"aws.ssm"
],
"detail-type": [
"Parameter Store Change"
],
"detail": {
"name": [
"/DeploymentConfig/Prod/FleetHealth",
"/DeploymentConfig/Beta/FleetHealth"
],
"operation": [
"Update",
"Delete"
]
}
}
/DeploymentConfig/Beta/FleetHealthパラメータの値を変更すると、CloudWatchイベントがメトリックに表示されます。
その間に作成したSNSトピックがトリガーされ、emailも受信できます。
結論
この記事では、パラメータを管理するためのいくつかの新しいパラメータ ストアの機能:階層化、タグ付け、CloudWatch 通知について示しました。階層化パラメータを使用するとプレインテキストと秘密情報の両方について設定データの構造化とアクセス管理が容易になります。タグ付けサポートはパラメータのグループ化とクエリを容易にする別の方法を提供します。CloudWatchイベントによって、パラメータの更新の通知をタイムリーに受け取ることができます。
筆者について
Lusha ZhangはAmazon EC2 System Managerチームのソフトウェア開発エンジニアです。彼女はAmazon Textbook RentalsからAWS Parameter Storeまで、Amazonでさまざまな製品に取り組んできました。仕事以外では、太平洋北西部でのサーフィンだけでなく、バイオリンやピアノの演奏も楽しんでいます。
(翻訳はSA福井が担当しました。原文はこちらです。)