🍒

EC2を使いExpress.jsサーバーを立て、デプロイまでしてみた[社内部活動]

2024/09/10に公開

はじめに

社内の部活動の一つにクラウド部という部活動があるのですが、
今回はその活動として、EC2を触ってみようというハンズオン会があったためそこで学んだことを記事にしようと思います。

クラウド部ではクラウドの検証や情報共有などを行い、みんなでクラウドに関する知識を増やしていこうというモチベーションのもと活動しています。

https://sun-asterisk.com/recruitment/benefits/

本記事の目的

  • EC2インスタンスの起動からデプロイまでの流れを理解する
  • EC2インスタンスの起動に関する周辺知識をキャッチアップする

ハンズオン会で学んだことと、実際に後から自分で復習して学んだことをベースに流れをご紹介します。

ハンズオン会の構成

ゴール

EC2にExpress.jsのサーバーサイドアプリケーションをデプロイする

https://expressjs.com/

Step

  • EC2を立てる
  • SSMでEC2に接続
  • デプロイ作業の準備
  • 動作確認
  • 後片付け(重要!)

構成図

実践内容

リージョンの選択

それでは、まずはリージョンの選択です。
AWSは世界中の各地にデータセンターがあり、どこのリージョンを使うかを選ぶことができます。

実案件でリージョンを選ぶ際はコスト効率、リージョンで提供しているサービス、地理的位置など複数の要因を総合的に考慮して決定する必要がありますが、
今回はそのような要件がないため、地理的に近い東京リージョンを指定してEC2インスタンスを作成します。

参考:デフォルトのリージョンを変更したい場合

デフォルトのリージョンは「統一された設定」から変更することが可能ですので、
基本的に指定のリージョン一択という場合はこちらで設定をしておけば便利です。

以下参考記事です。

https://docs.aws.amazon.com/ja_jp/awsconsolehelpdocs/latest/gsg/select-region.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html

インスタンスの設定〜起動まで

それではインスタンス起動ボタンを押下し、諸々設定をしていきます。

インスタンス名を入力

今回はmy-test-appという命名にします。

参考:命名について

命名についてはインスタンス名に限らずバケット名やタグ名などを決める場面が出てきます。
私自身あまりAWSを触ったことがないため、この時点でケバブケースがスネークケースかどちらがいいのだろうとまず疑問に思いました。

結論から言えば、AWSリソースの命名にはケバブケースがオススメのようです。

理由としては、S3のバケット名に大文字またはアンダースコアを含めることができないためです。
命名規則は一貫性が大切ですので、上記のように例外を考慮しても一貫性が保てるケバブケースが良いということですね。

以下参考記事です。

https://zenn.dev/kaoru_dev/articles/df589681a31320

タグ設定

今回はhandson: testという命名にします。
組織内でAWSを利用する場合は組織内の規則に従いましょう。

リソースのタグ付けに関しては公式の記事を参考にしてください。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags.html

AMI(Amazon Machine Image)の選択

AMIは起動するVMの設定テンプレートのようなものであり、インスタンスの起動に必要な情報を提供しています。
AMIを使えば同じ設定のインスタンスを簡単に起動することができます。

特別な要件もないため、今回は公式AMIのamazonlinux2023を使いました。

ちなみにAMIはカスタマイズすることができ、独自にカスタマイズしたAMIをカスタムAMIとして使い回すことも可能です(今回は省略)。

参考記事

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instances-and-amis.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html

インスタンスタイプの選択

インスタンスタイプを指定することで、インスタンスに使用するホストコンピュータのハードウェアを決めることができます。
インスタンスタイプごとにCPUやメモリが異なるため要件に応じて選択する必要があります。

今回はt2.microを利用しました。

インスタンス vCPU CPU クレジット/時間 メモリ (GiB) ストレージ ネットワークパフォーマンス
t2.micro 1 6 1 EBSのみ 低~中

https://aws.amazon.com/jp/ec2/instance-types/

キーペアの設定

キーペアを設定するとインスタンスの作成時に公開鍵/秘密鍵のペアが生成され、鍵を用いてサーバーに接続できるようになります。
しかし、今回はAWS Systems Manager(SSM)の一部の機能であるSession Managerを利用するため、「キーペアなしで続行」を選択します。
(推奨されませんと出ていて怖いかもしれないですが、強い意志を持ってキーペアなしを選択しましょう)

