今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、AWS CDK開発で起こった悲劇の日。

目次

はじめに

AWS CDK Advent Calendar 2021の23日の記事です。

使用していたプログラミングコードは会社で作成していたので本記事に記載してあるプログラミングコードはその再現して作成しております。

ですので、一部矛盾や間違いがございますがご了承ください。

ブラウザはGoogle chromeを使用しております。

とある日

この記事はPython3でCDK開発を行っていたときの起きた悲劇のお話です、みなさんもお気をつけください。

悲劇

RDSのインスタンスを作成するコードを記述していました。

※ちなみにこのコードに明らかな間違いがあります気づきますか?

engine = rds.DatabaseInstanceEngine.postgres(version=rds.PostgresEngineVersion.VER_12_3)
rds.DatabaseInstance(self, "InstanceWithUsername",
    engine=engine,
    vpc=vpc,
    credentials=rds.Credentials.from_generated_secret("postgres"),
    remove_policy=core.RemovalPolicy.DESTROY
)

その時は、CDKを始めたばかりということもありドキュメントとにらめっこしながら作成しておりました。

DatabaseInstance — AWS Cloud Development Kit 1.134.0 documentation

一通りコードが記述できたので実行しました。

エラーから始まる異変

※当時のエラーを再現しています。

Traceback (most recent call last):
  File "c:\Users\xxxx\Documents\vscode\python\hello.py", line 20, in <module>
    t.test_method22()
AttributeError: 'xxxx' object has no attribute 'remove_policy'

あれ、エラーだな。

CDKはあまり触ったことがないですが、Pythonはちょくちょく触っていたのでエラー内容等もある程度わかるのでエラー内容を見た感じ「あ、typoか」と軽く考えていました。

typoはよくあるのでドキュメントからコピーしようと思って下記のremove_policyを再度コピーして貼り付け実行しました。

  • remove_policyOptional[ RemovalPolicy])–インスタンスがスタックから削除されたとき、または更新中に置き換えられたときに適用されるCloudFormationポリシー。デフォルト:-RemovalPolicy.SNAPSHOT(リソースを削除しますが、データのスナップショットは保持します)

が、結果は変わらずエラーが発生します、しかも同じ内容で。

流石に変だとおもいました。

CDKを触っていてドキュメントにあるクラスやメソッドがの指定がイマイチ理解できないことがあり他の方の記事やコードを参考にして作成しておりました。

しかし、remove_policyを指定しているコードやPythonで書かれているものが当時はあまりなく1時間ぐらい探したのですが見つけることはできませんでした。

(今探すと普通に公式のGitHubにあった→aws-cdk-examples/app.py at master · aws-samples/aws-cdk-examples

悩んだ上げく一晩置くことにしました。(悩んでもわからないことは意外と灯台下暗しで簡単な間違いに気づかないので時間を置くようにしています。)

一夜明けて...

解決策もわからず、ドキュメントをみてイチからコードを再度作成しました。

engine = rds.DatabaseInstanceEngine.postgres(version=rds.PostgresEngineVersion.VER_12_3)
rds.DatabaseInstance(self, "InstanceWithUsername",
    engine=engine,
    vpc=vpc,
    credentials=rds.Credentials.from_generated_secret("postgres"),
    removal_policy=core.RemovalPolicy.DESTROY
)

実行。

問題なく作成が完了しました。

あれ、なんでだろう。調査!

エラーの原因

原因は簡単に判明。

文字列を検索すると一発で答えが出た。

間違い探しです。

  • remove_policyOptional[ RemovalPolicy])–インスタンスがスタックから削除されたとき、または更新中に置き換えられたときに適用されるCloudFormationポリシー。デフォルト:-RemovalPolicy.SNAPSHOT(リソースを削除しますが、データのスナップショットは保持します)

  • removal_policy (Optional[RemovalPolicy]) – The CloudFormation policy to apply when the instance is removed from the stack or replaced during an update. Default: - RemovalPolicy.SNAPSHOT (remove the resource, but retain a snapshot of the data)

docs.aws.amazon.com

翻訳の沼

Google翻訳使うとremoval_policy から remove_policynにスペルが変わります!

PythonのCDKのAPIリファレンスはすべて英語です。

英語が読めない自分はGoogleの機能を使用して翻訳していました。

なので、パラメータ説明だけでなくパラメータまでもが勝手に翻訳されています。

英語が日本語に変わるのはいいけどスペルが変わるのはやめてほしい......。

↓実際に試してみてください。

DatabaseInstance — AWS Cloud Development Kit 1.134.0 documentation

対策

パラメータをコピーするときは翻訳していないページで行いましょう。

もしくは英語を読めるようになりましょう。

最近は、Terraformも使うことが増えたのですが、その際は翻訳したページと英語のページそのまま表示するページの2つを使用していたりします。

当時はなにもわからず時間を無駄にしていました。

皆様も翻訳にはお気をつけてCDK開発を楽しんでください。