🔧

IaCの基礎【AWS CloudFormation】について基本を実践

2025/02/17に公開

はじめに

IaCについて学習中の身ではございますが、基礎的な範囲で実践してみた結果をアウトプットします。
また私と同じような初学者の方にとって、この記事が少しでもお力になれれば幸いです。

前提

今回CloudFormationのテンプレート内で記述する構成は、私の他記事で作成したWebAPサーバの構成をそのまま転用します。
内容についてご興味、ご不明点ありましたら、ぜひそちらの記事もご参照ください。↓

https://zenn.dev/gj77a/articles/3f3b1be845289b#discuss

以下、構成の概要です。

項目名 設定値
VPC 作成済みのVPCを指定(新規作成しない)
サブネット 作成済みのパブリックサブネットを指定(新規作成しない)
セキュリティグループ(インバウンド) ポート:80、CIDR:0.0.0.0
セキュリティグループ(アウトバウンド) 全許可
EC2インスタンスタイプ t2.micro
OS Amazon Linux 2023
Webサーバ Apache HTTP Server 2.4.62
APサーバ Apache Tomcat 10.1.34
Java Amazon Corretto Devel 21

IaC(Infrastructure as Code)とは・・・?

IaC(Infrastructure as Code)とは、サーバーやネットワークなどのインフラをコードで管理する技術のことを指します。
具体的なIaCサービスとしては、本稿で記載するAWS CloudFormationや、他にもTerraform、Ansibleが有名です。
これらを使用する利点として、

  • 手作業(Web画面やCLIでの操作)による構築作業と比較し、多くの作業を自動化でき、ミスを減らせる
  • 一度コードを作成すれば、同じ環境の再現が高速化できる

大きく上記2点が挙げられるかと思います。
同じコードを利用すれば、インフラ経験に関係なく誰でも全く同じ環境を作成できる点が大きいですね。

AWS CloudFormationとは・・・?

AWSが提供するIacサービスの呼称です。
当然ではありますが、前項で記載したIaCサービスの利点を持っています。
他IaCサービスよりもAWSリソースの作成に特化しているため、AWSのみで環境を作成したい場合の選択肢として有力です。

テンプレートの作成

さっそくですが、CloudFormationのテンプレートを作成します。
テンプレートとはCloudFormationにリソース作成を依頼するために必要な設計図のようなものですね。
YAML・JSONの2つの言語で記述可能ですが、今回はYAMLで記述いたします。

CFtest.yaml
AWSTemplateFormatVersion: '2010-09-09' # CloudFormationテンプレートのバージョン(固定値)

Resources:
  WebAPTestEC2:
    Type: AWS::EC2::Instance # ここでリソースタイプ:EC2を指定
    Properties:
      InstanceType: t2.micro
      ImageId: ami-06c6f3fa7959e5fdd # Amazon Linux 2023 のAMIを指定
      KeyName: !Ref WebAPTestKeyPair # キーペアを作成(!Refで後の記述を参照)
      NetworkInterfaces:
        - AssociatePublicIpAddress: true
          DeviceIndex: '0'
          SubnetId: subnet-xxxxxxxxxxxxx # 作成済みのパブリックサブネットIDを指定
          GroupSet: 
            - !Ref WebAPTestSG # セキュリティグループを作成(!Refで後の記述を参照)
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeSize: 8
            VolumeType: gp3
      UserData: # ここでEC2起動後に実行するコマンドを記述(Apache/Tomcatのインストールと起動)
        Fn::Base64: !Sub |
          #!/bin/bash
          sudo dnf update -y
          sudo dnf -y install httpd-2.4.62-1.amzn2023
          sudo dnf -y install java-21-amazon-corretto-devel
          sudo dnf install -y tomcat10-webapps.noarch
          sudo systemctl start httpd tomcat10
          sudo systemctl enable httpd tomcat10
      Tags: # インスタンス名
        - Key: Name
          Value: WebAP-test-EC2-CF

  WebAPTestSG:
    Type: AWS::EC2::SecurityGroup # ここでリソースタイプ:セキュリティグループを指定
    Properties:
      GroupName: WebAP-test-SG-CF # セキュリティグループ名
      GroupDescription: Security group for WebAP-test EC2 # 説明
      VpcId: vpc-xxxxxxxxxxxxx  # 作成済みのVPCIDを指定
      SecurityGroupIngress: # インバウンドルール
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0 # ポート:80のインバウンドを許可
      SecurityGroupEgress:
        - IpProtocol: -1
          CidrIp: 0.0.0.0/0 # 全トラフィックのアウトバウンドを許可

  WebAPTestKeyPair:
    Type: AWS::EC2::KeyPair # ここでキーペアを作成
    Properties:
      KeyName: WebAP-test-KeyPair-CF
      KeyType: rsa

上記コードを適当なファイル名(今回はcftest.yaml)で保存します。
テンプレートファイルの保存先はどこでも構いませんが、今回はローカル上に保存しました。

スタックの作成

次にマネジメントコンソール画面から、保存したテンプレートファイルを使用してスタックの作成を行います。
まずはAWSマネジメントコンソール画面にログインし、CloudFormation画面に移動しましょう。

「スタックの作成」を押下します。

続けてテンプレートの指定を行います。
テンプレートファイルの読み込み方法は以下から選択できます。

  • Amazon S3 URL ・・・ S3上に保存したファイルのURLを指定
  • テンプレートファイルのアップロード ・・・ ローカルからコンソール画面に直接アップロード
  • Git から同期 ・・・ Gitリポジトリ上のファイルと同期

今回はローカル上に保存したため、「テンプレートファイルのアップロード」を選択し、
「次へ」を押下します。

