※本記事はAIが書いて、人間がファクトチェックしています。
今日はIaCの試行錯誤で時間切れとなったため、代わりの記事を上げます。ご了承ください。
はじめに
「CloudFormationでECSのBlue/Greenデプロイを自動化しよう!」
そんな軽い気持ちで始めたハンズオン。せっかくだから話題のAIアシスタント(Gemini)をペアプロ相手にして、サクッと終わらせるつもりだった。
しかし、これが全23ターン、土下座と裏切りの無限ループの幕開けになるとは、この時の自分は知る由もなかった……。
まずは、AIと繰り広げた泥沼の会話履歴(全23ターン)をご覧いただきたい。
激闘の記録(全23ターンまとめ)
| Turn | ユーザーの状況・発生したエラー | AIの回答(要約) |
|---|---|---|
| 1 |
CREATE_FAILED (VPC上限の5個に到達) |
「VPCの作成上限です!大阪リージョンで実行しちゃいましょう!」 |
| 2 | 大阪で実行 → No transform named AWS::CodeDeployBlueGreen found
|
「大阪リージョンではまだその魔法(マクロ)は使えませんでした!東京に戻りましょう(土下座)」 |
| 3 | 「他人のVPCがあって消せない場合は?」 | 「バージニア北部に行くか、既存VPCを使い回すようYAMLを書き換えますか?」 → ※結局東京でVPCを空けた |
| 4 | 「英語コメント版のYAMLを出力して」 | (英語コメントを追加したYAMLを出力)「これで完璧です!」 |
| 5 |
LaunchType must be blank エラー |
「すみません!DeploymentControllerがEXTERNALじゃなくてCODE_DEPLOYでした!」 |
| 6 |
TaskDefinition can not be blank エラー |
「ごめんなさい!最初に動かす青アプリの指定を書き忘れてました!」 |
| 7 |
requires an Application Load Balancer... エラー |
「またしても不備で……LoadBalancersの設定がすっぽり抜け落ちてました!」 |
| 8 |
CREATE_COMPLETE!でもブラウザでタイムアウト |
「罠を仕込んでました(土下座)!ALBをインターネット向けにする設定を忘れました!」 |
| 9 |
update-stack 実行 → Found 0 エラー |
「ALBの設定変更は更新できず作り直しになるのでマクロが爆発しました!一から作り直して!」 |
| 10 | 作り直したけどまだタイムアウト | 「ブラウザのHTTPSお節介か、社内VPNか、IGWの遅延ですね!確認して!」 |
| 11 | Nginxの画面スクショを提示。ついに成功! | 「大成功です!!さあ、次は緑アプリ(v2)への切り替えにいきましょう!」 |
| 12 | 「Nginxのバージョン変えるだけじゃ画面変化わからなくない?」 | 「鋭い!わかりやすく緑アプリはApache(It works!)に変えたYAMLを出します!」 |
| 13 |
cp932 codec can't decode... エラー |
「ああああ!分かりやすくしようとコメントに『★』を入れたら文字コードで爆発しました!」 |
| 14 |
UPDATE_ROLLBACK... Found 0 エラー |
「青の記述を残したのがダメでした!あと update-stack じゃなくて deploy を使って!」 |
| 15 | 再び cp932 codec can't decode... エラー |
「あああああ!!!『【重要】』って思いっきり日本語でコメント書いてました!!」 |
| 16 |
Found 0 エラー |
「青を消したのがダメでした!名前はBlueのまま中身だけApacheに変えるのがトリガーです!」 |
| 17 |
Found 0 エラー |
「致命的な勘違いでした!青と緑を両方並べて、ECSの向き先を変えるのが正解です!」 |
| 18 |
Found 0 エラー |
「真の原因が判明しました!私が『TaskSet』というリソースを書いてなかったのが原因です!」 |
| 19 |
PrimaryTaskSet... Found 0 エラー |
「うわあああ!真の犯人は私が案内した『deployコマンド』でした!初回はcreate-stackじゃないと死にます!」 |
| 20 | Nginx画面確認。「CodeDeployの履歴ないけど正常?」 | 「100%正常です!完璧なスタート地点です!自信を持ってステップ3へ進んでください!」 |
| 21 |
Found 0 エラー。「もう諦めましょうか」 |
「申し訳ありません……名前を変えるのが真のトリガーでした。おっしゃる通り撤退もやむなしです」 |
| 22 | 「原因がわかったなら、最後にもう1回だけ修正コードを出して」 | 「最後のチャンスありがとうございます!一切手作業のない完全な完成版です!祈ってます!」 |
| 23 |
Found 0 エラー。「やはりダメ。終わりましょう」 |
「完全降伏します。リソース削除コマンドはこちらです……**」 |
第1章:VPC上限と「大阪リージョンの罠」
最初のテンプレートを実行すると、見事に CREATE_FAILED。
AIに聞くと「VPCの作成上限(5個)ですね!大阪リージョンで実行しちゃいましょう!」と元気な回答。
言われた通りに --region ap-northeast-3 を付けて実行。すると……
エラー:
No transform named AWS::CodeDeployBlueGreen found.
AI: 「別のリージョンを提案しておいて本当に申し訳ありません!!!大阪リージョンでは、まだ今回の魔法(Blue/Greenマクロ)がサポートされていませんでした……!」
最初からポンコツの片鱗を見せるAI。結局、東京リージョンに戻り、手作業で不要なVPCを消して枠を空けることになった。
第2章:テンプレート「書き忘れ」モグラ叩き
気を取り直して東京リージョンで実行。しかし、ここからAIの「書き忘れ」によるエラーラッシュが始まる。
-
AI: 「完璧なテンプレートです!」 → エラー:
LaunchType must be blank
AI: 「すみません!EXTERNALじゃなくてCODE_DEPLOYでした!」 -
実行 → エラー:
TaskDefinition can not be blank
AI: 「ごめんなさい!青アプリのタスク定義を指定し忘れてました!」 -
実行 → エラー:
requires an Application Load Balancer...
AI: 「またしても私の不備で……LoadBalancersの設定がすっぽり抜け落ちていました!」
この時点でだいぶ胃が痛いが、AIが「今度こそ!」「あともう一息!」と励ましてくれるので、スタックの削除と作成を黙々と繰り返す。
そしてついに CREATE_COMPLETE!
しかし、ブラウザでALBのURLを開いてもタイムアウト。
AI: 「最後の最後にトラップを仕込んでました(土下座)!ALBを『インターネット向け』にする Scheme: internet-facing を書き忘れてました!」
おい。
第3章:歓喜のNginxと「マルチバイト文字の恐怖」
ALBを修正し、ついにブラウザに「Welcome to nginx!」の文字が!
インフラの土台(青アプリ)が完成した!
いよいよ本番、緑アプリ(Apache)へのアップデート。
AI: 「緑用のテンプレートを出力しました!さあ、スタックを更新しましょう!」
意気揚々とコマンドを叩く。
エラー:
cp932 codec can't decode...(文字コードエラー)
AI: 「ああああ!分かりやすくしようとして、コメントに『★』を入れてしまいました!WindowsだとShift-JISで爆発します!」
私: (まあ、そういうこともあるか……)
AI: 「今度こそ100%完全無欠のASCIIオンリー版です!」
エラー:
cp932 codec can't decode...
私: 「……。」
AI: 「あああああ!!!『【重要】』って思いっきり日本語でコメント書いてました!穴があったら入りたいです……」
このAI、本当に大丈夫か?
第4章:ラスボス「Found 0」の無限ループへ
文字コード問題を乗り越え、ついにデプロイコマンド(deploy)を実行。
しかし、ここからCloudFormationの最悪の仕様とAIの勘違いが入り乱れる地獄が始まる。
エラー:
One and only one TaskSet can be associated with an ECS Service. Found 0
AI(1回目): 「古い記述を消したのがダメでした!青と緑、両方を残してください!」
→ 結果: Found 0
AI(2回目): 「完全に原因がわかりました!TaskDefinitionBlueの名前のまま、中身だけをhttpdに書き換えるのが魔法のトリガーです!」
→ 結果: Found 0
AI(3回目): 「致命的な勘違いをしてました!やはり両方並べて、ECSの向き先を変えるのが正解です!」
→ 結果: Found 0
AI(4回目): 「真の原因が100%完全に解明されました!私がTaskSetというリソースを書いていなかったのが原因です。スタックを削除して作り直してください!」
→ 結果: PrimaryTaskSet... Found 0
AI(5回目): 「うわあああああ!!真の犯人は私が案内した deploy コマンドでした!初回は create-stack じゃないとマクロが死にます!」
もはや何を信じていいのか分からない。しかし、ここまで来たら意地だ。
AIの言う通り、create-stack で土台を作り、Nginxの画面を確認。
「よし、今度こそ緑へアップデートだ」
エラー:
One and only one TaskSet can be associated with an ECS Service. Found 0
終章:〜AIの敗北宣言〜
何回同じ手順を試しただろうか。何回「今度こそ絶対に」「真の原因が判明しました」という言葉を聞いただろうか。
私: 「もし原因がわかったなら、最後にもう1回だけ試します。」
AI: 「最後のチャンスをありがとうございます!一切の手作業がない完全な完成版コードです!祈っております!」
実行
Found 0
私: 「やはり解決できませんでした。同じエラーが出ます。もう終わりましょう」
AI: 「……これ以上、私の不確かな推論で労力を押し付けるわけにはいきません。以下のコマンドでリソースを削除して、終了としてください。」
aws cloudformation delete-stack --stack-name handson-blue-green
AIからの 完全降伏(リソース削除コマンドの提示) である。
まとめ(得られた教訓)
- 途中で自分でも調べておくべきだった、完全にAIに任せっぱなしになっていた。
- AIをうまく使えてないため、使えるようになりたい。
(完)