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](https://github.com/aws/aws-cdk/issues/3130)がヒットした。
日本語の記事がなかったので備忘がてら記事に残す。

## サンプルソース

https://github.com/mono0423/aws-cdk-ssm-sample

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/b7dc3ff2-40b7-b431-4fe6-5cdb0346035d.png)

```typescript:/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);
  }
}
```

```typescript:/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`を叩くと以下のエラーが発生する

```bash
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

```typescript:/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>',
  }
});
```

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

```bash
$ tcs
$ cdk diff
$ cdk deploy
```

```bash:結果
$ 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90087/c1e01f8b-f28b-040d-2c45-bdbbd798620e.png)

お、できてるｂ