IaCの基礎【AWS CloudFormation】について基本を実践
はじめに
IaCについて学習中の身ではございますが、基礎的な範囲で実践してみた結果をアウトプットします。
また私と同じような初学者の方にとって、この記事が少しでもお力になれれば幸いです。
前提
今回CloudFormationのテンプレート内で記述する構成は、私の他記事で作成したWebAPサーバの構成をそのまま転用します。
内容についてご興味、ご不明点ありましたら、ぜひそちらの記事もご参照ください。↓
以下、構成の概要です。
項目名 | 設定値 |
---|---|
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で記述いたします。
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)
- Apache接続確認(http://パブリックIP:80)
以上で各種リソースの作成確認および、パッケージのインストール確認完了です。
お疲れ様でした。
おわりに
記事としては簡素な内容でしたが、それだけ環境構築作業を簡略化できるという証左にもなったかと思います。
IaCの利用経験が浅い私にとっては特にその効果を実感できました。
次回はより発展版のIaCサービスである「AWS CDK」について記事を書こうと思っておりますので、よろしければまたご覧ください。
以上、ここまでお付き合いいただきありがとうございました。
Discussion