実際にSSMでEC2に接続する方法については後ほど。

ネットワーク設定

ネットワーク設定では、AWS上にある仮想ネットワークであるVPCのどこに配置するかを決めます。
ハンズオン会では時間の都合上運営で事前に作成していただいてたので、指定されたものをそのまま選択しました。

ハンズオン会の後に自分で復習した際はVPCの作成も行ってみました。
作成方法は以下の記事が参考になりました。

https://dev.classmethod.jp/articles/vpc-beginner-2023/

ちなみに、VPC作成時にdefaultという名前のセキュリティグループが1つ作成されます。
デフォルトがどういった設定になってるのか気になったので調べてみたのですが、

  • 同じセキュリティグループを適用したインスタンスからのみ全てのインバウンド通信を許可
  • アウトバウンド通信は全て許可

ということで、最小権限になっているのかと思いきや違っていたので、注意が必要そうです。
個人学習ならともかく、実案件では用途ごとにきちんと作成しましょう。

VPCのセキュリティの基本については以下の記事が参考になりました。

https://www.stylez.co.jp/aws_columns/aws_security/amazonvpc_security_basics/#VPC

また、パブリックIPの自動割り当ての項目については「有効化」で設定しておきます。

ストレージ設定

ストレージ設定ではサーバーに関連付けられるストレージの容量や性能を決めます。
こちらはデフォルトのまま設定しました。

起動

「高度な詳細」については今回は触れないためスキップします。
ここまでの設定ができれば、ようやくEC2を起動します!

IAMロールを設定とSSMでEC2に接続

さて、次は起動したインスタンスを一覧から選択し、IAMロールをアタッチします。
IAMロールをアタッチした後は、SSMでEC2に接続します。

この章の手順については以下の記事で解説されていますので、本記事では割愛します。

https://envader.plus/article/178#Session Managerを使用してEC2へアクセス

セッションマネージャーの接続ができない場合

再起動

再起動後に再確認すると...無事接続ができるようになっていました

それでも解消されない場合は以下のトラブルシューティングが参考になるかもしれません。
自分の場合は再起動をすることで接続ボタンが有効になりました。

https://dev.classmethod.jp/articles/troubleshooting-ssm-session-manager-configuration/

デプロイ作業の準備

ソースコードは準備していただいたこちらを使用しました。

https://github.com/sun-asterisk-training/ec2-deploy-sample-app

ソースコードの取得

今のままではgit cloneすることができないため、まずはgitコマンドを実行できるようにgitのインストールから行っていきます。
手順についてはこちらのスクラップ記事を参考にしてください。

https://zenn.dev/torahack/scraps/c2e5a2199af2b3

nodeのセットアップ

そして、デプロイするアプリを動かすためnodeのセットアップを行います。
以下AWSのチュートリアル記事に載っているコマンドをそのまま実行すればOKです。

https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html

PM2のインストール・起動

nodeのセットアップができたら、PM2のインストールを行います。
PM2とはアプリケーションを永続化し、アプリケーションが異常終了した場合に再始動するというプロセス管理を行ってくれるものです。
PM2のインストール方法については上のスクラップ内に載っていますので参考にしてください。

PM2については以下記事が参考になりました。

https://it-evo.jp/blog/blog-70/

Hello World!

それでは動作確認です。
パブリックIPアドレス:3000でブラウザからアクセスして"Hello World!"が表示されていればOKです。

お疲れ様でした!!

お片付け

これで終わりではありません。遊んだ後は片付けが必要です。

停止したインスタンスには料金が発生しませんが、
それらのインスタンスに添付されたElastic IPアドレスまたはEBSボリュームには料金が発生します。

ですので、使わないインスタンスは削除しましょう。

また、これは過去自分が経験した失敗なのですが、
1つのAWSリージョンでインスタンスを終了していたが別のリージョンにインスタンスが残っていて請求が続いていたということがあるのでご注意ください。

参考記事

https://repost.aws/ja/knowledge-center/ec2-billing-terminated

最後に

以上、EC2のハンズオン会で学んだことの共有でした。
このような会を開催してくださった運営の方には感謝です!!

実際にハンズオンをしている時も勉強になりますが、IAMやVPCの作成など何も準備されていない状態で一から復習するのも良い勉強になりました。
ご興味がある方は本記事をぜひ参考にEC2を触ってみてください。

それでは最後までお読みいただきありがとうございました!

Sun* Developers

Discussion