CDKでStackを簡単に組めるのはとても便利ですよね。
ただ、デプロイ先のアカウント(dev / test / prodなど)によって、
例えば
・APIの制限
・消費ユニットの制御
・テストデータの参照
などをしたい時、変数で簡単に制御できればいいなと思ったので、
今回復習も兼ねてデプロイオプションでサービスのenv値を変更する方法を紹介します。
編集するファイルは全部で3つです。
① app.py
② cdk.json
③ *_stack.py (自身のstackファイル)
→以下StackファイルはDynamoLambdaStackとします。
① app.py
#!/usr/bin/env python3
from aws_cdk import App
from dynamodb_lambda.dynamodb_lambda_stack import DynamodbLambdaStack
app = App()
# 以下2行追加
cdk_env = app.node.try_get_context("cdk_env")
print(f"you will deploy env_state for {cdk_env}")
DynamodbLambdaStack(app, "hoge-service",cdk_env=cdk_env)
app.synth()
cdkでデプロイする時に、このファイルでcdkのコマンドファイルを見てくれます。
ここでは、コマンドにcdk_env=
の値を見てくれます。
print(f"you will deploy env_state for {cdk_env}")
は、どのオプションでデプロイしたかをlogで出すために書いています。
② cdk.json
{
"app": "python3 app.py",
"watch" :[
"./lambda/**"
],
"context": {
"cdk_env": "dev", ← 追加
"environment": {
"dev": {
"state_name": "dev"
},
"prod": {
"state_name": "prod"
}
}
}
}
cdkデプロイをしたときの初期値をここで編集することができます。
例えば、「cdk_env="prod"のときは"prod"を値で見て欲しいけど、特に何も指定しないなら"dev"で値を見てほしい」
といったケースに有効です。
以下、例です。
$ cdk --profile sandbox1 deploy
cdk_env=dev で反映
$ cdk --profile service-prod deploy -c cdk_env=prod
cdk_env=prod で反映
③ *_stack.py
class DynamodbLambdaStack(Stack):
""" AWS HogeStack
> HogeServieの説明
"""
def __init__(self, scope: Construct, id: str, *, cdk_env, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
# 以下サービスリソース定義
# cdk_envでコマンドオプションのcdk_env値をみてくれます。
# Lambda
get_data_lambda = aws_lambda.Function(
self,
"get-data",
runtime=aws_lambda.Runtime.PYTHON_3_8,
code=aws_lambda.Code.from_asset("./lambda/step-functions/parallels/get-data"),
handler="lambda_function.lambda_handler",
log_retention=aws_logs.RetentionDays.ONE_WEEK
)
## 環境変数
get_data_lambda.add_environment("TZ", "Asia/Tokyo")
get_data_lambda.add_environment("CDK_ENV", cdk_env) ←設定
def __init__()
の**kwargs
の1個前にcdk_env
を追加すると、このStack内でcdk_envの値を参照できます。
今回の例では、Lambdaの環境変数CDK_ENV
に直接cdk_envの値を設定しています。
他にも、SSMのパラーメーター参照やStack内でifで分岐を作れば条件に応じて柔軟に変数を変えたり、あるいはテストサービスだけデプロイするなど大胆自由に設定できます。
まとめ
APIの使用制限やサービスの使用管理などに有用かなと思います。