AWS
ECS
hako
DockerDay 9

hako で Parameter Store を用いて環境変数を設定する

More than 1 year has passed since last update.

ECS 環境への docker image の deploy には個人的には hako を用いることが多いのですが、docker container に設定する環境変数について設定ファイルの yaml にべた書きではなく、何かしらのシステムで管理されている値をしようしたいなと思っています。

AWS だと SSM に Parameter Store という機能があり、これを使うことで各種変数の AWS に任せることができます。

ただし、標準の hako の機能では Parameter Store から値を取得することができないので、追加でプラグイン的な実装を書きました。


hako-parameterstore

https://github.com/moaikids/hako-parameterstore

hako の env_provider として、AWS Parameter Store から値を取得する実装を書いたプラグイン的な拡張です。

こちらを用いると、Parameter Store に設定されている値を、ECS container の環境変数として割り当てることができます。


install

$ gem install hako

$ gem install hako-parameterstore

実際は Gemfile にまとめて bundle install で入れることを推奨します。


set value using AWS Parameter Store

Parameter Store に情報を追加します。

Parameter Store には Web Console から情報を登録することも出来ますが、ここでは aws-cli 経由でコマンドラインで登録してみます。

Parameter Store には以下3種のデータ型でデータを登録できます。ここでは一応それぞれ処理内容を例示します。


  • String

  • SecureString

  • StringList


String

普通の文字列です。

$ aws ssm put-parameter --name sada.masashi --value 'masshi sada' --type Secure

$ aws ssm get-parameter --name sada.masashi
{
"Parameter": {
"Type": "String",
"Name": "sada.masashi",
"Value": "masashi sada"
}
}


SecureString

KMS で暗号化済みの文字列を保存できます。

$ aws ssm put-parameter --name sada.masashi --value 'masshi sada' --type SecureString

$ aws ssm get-parameter --name sada.masashi
{
"Parameter": {
"Type": "SecureString",
"Name": "sada.masashi",
"Value": "AQICAHh0pImsl6eTbd8xlEj3ruViUrXuAkUnpBDSqSJq+H7pTAGWLSDIh+iJACc5U+1008sJAAAAajBoBgkqhkiG9w0BBwagWzBZAgEAMFQGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMCSetmq0nwh6EU0i7AgEQgCdEyE2IywQMY3uF/SEiKgrU8y0LSdZU+Cs1KR+LOgGdSN3OM6B64iQ="
}
}

SecureString は普通に取得すると上記のように暗号化された情報が返却されます。get-parameter 時に情報を復号化したい場合は --with-decryption を指定します。

$ aws ssm get-parameter --name sada.masashi --with-decryption

{
"Parameter": {
"Type": "SecureString",
"Name": "sada.masashi",
"Value": "masashi sada"
}
}


StringList

文字列配列を保存できます。

$ aws ssm put-parameter --name sada.masashi --value ['sada','masashi'] --type StringList

$ aws ssm get-parameter --name sada.masashi
{
"Parameter": {
"Type": "StringList",
"Name": "sada.masashi",
"Value": "[sada,masashi]"
}
}


config hako

AWS Paramete Store に保存された値を hako で使う場合は、env_provider で parameterstore を指定すれば OK です。

あとは、使用したい値を保持している key 文字列を以下のように #{.......} という形で指定すれば、その値が Parameter Store から取得され、環境変数として使われます。

env:

$providers:
- type: parameterstore
SADA_MASASHI: ‘#{sada.masashi}'


deploy using hako

あとは、通常の hako の使い方と同じです。


まとめにかえて

AWS ECS を便利に使うことができる hako について、より便利に使えるように AWS Parameter Store に対応をした実装を行ってみました。

ユースケースを見ながら実装を洗練させようと思っていて今のところ実装は結構荒いですが、ご容赦ください。