はじめに
以前CloudFormationでMinecraftサーバーを構築しましたが、今回はTerraformを使って同様のサーバーを構築してみたいと思います。
こちらの記事の続き?です。
環境
- Terraform v1.9.7 on darwin_arm64
- macOS Sonoma 14.4.1
1分でわかるTerraform
TerraformはHashiCorp社が提供するIaCツールで、様々なクラウドサービス上にインフラを構築することができるサービスです
リソースを作成するTerraformコード
base/ EC2の作成に必要なVPCやIAMロールなどを作成
ec2/ Minecraftサーバーを動作させるEC2インスタンスを作成
scheduler/ EC2インスタンスを自動停止するスケジューラを作成
プロジェクトのrootでterraform apply
を実行することでbaseとec2のリソースを作成し、schedulerディレクトリの中でterraform apply
を実行することでスケジューラを作成することができます。
こちらにコードを配置しているのでご参照ください。
詰まったところ
パブリックIPアドレスが割り当てられない
サブネットのmap_public_ip_on_launch
をtrueにする必要がありました。
セキュリティグループでアウトバウンドの通信が弾かれてしまう
セキュリティグループにアウトバウンドルールが設定されておらず、EC2インスタンスの初期設定やセッションマネージャーの接続がうまくいきませんでした。
AWSのデフォルトでは全てのトラフィックを許可する出力ルールが作成されますが、TerraformはVPCに新しいセキュリティグループが作成された場合、その出力ルールが削除されるためアウトバウンドの通信が弾かれていました。
導入するTerraformが間違っていた
初歩的なミスですがarm64アーキのPCにも関わらずamd64のTerraformを導入していました。
コマンドを実行するとタイムアウトになったためなぜだろうと思っていたのですが、アーキテクチャが間違っていたのが原因でした。。
使い方
-
こちらのサイトで遊びたいバージョンのサーバーのダウンロードリンクを取得する
- バージョンを選択し、Download Server jarを右クリックしてリンクをコピーする
- Terraformをインストールする
- 環境変数を設定する
- AWSの認証に必要なアクセスキーなど
- terraform init を実行する
- terraform applyを実行する
- インスタンス起動のタイミングでEULAに自動的に同意するため注意
- 1でコピーしたリンクを変数として入力する
- リージョンはap_northeast_1にしているため、他のリージョンを利用する場合は変更する必要がある
- AWSマネジメントコンソールからEC2の画面を開き、パブリックIPv4アドレスをコピーする
- MinecraftでサーバーIPの欄にパブリックIPv4アドレスを入力してサーバーに接続する
- EC2インスタンスが作成された後もインスタンス内部で設定を行っているため10分程待ってからアクセスする必要がある
- 遊び終わったらEC2インスタンスを停止する
- 稼働させている限り料金が発生してしまう
- 停止ではなく終了してしまうとデータが消えてしまうので、理由がない限り停止を推奨
CloudFormationとの比較
有名な2つのIaCツールを使ってみましたが、どちらにも長所があるため、プロジェクトの特性に応じて使い分けるのが良さそうです。特にTerraformは複数のクラウドサービスに対応しているため、他のクラウドサービスに移行する際も変更箇所を最小限に抑えられるのが利点だと思いました。また、Terraformはブラウザ上での操作ではなく、ターミナル上で完結するところが魅力的です。
ただし、AWS社が開発したものをHashiCorp社が追従する形になっているため、AWSを利用する場合はCloudFormationが優位に立つでしょう。
AWSにはAWS CDKもあり、こちらは各プログラミング言語で記述できるので、開発環境を統一したい場合に適しています。
おわりに
また、今回のコードはCloudFormationのコードを元にAIに生成してもらったのですが、かなり精度が高くて驚きました。
参考