AWS
JAWS-UG
parameter_store
aws-paramstore-py

使ってますか? パラメータストア

こんにちは

Emotion Techの子安です。

最近使っているもの: Docker / Rails / Python / Digdag

Emotion_Tech_logo_yoko.small.png


今日のお話

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 も是非お試しを。フィードバック歓迎!!


ご清聴ありがとうございました。