KustomizeのSecret Generator + aws-envでパラメータストアからKubernetesのSecretを生成

PR満足度98%

こんにちは、かたいなかです。

最近、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と組み合わせて使用していきます。

PRブログ書いてる人に頼みたい

初期状態

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_PATHAWS_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/*"
            ]
        }
    ]
}

PRいまのAWSパートナー、請求代行だけなんだよな