🐧

terraformでwebアプリに使えるawsの基本的なインフラ構成

2024/08/04に公開

概要

タイトル通り、terraformでwebアプリに使えるawsの基本的なインフラ構成を作ったのでリポジトリに登録・公開してみました。
独自ドメインを用いてec2インスタンス上でwebアプリを動かす想定の内容です。

Git URL: https://github.com/tetsurohaga/basic-infra-ec2-app-tf

作成リソース

以下構成図です。

リスト形式でも作成リソースと説明を記載しておきます。

  • cloudfront: キャッシュしないマネージドポリシーを当ててます。最低限の設定のみです。
  • acm
    • cloudfront利用分: バージニアリージョンでの発行
    • alb利用分: 東京リージョンでの発行
  • route53
    • hostzone: 独自ドメインのホストゾーン
    • record
      • cloudfrontと独自ドメインの紐付け
      • ACM認証のレコード登録
  • vpc
    • subnet
      • プライベートサブネット: ec2-appを配置
      • パブリックサブネット: ec2-nat,albを配置
    • security group
      • ec2-app用: albからのhttpを許可,外部向けにhttps許可
      • ec2-nat用: 外部向けにhttps許可,ec2-appからのhttps許可
        • ec2-app,natともに外部向けhttps許可はセッションマネージャでの接続に必要。
      • alb用: cloudfrontのIPレンジからのhttpsを許可
    • route table
      • プライベートサブネットからec2-nat経由の外部通信ルート
  • alb
    • target group: albに紐付け, port:80
    • listner: httpsのリスナー,設定アクションはターゲットグループに転送のみ
  • ec2
    • app: webアプリを搭載する想定のインスタンス
    • nat: 外部通信用に使用。((*)後述してますが、NATインスタンスのami作成が事前に必要)

利用者側で事前に用意が必要なリソース

こちらのコードは、いくつかのリソースは事前に手動で作成されてる想定となっているので、
事前に用意してもらうリソースを記載します。

  • 独自ドメイン
  • route53 ホストゾーン
    • 独自ドメインのものでcloudfront, acmなどで利用します。
  • ec2のami(ami-id)
    • ec2-app用: webアプリが設定済みのものやパブリックなamiなど。
    • ec2-nat用: natインスタンスのami作成が必要です。(面倒ポイント)
  • ec2に設定するIAMロールおよびポリシー
    • 今回IAM関連の設定は含まれていません。

利用者側でコード修正が必要な箇所

上記の事前に用意が必要なリソースの部分のコードは修正が必要になります。

  • acm.tf
    • "{{ DOMAIN_NAME }}": 利用する独自ドメイン名を設定
  • cloudfront.tf
    • "{{ DOMAIN_NAME }}": 利用する独自ドメイン名を設定
  • ec2.tf
    • "{{ AMI_ID }}": 使用するami-idを設定
    • "{{ IAM_ROLE_NAME }}": 使用するIAMロール名を設定
  • route53.tf
    • "{{ DOMAIN_NAME }}": 利用する独自ドメイン名を設定

説明とぼやき

使い方としては、

  • 上記した事前準備のリソースを用意
  • リポジトリのクローン
  • ディレクトリに移動して terraform init
  • 必要箇所の修正(修正内容は上記)
  • terraform apply
    で環境構築されるはずです。

まぁちょっと探せばそこら辺で同様のものはポロポロ出てきそうな構成です。
ec2インスタンスにはセッションマネージャでログインする想定です。

セキュリティ面での設定についてはcloudfront->albまでの部分が緩いので、必要に応じて追加設定が必要な箇所かと思います。
ログ関連などモニタリング系の設定は一切ありません。

あと、改めて見ていたらNATインスタンスのamiを自身で用意しなきゃいけないのはちょっとイジワルですね。。。ただコスト的にはNATゲートウェイより安いのでおすすめです。

コスト安い関連でいくと、
インスタンスタイプはケチぃものを使ってるので、そこは用途に合ったサイズをご利用ください。
あとスポットインスタンスの設定が入ってます。
その関係でインスタンスの"停止"ができない点ご認識ください。

「停止できないのかい」と思うかと思いますが、そこはterraformの利点でカバーです。
terraformなら terraform apply のコマンド一発で同じ構成を作れて、terraform destroy のコマンド一発でリソース削除もできます。

自身も使い始めにインフラ作成、使い終わったらインフラ構成まるごと削除、といった感じで1時間位だけ使う、といった使い方をしてました。

加えて terraform apply -auto-approve(yesの省略)などのコマンドをスケジュール実行すれば指定のスケジュールで自動で環境作成、なんて事もできそうです。

独自ドメインを用いてcloudfront,albを経由する構成をterraformによるコマンド一発で作れるのは個人開発やテスト環境などで有用かもなー、、、というのと自身の採用活動のアイテムにもなるし、という所でリポジトリ公開しました。

公開にあたって、terraform名のリソース名を結構変えたり、コメントを普段の自分ではやらないレベルでつけたり、設定も結構見直したり、と公開するとなると結構面倒だなということを感じました。
でも自身で対応したことの振り返り、見直し、分かりやすくする、といった事をするので良いことではありますね。

Discussion