こんにちは、エンジニアの石川です。
今回は好きな言語が利用可能なIaC構成管理ツールであるPulumiを利用して、JavaでAWSのEC2インスタンスを立ち上げてnginxを起動するものを構築してみました。
なぜPulumi?
2023年8月中旬ごろ、Terraformのライセンス変更(HashiCorp adopts Business Source License)が話題となった際に私はPulumiについて知りました。
私のようなエンドユーザーにはこのライセンス変更の影響は全くなかったのですが、一部のユーザーはTerraformの代替案を探しており、その代替案の中にPulumiがありました。
Pulumiは
好きなプログラミング言語(TypeScript、JavaScript、Python、Go、C#、Java、YAML)を使用してIaCの構成管理を記述することができる
Pulumi AIというソースコード作成をAIがサポートしてくれるという機能がある
と紹介されており、興味をもったため試してみることにしました。
Pulumiの環境構築
Get started with Pulumi & AWSに従いつつ、自分の状況に合わせて設定していきました。
pulumiのインストール
Get started with Pulumi & AWSのとおりにpulumiをインストールしました。
Javaの動作環境を用意
Pulumiに必要なのは、Java11以上とMaven3.6.1以上です。普段はJava8を利用しているため、11に切り替えました。
AWSアカウントの設定
利用するAWSアカウントは既に作成済みのため、AWSの認証情報に関する設定を行いました。
具体的には、AWSの認証情報を含むプロファイル(今回はpulumi-mfaという名前のプロファイル)を作成しました。
Pulumiプロジェクトの作成
この部分はGet started with Pulumi & AWS に従いながら、Javaを使うためのプロジェクトを作成しました。
ファイル構成は以下の通りです。
Pulumiが参照するプロファイルの指定
「3. AWSアカウントの設定」で作成した認証情報をPulumiがデプロイ時などに利用するために、プロジェクト内のPulumi.dev.yamlに作成したプロファイル名を追記しました。
AWSでEC2インスタンスを立ち上げてnginxを起動するJavaスクリプトを作成
今回の目標は、AWSでEC2インスタンスを立ち上げてnginxを起動するJavaスクリプトの作成です。
モジュール化などは含んでいません。
VPC
aws.ec2.Vpc | Pulumi Registry を利用する場合、自分でルートテーブルやIGWを別で作成しなくてはならないため、awsx.ec2.Vpc | Pulumi Registry を利用することにしました。
VPCを作成し、パブリックサブネット1つだけを作成しています。
awsxを利用するためのdependencyをpom.xmlに追記します。
セキュリティグループ
ssh用の22番ポートとhttp用の80番ポートを解放しています。
sshアクセス用のキー
コマンド「$ ssh-keygen -t rsa -b 2048 -f 」で作成したパブリックキーの中身をpublicKey部分に指定しました。
EC2
一般的なEC2の設定と変わる部分は特にありません。
userDataにはnginxのインストールと起動を行うためのスクリプトを記述しています。
subnetIdやvpcSecurityGroupIdsではapplyValueというメソッドを利用しています。
Inputs & Outputs | Pulumi Conceptsで説明があるのですが、自分なりにまとめると「出力の型(Output型)で囲まれた値を取得する」ことができるメソッドです。
vpc.publicSubnetIds()の値の型は Output<List<String>> です。
applyValueメソッドを利用することで、List<String>として利用することができるようになります。
最終的にApp.javaは以下のようになりました。
Pulumiでデプロイ
デプロイする前に、コマンド「$ pulumi up 」でどのようなリソースが作られるのかを確認します。
最後の選択肢でyesを選択すればデプロイをし、noを選択すればデプロイをキャンセル、detailsを選択すればリソースのさらに詳しい情報を取得することができます。
デプロイ後にEC2のパブリックIPアドレスにアクセスし以下のような画面が表示されれば成功です。
感想
以下は今回Pulumiを試してみたときの感想です。
例が少ない
Terraformと比較すると日本語の資料や例の数が少なく感じました。
こちらはドキュメントを読む、ソースコードを読むことで対処可能である範囲ですが、Pulumiが初めてのIaC構成管理ツールであるという人にはTerraformと比較すると難易度が高いです。
PulumiAIを上手く活用することができなかった
Pulumi AIに依頼をするとソースコードを書いてくれるのですが、そこにはもちろん誤りも含まれています。今回は誤りの部分の修正を行うためにドキュメントを読みこんで自分でコードを修正して...と進めていきました。
本来はPulumi AIとやり取りをしながらより良いコードを作成していくと思うのですが、私はあまり頼ることができませんでした。
英語でのやり取りが苦手ということも頼ることができなかった一因であるため、いつか日本語対応してくれる日が来ればおんぶに抱っこ状態になるかもしれません。
Terminalで日本語が出力された時に必ず文字化けする
Terminalのエンコードの言語を色々なものに変えて試しましたが、どうしても日本語の文字化けは直すことができませんでした。
エラーが日本語で出力された場合は、それ以外の部分の情報から自分でたどり着くしかないのでしょうか...
おわりに
今回はPulumiを利用して、JavaでAWSのEC2インスタンスを立ち上げてnginxを起動するものを構築してみました。
次回はOpenTofu(豆腐)などの話題に関する記事を書きたいなと思っています。
ありがとうございました!