SSM parameter not available
SSMパラメータストアをリソース間で参照したときのエラー
初回デプロイ時はSSMパラメータストアがないためエラーになる(SSMパラメータストアをデプロイ済みだったり手動で作成済みの場合はエラーにならない)
依存関係のセットが必要
export class VpcStack extends cdk.Stack {
...
});
new ssm.StringParameter(this, 'VPCID', {
parameterName: '/cdk/vpcid',
stringValue: vpc.vpcId,
});
const ec2instance = new ec2.Instance(this, 'Instance', {
...
});
ec2instance.node.addDependency(vpc); //ここ
failed to deploy: UPDATE_ROLLBACK_COMPLETE: /cdk/vpcid already exists in stack
パラメータストア参照でのリソース渡しの検証中に発生。
パラメータストアで外出しする対象はVPCIDで、その元にしてるVPCコンストラクトを生成するときの名前(VPCID->VpcId)を変えたときに起きた。
余計なCloud Formationスタックはないし、にっちもさっちもいかないので、手動で対象のパラメータを削除。
してもエラー変わらなかった
なるほど、エラーのとおり、実際に存在しているかどうかじゃなくて、CFnのスタックに存在してるのか
対処めんどい
まず、変更点を戻して(VpcId->VPCID)動く状態にした上で、別のパラメータをデプロイする。これはまだどこからも参照させない。
new ssm.StringParameter(this, 'VpcId2', {
parameterName: '/cdk/vpcid2',
stringValue: vpc.vpcId,
});
デプロイはno changesで正常終了
次にセキュリティグループとEC2から参照するためのコンストラクトを、追加した/cdk/vpcid2に向ける(一旦避ける)
const ssmvpc = ec2.Vpc.fromLookup(this, 'SsmVpc', {
vpcId: ssm.StringParameter.valueFromLookup(this, '/cdk/vpcid2'),
});
これもno changesで正常終了
次に参照されなくなった/cdk/vpcidの名前をお望み通りVPCIDからVpcIdに変更してデプロイする。
うーこれでもだめなのか。
failed to deploy: UPDATE_ROLLBACK_COMPLETE: /cdk/vpcid already exists in stack
該当のパラメータは実際にはない(手動で消しちゃったので)。CFnのスタックから消したい。
名前を変更ではなく、一旦コードからコメントアウトしてみる
// new ssm.StringParameter(this, 'VpcId', {
// parameterName: '/cdk/vpcid',
// stringValue: vpc.vpcId,
// });
よし消えた
この状態で、コメントしたコードを希望のVpcIdで復活させる
希望の名前で論理IDできた
パラメータストアにパラメータもできた。
参照をVpcId2からVpcIdに切り替える
ついでにVpcId2をコメントアウト
いっぺんにいけるかな??
// new ssm.StringParameter(this, 'VpcId2', {
// parameterName: '/cdk/vpcid2',
// stringValue: vpc.vpcId,
// });
const ssmvpc = ec2.Vpc.fromLookup(this, 'SsmVpc', {
vpcId: ssm.StringParameter.valueFromLookup(this, '/cdk/vpcid'),
});
おーデプロイできた。
CFnで論理ID: VpcId2消えて、パラメータも消えて、既存リソースがVPCIDからVpcId向くようになった。
切り替えには工夫と何回かのデプロイが必要なものの、今回何かリソースの削除が必要だったわけではないので、ダウンタイムなしでいけるのか。
一応パラメータストア渡しの恩恵は感じられた感。
勉強になった。