0
0

More than 1 year has passed since last update.

「AWS CDKのコマンドオプションでサービスのENV変えてーなー」と感じた方へ

Posted at

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の使用制限やサービスの使用管理などに有用かなと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0