「スタックの詳細を指定」画面ではスタック名を入力します。
今回は「cftest」とします。

次の画面では「タグ、IAMロール、スタック作成失敗時の挙動」などのスタックオプションについて設定することができます。
今回は仮に作成失敗した際の保険として「スタックの失敗オプション」のみ設定します。

スタック作成失敗時までに作成済みとなっていたリソースを含む、すべてのリソースをロールバック(削除)可能としたいため、
「すべてのスタックリソースをロールバックする」と「新しく作成されたリソースをすべて削除する」を選択します。

他の項目は全てデフォルト値のまま変更しません。
「次へ」を押下し確認画面に遷移後、内容に問題なければ「送信」を押下しスタック作成を実行しましょう。

「送信」押下後、以下画面に遷移します。
画面左枠、スタック欄のステータス表示に注目します。
開始直後は「CREATE_IN_PROGRESS」ですが、作成が正常に完了すると「CREATE_COMPLETE」に変化します。

以上でスタックの作成は完了です。

作成されたリソースの確認

各種リソースが正常に作成されたことを確認しましょう。

  • EC2インスタンス(WebAP-test-EC2-CF)
    ・AMI:AmazonLinux2023
    ・インスタンスタイプ:t2.micro
    ・キーペア名:WebAP-test-KeyPair-CF

  • セキュリティグループ(WebAP-test-SG-CF)
    ・インバウンドルール:ポート範囲:80 ソース:0.0.0.0/0
    ・アウトバウンドルール:ポート範囲:すべて 送信先:0.0.0.0/0

  • Java(java-21-amazon-corretto-devel)
sh-5.2$ dnf list installed | grep java
java-17-amazon-corretto-headless.x86_64 1:17.0.13+11-1.amzn2023.1          @amazonlinux
java-21-amazon-corretto-devel.x86_64    1:21.0.5+11-1.amzn2023.1           @amazonlinux
java-21-amazon-corretto-headless.x86_64 1:21.0.5+11-1.amzn2023.1           @amazonlinux
javapackages-filesystem.noarch          6.0.0-7.amzn2023.0.6               @amazonlinux
javapackages-tools.noarch               6.0.0-7.amzn2023.0.6               @amazonlinux
  • Apache/Tomcat
パッケージ確認
sh-5.2$ dnf list installed | grep httpd
generic-logos-httpd.noarch              18.0.0-12.amzn2023.0.3             @amazonlinux
httpd.x86_64                            2.4.62-1.amzn2023                  @amazonlinux
httpd-core.x86_64                       2.4.62-1.amzn2023                  @amazonlinux
httpd-filesystem.noarch                 2.4.62-1.amzn2023                  @amazonlinux
httpd-tools.x86_64                      2.4.62-1.amzn2023                  @amazonlinux
sh-5.2$
sh-5.2$ dnf list installed | grep tomcat
tomcat-native.x86_64                    2.0.8-4.amzn2023.0.1               @amazonlinux
tomcat10.noarch                         1:10.1.34-1.amzn2023.0.1           @amazonlinux
tomcat10-el-5.0-api.noarch              1:10.1.34-1.amzn2023.0.1           @amazonlinux
tomcat10-jsp-3.1-api.noarch             1:10.1.34-1.amzn2023.0.1           @amazonlinux
tomcat10-lib.noarch                     1:10.1.34-1.amzn2023.0.1           @amazonlinux
tomcat10-servlet-6.0-api.noarch         1:10.1.34-1.amzn2023.0.1           @amazonlinux
tomcat10-webapps.noarch                 1:10.1.34-1.amzn2023.0.1           @amazonlinux
起動および自動起動設定確認
sh-5.2$ systemctl status httpd tomcat10
● httpd.service - The Apache HTTP Server
    Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
    Active: active (running) since Sun 2025-02-16 07:49:41 UTC; 1 day 5h ago
      Docs: man:httpd.service(8)
  Main PID: 26044 (httpd)
    Status: "Total requests: 314; Idle/Busy workers 100/0;Requests/sec: 0.00299; Bytes served/sec:   1 B/sec"
     Tasks: 230 (limit: 1111)
    Memory: 23.9M
       CPU: 1min 1.516s
    CGroup: /system.slice/httpd.service
            ├─26044 /usr/sbin/httpd -DFOREGROUND
            ├─26067 /usr/sbin/httpd -DFOREGROUND
            ├─26069 /usr/sbin/httpd -DFOREGROUND
            ├─26070 /usr/sbin/httpd -DFOREGROUND
            ├─26071 /usr/sbin/httpd -DFOREGROUND
            └─59569 /usr/sbin/httpd -DFOREGROUND

● tomcat10.service - Apache Tomcat 10 Web Application Container
    Loaded: loaded (/usr/lib/systemd/system/tomcat10.service; enabled; preset: disabled)
    Active: active (running) since Sun 2025-02-16 07:49:40 UTC; 1 day 5h ago
  Main PID: 26045 (java)
     Tasks: 29 (limit: 1111)
    Memory: 97.9M
       CPU: 1min 59.043s
    CGroup: /system.slice/tomcat10.service
            └─26045 /usr/lib/jvm/jre/bin/java -Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.ba>
lines 1-26/26 (END)

以上で各種リソースの作成確認および、パッケージのインストール確認完了です。
お疲れ様でした。

おわりに

記事としては簡素な内容でしたが、それだけ環境構築作業を簡略化できるという証左にもなったかと思います。
IaCの利用経験が浅い私にとっては特にその効果を実感できました。

次回はより発展版のIaCサービスである「AWS CDK」について記事を書こうと思っておりますので、よろしければまたご覧ください。

以上、ここまでお付き合いいただきありがとうございました。

Discussion