KustomizeのSecret Generator + aws-envでパラメータストアからKubernetesのSecretを生成
こんにちは、かたいなかです。
最近、KubernetesのSecretをどのように運用していくのがよいのかずっと悩んでいます。
その中で、KustomizeのSecret Generatorとaws-envを組み合わせてAWSのパラメータストアからSecretを生成する方法を調査しましたのでご紹介します。
Kustomizeとは
KustomizeはkubernetesのYAMLファイルをパッケージングするツールです。ベースの構成をもとにSTG/PRDなどの環境ごとに変えたい設定などを上書きすることができます。Kustomizeで生成されたYAMLを、kubectl apply
する形で使用します。将来的にkubectlへの統合が前提に開発されているそうです。
KustomizeにはConfigMapGenerator/SecretGeneratorというConfigMapやSecretを生成するための仕組みがあり、いくつかの方法でSecretを作成できます。今回はそのうち、dotenv形式の文字列を出力するコマンドからSecretを作成する機能を使用していきます。
aws-envとは
aws-envはパラメータストアに登録されたパラメータのうち、特定のパス以下のパラメータから値を取得してくれるツールです。例えば、AWS_ENV_PATH
という環境変数に/hoge/
という値がセットされているときは、/hoge/FUGAFUGA
のような/hoge/
から始まる名前を持つパラメータの値を取得することができます。
例えば、ECS上のコンテナ起動時に、パラメータストアからDBのパスワードを取得したりするなどときに、$(aws-env)
のようにして環境変数を設定したりできます。
aws-envは環境変数にセットする用途だけでなく、dotenv形式でのパラメータの出力にも対応しています。そこで、今回の記事では、dotenv形式の文字列を出力するコマンドからSecretを生成できるKustomizeのSecret Generatorと組み合わせて使用していきます。
初期状態
Kustomizeおよびaws-envがインストールされた状態を仮定します。
また、以下のようなパラメータがパラメータストアにに暗号化された文字列が登録された状態から始めていきます。
1 2 3 | "/stg/credentialA" "/stg/credentialB" "/prd/credentialC" |
/stg/
から始まる名前を持つパラメータと/prd/
から始まる名前を持つパラメータが登録された状態です。
kustomization.yaml
Secret GeneratorのenvCommand
を使用するとdotenv形式の文字列を出力するコマンドからSecretが作成できます。また、aws-envは--format=dotenv
オプションによりdotenv形式でパラメータが出力できます。
2つを組み合わせてkustomization.yaml
に以下のように記述します。
1 2 3 4 | secretGenerator: - name : from-aws-env envCommand: AWS_ENV_PATH=/stg/ AWS_REGION=<パラメータを登録したリージョン> aws-env --format=dotenv type: Opaque |
aws-envが使用するAWS_ENV_PATH
やAWS_REGION
といった変数の設定も行っています。今回は/stg/
から始まる環境変数のみ含んだSecretを作成したいので、AWS_ENV_PATH
には/stg/
という値を設定しています。
Secretを生成してみる
ここまでの設定で実際にkustomize build
を実行してみると
1 2 3 4 5 6 7 8 9 10 | $ kustomize build apiVersion: v1 data: credentialA: ImNyZWRlbnRpYWxBIg== credentialB: ImNyZWRlbnRpYWxCIg== kind: Secret metadata: creationTimestamp: null name: from-aws- env -879mkbh49f type : Opaque |
上のようにAWS_ENV_PATH
という環境変数で指定したパスのパラメータのみ含まれたSecretを作成するためのYamlが出力されました。
余談ですが、Secretの名前にハッシュ値のサフィックスがついていることも確認できますね。
まとめ
今回はSecretの管理方法の一例として、パラメータストアのパラメータをもとにKustomizeのSecretGeneratorを使用してSecretを生成する方法をご紹介しました。KustomizeのConfigMap/Secret Generatorはdotenv形式の文字列を出すコマンドであれば何でも使えるので今回紹介した組み合わせ方以外でも便利に使えるケースがありそうです。
参考資料
補足:CI環境で実行するときに必要な権限
aws-env
をCodeBuildなどのCI環境から実行するときには、以下のJsonのような、パラメータを読み取る権限と暗号化されたパラメータを復号する権限が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | { "Version" : "2012-10-17" , "Statement" : [ { "Effect" : "Allow" , "Action" : [ "ssm:DescribeParameters" , "ssm:GetParametersByPath" ], "Resource" : "*" }, { "Sid" : "" , "Effect" : "Allow" , "Action" : [ "kms:Decrypt" ], "Resource" : [ "arn:aws:kms:<region>:<account_id>:key/*" ] } ] } |