はじめに
AWS CDKを色々と書いて試しているのですが、最近試した中でちょっとハマったものをいくつか記してみます。
ValidationError: All arguments to Vpc.fromLookup() must be concrete (no Tokens)への対応
AWS CDKにて既存VPCを参照したいことがままあります。VPC IDを取得したあとはVpc.fromLookupを使うことで参照することができます。
const vpc = Vpc.fromLookup(this, 'VPC', { vpcId: vpcId });
ここでVPC IDはSystems Manager Parameter Storeに格納しておいたとき、以下のように実装した場合はValidation Errorが吐かれます。
const vpcId = StringParameter.valueForStringParameter(this, '/myapp/vpc/id');
実際に吐かれるエラーメッセージは以下の通り。
ValidationError: All arguments to Vpc.fromLookup() must be concrete (no Tokens)
at path [Ec2AppStack] in aws-cdk-lib.Stack
(以下略)
これを避けるには、StringParameter.valueFromLookupを使います。
const vpcId = StringParameter.valueFromLookup(this, '/myapp/vpc/id');
なお、StringParameter.valueFromLookupを使うと、cdk.context.jsonファイルが作られます。これはSystems Managerパラメータストアなどから取得した値のキャッシュです。
なお、上記のドキュメントに記されていますが、ソース管理にコミットすることが推奨されています。ただ、アカウントIDなどがそのまま記されているので、コミットするには抵抗感があります。みんな気にせずにコミットしているのかしら。
ValidationError: Cannot retrieve value from context provider ssm since account/region are not specified at the stack level.への対応
cdk initを実施したままのCDKアプリを動かしたとき、ValidationError: Cannot retrieve value from context provider ssm since account/region are not specified at the stack levelというメッセージが出ることがあります。今回はパラメータストアに保存している値を取得しようとしたときにこのメッセージが出力されました。
対処方法は簡単で、bin/以下にあるTypeScriptファイル内にあるenv: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },の行のコメントをはずし、環境変数CDK_DEFAULT_ACCOUNTにはアカウントID、CDK_DEFAULT_REGIONにはリージョンを設定しておけばOKです。
経緯などは以下のIssueに詳しく書かれていました。