AWS CDKでパラメータストアに保存した値を取得しようとしたら失敗したのでエラーを解消する


概要

AWS CDKを使ってパラメータストアに保存した値を取得しようとしたらエラーが発生した。

Error: Cannot retrieve value from context provider ssm since account/region are not specified at the stack level. 

ググってみると、GitHubのIssue#3130がヒットした。
日本語の記事がなかったので備忘がてら記事に残す。

サンプルソース

問題のソースと発生したエラー

パラメータストアに保存しているバケット名を取り出し、S3バケットを作成してみる。

/lib/aws-cdk-ssm-sample-stack.ts
import cdk = require('@aws-cdk/core');
import ssm = require('@aws-cdk/aws-ssm');
import s3 = require("@aws-cdk/aws-s3");

export class AwsCdkSsmSampleStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // パラメータストアに保存しているバケット名を取り出したい
    const BUCKET_NAME = ssm.StringParameter.valueFromLookup(this, 'BUCKET_NAME');
    new s3.Bucket(this, BUCKET_NAME);
  }
}
/bin/aws-cdk-ssm-sample.ts
#!/usr/bin/env node
import 'source-map-support/register';
import cdk = require('@aws-cdk/core');
import { AwsCdkSsmSampleStack } from '../lib/aws-cdk-ssm-sample-stack';

const app = new cdk.App();
new AwsCdkSsmSampleStack(app, 'AwsCdkSsmSampleStack');

$ cdk diffを叩くと以下のエラーが発生する

Error: Cannot retrieve value from context provider ssm since account/region are not specified at the stack level.
Either configure "env" with explicit account and region when you define your stack, or use the environment variables "CDK_DEFAULT_ACCOUNT" and "CDK_DEFAULT_REGION" to inherit environment information from the CLI (not recommended for production stacks)
(以下略)

どうやらスタックは、アカウントやリージョンの情報をデフォルトでは持っていないらしい。

解決策 cdk.StackPropsのenvプロパティで設定する

公式ドキュメントを見ると、スタックの第3引数にプロパティを渡せば良さそう。
https://docs.aws.amazon.com/ja_jp/cdk/latest/guide/environments.html

/bin/aws-cdk-ssm-sample.ts
#!/usr/bin/env node
import 'source-map-support/register';
import cdk = require('@aws-cdk/core');
import { AwsCdkSsmSampleStack } from '../lib/aws-cdk-ssm-sample-stack';

const app = new cdk.App();
// 第3引数にリージョン・アカウントを渡す
new AwsCdkSsmSampleStack(app, 'AwsCdkSsmSampleStack', {
  env: {
    region: 'ap-northeast-1',
    account: '<ACCOUNT ID>',
  }
});

修正したので、以下のコマンドでデプロイしてみる。

$ tcs
$ cdk diff
$ cdk deploy
結果
$ tcs
$ cdk diff
Stack AwsCdkSsmSampleStack
Resources
[+] AWS::S3::Bucket aws-cdk-ssm-sample-bucket awscdkssmsamplebucket4******

$ cdk deploy
AwsCdkSsmSampleStack: deploying...
AwsCdkSsmSampleStack: creating CloudFormation changeset...
 0/3 | 9:53:48 PM | CREATE_IN_PROGRESS   | AWS::CloudFormation::Stack | AwsCdkSsmSampleStack User Initiated
 0/3 | 9:53:52 PM | CREATE_IN_PROGRESS   | AWS::S3::Bucket    | aws-cdk-ssm-sample-bucket (awscdkssmsamplebucket4******)
 0/3 | 9:53:52 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata
 0/3 | 9:53:53 PM | CREATE_IN_PROGRESS   | AWS::S3::Bucket    | aws-cdk-ssm-sample-bucket (awscdkssmsamplebucket4******) Resource creation Initiated
 0/3 | 9:53:53 PM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata Resource creation Initiated
 1/3 | 9:53:53 PM | CREATE_COMPLETE      | AWS::CDK::Metadata | CDKMetadata
 2/3 | 9:54:14 PM | CREATE_COMPLETE      | AWS::S3::Bucket    | aws-cdk-ssm-sample-bucket (awscdkssmsamplebucket4******)
 3/3 | 9:54:15 PM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | AwsCdkSsmSampleStack

 ✅  AwsCdkSsmSampleStack

Stack ARN:
arn:aws:cloudformation:ap-northeast-1:***********:stack/AwsCdkSsmSampleStack/d0db***********************

お、できてるb