前書き
配属されたPJでインフラ構築を進めていたところ、CloudFormationを使ってスタックを作成するときにエラーが出てしまいました。GPT先生に聞いたところ解決はしたものの、中身を詳しくチェックできなかったので記事にします。
どんなエラーが出た?
The architecture 'arm64' of the specified instance type does not match the architecture 'x86_64' of the specified AMI. Specify an instance type and an AMI that have matching architectures, and try again. You can use 'describe-instance-types' or 'describe-images' to discover the architecture of the instance type or AMI.
GPT先生に聞いてみた
結論としては、AMIとインスタンスタイプ(t2.microとかのアレ)の「アーキテクチャタイプ」が一致していなかったらしい。
これを、今回使用するつもりだったインスタンスタイプのものと合致するものに合わせたところ、エラーは解消された。
アーキテクチャタイプ
ここでいうアーキテクチャとは、特に命令セットアーキテクチャ (instruction set architecture, 以下ISA)のこと。
CPUは様々な処理を行うためのごく原始的な命令(論理/算術演算子やデータのコピーなど)を備えており、またそれら命令を実際に処理するためのレジスタ(CPU内で一時的にデータを記憶する領域)などの仕様が先述のISAにより決められています。
つまり同じISAのCPUであれば開発元がどの会社のCPUであったとしても、基本的には同じプログラムが動作します。
ですってよ。
OSとかISAとか、細かい環境の違いがあって、このせいでめちゃくちゃエラーが起きるんやろな......
まだ名も知らぬ環境の違いがたくさんあると思うと ゾッとする... ワクワクしますね!
以下の2つのISAが主流らしい
x86(Intel) ・・・はちろく
→高性能だが消費電力も高い
ARM(ARM) ・・・あーむ
→省電力、低コストなCPUから高性能なものまで幅広い
詳しくは以下のサイトが分かりやすくまとまっていたので興味がある方はこちら
https://beyondjapan.com/blog/2021/01/cpu_architecture/
そして、インスタンスタイプごとに使用できるISAは決まっているため、エラーが出てしまったのであった。
どのISAがっしようできるかは、各々のインスタンスの詳細ページで確認できる。
たとえばT2インスタンスであれば、
https://aws.amazon.com/jp/ec2/instance-types/t2/
Intel® AVX-512 命令を採用した高速のカスタム Intel® Xeon® スケーラブルプロセッサ
とある。
Intel® Xeon® スケーラブルプロセッサ (=CPU)
が解釈・実行できるISAがx86_64である。
したがって、T2インスタンスを使用したいのであれば、ARMではなくx86を利用しなけらばならない。
x86が一般的みたいだが、今回のPJで使用したインスタンスタイプはARMを利用しなければならないものだった。
どのインスタンスタイプを使ったのか、ぜひ当ててみてほしい。
感想・まとめ
クラウドとはいえ、やってることは基盤なのだから、ソフトウェアとか、クラウド特有の知識だけでなく、
ハードウェアの知識も蓄えていかなけらばならぬ。と、痛感しました。
まだハードウェアの面白さに目覚めていないので、目覚められるように食いついていきたいと思います。
参考
https://beyondjapan.com/blog/2021/01/cpu_architecture/
https://aws.amazon.com/jp/ec2/instance-types/t2/