こんにちは
Emotion Techの子安です。
最近使っているもの: Docker / Rails / Python / Digdag
今日のお話
AWS System Manager パラメータストアは、シンプルながらコンテナでもファンクションでも活用できるサービスです。そんなパラメータストアの概要と、手間味噌ですが少し便利に使うためのライブラリについてお話しします。
ある日の○○支部の懇親会
私: 「環境変数をタスク定義ごとに展開するのが面倒くさいですよねー」
中の人: 「パラメータストア使ったらどうですか」
私: 「ふむふむ! (意訳: 何だっけそれ??)」
パラメータストアとは
一言で言えば、設定値を保管してくれる場所。
詳細はこちらに → AWS Systems Manager パラメータストアとは
パラメータの階層化
システム構成に合わせて階層化可能。
イメージ:
/FooSystem
`-- /Production
`-- /AppRole
`-- /DB_HOST='dbhost.prod.xxxx'
`-- /DB_USER='dbuser'
(...)
`-- /Development
`-- /AppRole
`-- /DB_HOST='dbhost.dev.xxxx'
`-- /DB_USER='dbuser'
(...)
階層化されたパラメータの利用
aws ssm get-parameters-by-path --path /FooSystem/Production/AppRole
{
"Parameters": [
{
"Name": "/FooSystem/Production/AppRole/DB_HOST",
"Type": "String",
"Value": "dbhost.prod.xxxx",
"Version": 1
},
{
"Name": "/FooSystem/Production/AppRole/DB_USER",
"Type": "String",
"Value": "dbuser",
"Version": 1
},
{ "...": "..." }
]
}
ここまでのまとめ
パラメータストアを使うと、
各コンポーネントが自身の役割を特定できる情報を知っていれば、その他の設定情報をコンポーネント自身で取得できる。
先ほどの例だと、 $SYSTEM_NAME
, $ENV_NAME
, $ROLE_NAME
といった情報を与えておけば、パラメータストアから具体的なDB接続情報を取得することができる。
Pythonライブラリ aws-paramstore-py
pipでインストールできるライブラリを作った。
詳細はこちらに → aws-paramstore-py
実現したいことは何か
awscliやSDKの戻り値には、いろんな情報が含まれている。(特にパラメータ名も階層のトップからフルパスで入っている)
実際的なユースケースとしては、 コンポーネントが利用するパラメータを、環境やらロールやらを意識しなくても取得できる と嬉しい。
$SYSTEM_NAME --\
-------------- /--> $DB_HOST
$ENV_NAME ------->| パラメータストア |--
-------------- \--> $DB_USER
$ROLE_NAME ----/
aws-paramstore-pyの使い方
インストール:
pip install aws-paramstore-py
import aws_paramstore_py as paramstore
params = paramstore.get('FooSystem', 'Production', 'AppRole')
# { 'DB_HOST': 'dbhost.prod.xxxx',
# 'DB_USER': 'dbuser' }
Bashでも
eval "$(aws-pspy 'FooSystem' 'Production' 'AppRole' --bash-export)"
# export DB_HOST='dbhost.prod.xxxx'
# export DB_USER='dbuser'
まとめ
AWS System Manager パラメータストアを利用すると、(コンテナ・ファンクション問わず) 各コンポーネントが、自分自身の設定値を能動的に取得できる ようになる。
aws-paramstore-py も是非お試しを。フィードバック歓迎!!