この記事はWanoグループ Advent Calendar 2020 7日目の記事になります。
AWS Parameter Store の用途としては、
- 秘匿情報系
- 物理情報同定系
- 物理情報同定系(自動生成)
- それ以外にもオンプレやサーバーレスや言語やツールまたいだグローバル変数置き場として
このへんがあるかなーと思います。 IaCツールやリポジトリやプログラミング言語でこの手の値の引き回しに困ってるのを見たりしたので、うちでの例を置いていきます。
Parameter Storeでなくとも グローバル変数置き場としての運用とか境界まで決めておけば、まあいろんなデプロイツール使ってみたり、projectがリポジトリ跨いだりしても、チームごとの落としどころが見えてきていいんじゃないかと思ってます。
/<サービス名/プロジェクト名>/<Prod or Stage>/<コンテキスト>/...
命名規則としてうちでやってるのは、上記のパターンみたいなのが多いです。 Projectだのenvだのがついてるのは複数AWSアカウントをあまり使いこなして無かった頃の名残りですね。 コンテキストはそのまま文字通りの意味で、DDDでいうコンテキストやマイクロサービスとしての文脈を表してることが多いです。
/<サービス名>/<Prod or Stage>/<コンテキスト>/credential/<あと自由>
terraformでガワだけ作って記述はAWSコンソール上で記述してます。
ignore_changeはterraformの一番いいところ。
自分で最終的な仕上がりをエミュレート可能なARN等です。 複数IaCツールやアプリケーションの設定にArnが必要な場合、など、terraform内のグローバル変数で依存が完結しないときに使います。 ...命名規則だけ(Keyだけ)管理可能なら最近はこのへんあんまりDRYにしなくてもいいかなと思うので、わざわざ作らないことも多いです。
/<サービス名>/<Prod or Stage>/<コンテキスト>/infrastructure/自由
AWSサービスでたまにある、AWS側が自動生成するリソースのARN/idとか、CIでビルドされたアーティファクトの一時id置き場とかです。
IaCの場合は、各リソースのStack(cloudformation系)やtfがパラメータもデプロイする責務を持ちます。
DockerImageやECSのjob definitionとかのバージョンとかも、デプロイライフサイクルが違う場合はいったんここに格納することがあります。
/<サービス名>/<Prod or Stage>/<コンテキスト>/generated/<自由>
K:V式のParameter Store依存注入は、コンテナ以外だと結構辛いことも多いので、たまーにアプリとかはIaCツール側で物理情報/秘匿情報依存解決済みのJSONを作ってぶちこんじゃったりもしています。 parameter storeにJSON string突っ込んでいいのか?っていうと、AWS公式もAMIのID等でやってるようです。
まあでもこういう風に「状態を事前に焼く系」はデプロイライフサイクル上あかんことももちろんあるので、用法容量を守って、てことで。
data "aws_caller_identity" "current" {}
locals {
aws_account_id = data.aws_caller_identity.current.account_id
existed_ps = module.data_id.existed_resources.service.postprocess
// language:JSON
ssm_parameter_json = <<EOF
{
"VK_NOTIFICATION_LAMBDA_ARN":"arn:aws:lambda:ap-northeast-1:${local.aws_account_id}:function:${module.data_id.emulated_resources.service.monitoring.simple_notify.lambda_name}",
"VK_SQS_ASSET_ACCESS_QUEUE":"${local.existed_ps.sqs_asset_access_queue}",
"VK_SQS_HANDLER_QUEUE":"${local.existed_ps.sqs_handler_queue}",
"VK_STATE_MACHINE_ARN_HOGE":"${aws_sfn_state_machine.sfn_hoge.id}",
"VK_STATE_MACHINE_ARN_MYY_MUSIC":"${aws_sfn_state_machine.sfn_my.id}",
"VK_ACTIVITY_ARN":"${aws_sfn_activity.sfn_activity.id}",
"VK_MEDIACONVERT_BLACK_MOVIE_S3_BUCKET":"${local.existed_ps.mediaconvert_black_movie_bucket}",
"VK_MEDIACONVERT_BLACK_MOVIE_S3_KEY":"${local.existed_ps.mediaconvert_black_movie_key}",
"VK_ARTIFACT_OUTPUT_S3_BUCKET":"${module.data_id.existed_resources.s3.delivery_post_process_bucket}",
"VK_BATCH_JOB_DEFINITION":"${aws_batch_job_definition.default.arn}",
"VK_BATCH_JOB_QUEUE":"${aws_batch_job_queue.postprocess.arn}"
}
EOF
ssm_parameter_appenvjson_key = module.data_id.ssm_params.infrastructure.postprocess.env_parameter_json
}
resource "aws_ssm_parameter" "params_json" {
name = local.ssm_parameter_appenvjson_key
type = "String"
value = jsonencode(jsondecode(local.ssm_parameter_json))
}