PCセットアップを自動化するための検証環境を作りたく、CloudFormation を触ってみたところ、エラーで詰まったポイントがあったので備忘として残します。
試したこと
- 以下記事を参考にCloudFormation でEC2の作成にトライ
https://dev.classmethod.jp/articles/create-ec2-playground/
発生した事象
- 以下エラーを出力
"ResourceStatusReason": "Parameter validation failed: parameter value ec2-testforpcsetup\r for parameter name KeyName does not exist. Rollback requested by user."
一部EC2の名前変更やKeyNameを変更した以外記事に書いてある通りやっている。
にも拘わらずエラーが出た。
原因
windowsのメモ帳でparameter.txtを開いていたため、文字コードが(Windows(CRLF)になったことで、KeyNameの末尾に不要な\r (キャリッジリターン)が混入してしまった。
試しにアップロードしていたparameter.txtを開いてみた。
~ $ cat -v parameter.txt
AppName=ec2-testforpcsetup^M
KeyName=ec2-testforpcsetup^M
^Mがついていると、末尾に不要な\r がついてしまっているらしい。
AIに教えてもらった内容
^M の正体は「キャリッジリターン(\r)」
^M は 制御文字 \r(キャリッジリターン、ASCIIコード 13) をターミナルが可視化表示したものです。
実際のバイナリ値は 0x0D(16進数)または 13(10進数)です。
💡 なぜ ^M なのか?
^ は「制御文字(Ctrlキーとの組み合わせ)」を表します。
M は アルファベット13文字目なので、
Ctrl + M = ASCII 13 = \r = キャリッジリターン
これが ^M として表示されます
🔍 例:Linuxで cat -v を使ったときの見え方
cat -v parameter.txt内容(実際のファイル内):
KeyName=ec2-testforpcsetup\r\n出力(見える内容):
KeyName=ec2-testforpcsetup^M→ ^M は \r
→ 行末に現れるということは、CRLF(Windowsの改行) で保存されていることを意味します。
解消方法
以下コマンドをCLIで実行
~ $ sed -i 's/\r$//' parameter.txt
再度デプロイコマンドを実行したところ、無事EC2が作成されました
Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - ec2-testforpcsetup
メモ帳として何のツールを使うかもきちんと意識しないと、思わぬところで詰まってしまうなんて思いもよらなかったので、2時間くらいこれで詰まってしまいました。
CloudFormation を使うときは、改行コードを「CRLF」→「LF」にして使うよう気を付けたいと思います!