最近AWS CDKでハマったもの集(2025年11月)

はじめに

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パラメータストアなどから取得した値のキャッシュです。

docs.aws.amazon.com

なお、上記のドキュメントに記されていますが、ソース管理にコミットすることが推奨されています。ただ、アカウント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に詳しく書かれていました。

github.com