LoginSignup
7
2

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

Last updated at Posted at 2019-10-14

概要

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

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

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

サンプルソース

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

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

image.png

/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***********************

image.png

お、できてるb

7
2
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
7
2