cdk-remote-stackでslashを含まないSSMパラメータを使おうとしてハマった
cdk-remote-stackとは
cdk-remote-stack を使うと、cdkで、あるstackから別のregionにあるSSM parameter等を参照することをラクにできる
cdk-remote-stackの基本的な使い方は以下
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import { RemoteParameters } from 'cdk-remote-stack';
export class CdkStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
const parameterPath = '/some/parameter'
const parameters = new RemoteParameters(this, 'RemoteParameters', {
path: parameterPath,
region: 'us-east-1',
});
const paramA = parameters.get(`${parameterPath}/aaa`);
const paramB = parameters.get(`${parameterPath}/bbb`);
new cdk.CfnOutput(this, 'ParameterAOutput', {
value: paramA,
});
}
}
上記の /some/parameter/aaa
といったSSM parameter storeのベストプラクティスっぽい、/
スラッシュを使って階層化されたパラメータをいい感じに扱える
cdk-remote-stackではスラッシュを含まない、階層化されていないパラメータを扱えない
一方で、/
で階層化されていないパラメータを参照しようとしたところハマった
例えば some-parameter
といった名前のパラメータ (/
を含まない)
この場合、以下のようにcdk deploy時にカスタムリソースの実行失敗としてデプロイ失敗する
Received response status [FAILED] from custom resource. Message returned: Error: An error occurred (ValidationException) when calling the GetParametersByPath operation: The parameter doesn't meet the parameter name requirements. The parameter name must begin with a forward slash "/". It can't be prefixed with \"aws\" or \"ssm\" (case-insensitive). It must use only letters, numbers, or the following symbols: . (period), - (hyphen), _ (underscore). Special characters are not allowed. All sub-paths, if specified, must use the forward slash symbol "/". Valid example: /get/parameters2-/by1./path0_.
cdk-remote-stackではパラメータの参照に get_parameters_by_path APIが使われている
これは cdk-remote-stack が別regionのパラメータを参照するために作成するカスタムリソースにおいて、SSM get_parameters_by_path API が使われていることによるもの
https://github.com/pahud/cdk-remote-stack/blob/main/custom-resource-handler/remote-parameters.py
get_parameters_by_path APIは /
で階層化されたパラメータを扱うAPIであり、/
を含まないような形のパラメータを扱おうとすると ValidationError
となる
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ssm/client/get_parameters_by_path.html
現状 cdk-remote-stack でパラメータ参照したい場合は /
で階層化されたパラメータを使う必要がある
階層化されていないパラメータも使えるようにPR出した
ただ、やんごとなき事情で /
で階層化されていないパラメータを参照したい場合もあるかなとかで
PR出した
https://github.com/pahud/cdk-remote-stack/pull/605