CDKトラブルシューティング

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向くようになった。

切り替えには工夫と何回かのデプロイが必要なものの、今回何かリソースの削除が必要だったわけではないので、ダウンタイムなしでいけるのか。

一応パラメータストア渡しの恩恵は感じられた感。

勉強になった。