9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【30日でAWSをマスターするハンズオン問題集】Day7:CloudFormationを使って、EC2インスタンス上にWebサーバーを構築してみよう!

Last updated at Posted at 2025-12-01

概要

こちらの投稿は2025 Japan AWS Jr.Championsの有志メンバーで作成した『30日間で主要AWSサービスを構築できるようになる』をテーマにした初学者向けのハンズオン問題集のDAY7になります!
問題集の趣旨や作成に至るまでの経緯は以下の記事をご覧いただければと思います。

項目 内容
所要時間 約1時間
メインサービス CloudFormation, EC2
学べること CloudFormationの書き方、IaCの基本概念
想定費用 約10円(t2.microを1時間使用想定)

注意:今回CloudFormationのスタック削除まで行うため、ハンズオンを最後まで実施すればリソースの課金は継続しません。しかし、途中で離脱する等で、以下のリソースを削除し忘れると課金が継続します。

課題内容

CloudFormationテンプレートを使って、EC2インスタンス上にApacheウェブサーバーを自動構築し、簡単なHTMLページを表示するシステムを作成します。
CloudFormationを使うことで、インフラのコード化(IaC: Infrastructure as Code)の基本概念を学びます。

アーキテクチャ図

architecture-image

実装機能

  • CloudFormationテンプレートでEC2インスタンスを自動作成
  • UserDataを使ってApacheの自動インストール・起動
  • カスタムHTMLページの自動配置
  • セキュリティグループでHTTP(80番ポート)へのアクセス許可
  • Elastic IPによる固定IPアドレスの割り当て

💡実装のヒント

CloudFormationの基本構造

CloudFormationテンプレートは以下の基本構造を持ちます:

  • AWSTemplateFormatVersion: テンプレートのバージョン
  • Description: テンプレートの説明
  • Parameters: 入力パラメータ
  • Resources: 作成するAWSリソース
  • Outputs: 出力値
UserDataの活用

EC2インスタンス起動時にUserDataを使ってスクリプトを実行できます。
これを使ってApacheのインストールと設定を自動化しましょう。

セキュリティグループの設定

Webサーバーにアクセスするため、HTTP(80番ポート)とSSH(22番ポート)を許可する
セキュリティグループを作成する必要があります。

完成後のチェックポイント

  • CloudFormationスタックが正常に作成される
  • EC2インスタンスが起動している
  • Elastic IPが割り当てられている
  • ブラウザからEC2のパブリックIPにアクセスできる
  • カスタムHTMLページが表示される
  • CloudFormationスタック削除でリソースが完全に削除される

使用資材

CloudFormationテンプレート(webserver.yml)
AWSTemplateFormatVersion: '2010-09-09'
Description: 'EC2 instance with Apache web server'

Parameters:
  InstanceType:
    Description: EC2 instance type
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - t2.small
      - t2.medium

  KeyName:
    Description: Name of an existing EC2 KeyPair
    Type: AWS::EC2::KeyPair::KeyName
    ConstraintDescription: Must be the name of an existing EC2 KeyPair

Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for web server
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0

  WebServerInstance:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: !Ref InstanceType
      KeyName: !Ref KeyName
      ImageId: ami-000322c84e9ff1be2 # Amazon Linux 2 AMI (ap-northeast-1)
      SecurityGroupIds:
        - !Ref WebServerSecurityGroup
      UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          yum update -y
          yum install -y httpd
          systemctl start httpd
          systemctl enable httpd
          echo "<h1>Hello CloudFormation!</h1>" > /var/www/html/index.html
          echo "<p>This web server was created using CloudFormation.</p>" >> /var/www/html/index.html
          echo "<p>Instance ID: $(curl -s http://169.254.169.254/latest/meta-data/instance-id)</p>" >> /var/www/html/index.html

  WebServerEIP:
    Type: AWS::EC2::EIP
    Properties:
      InstanceId: !Ref WebServerInstance

Outputs:
  WebsiteURL:
    Description: URL of the website
    Value: !Sub 'http://${WebServerEIP}'
  PublicIP:
    Description: Public IP address of the web server
    Value: !Ref WebServerEIP

リファレンスリンク

解答・構築手順(クリックで開く)

解答と構築手順を見る

ステップ1:事前準備

  1. (既存のものがない場合)EC2キーペアを作成する
    • EC2 コンソール → キーペア → キーペアの作成
      ec2-key-pair

ステップ2:CloudFormationテンプレートの作成

  1. 使用資材webserver.ymlファイルを、コピー&ペーストするローカルに作成する
  2. (ap-northeast-1以外の場合)AMI IDを使用するリージョンに合わせて修正する

ステップ3:スタックのデプロイ

  1. AWSマネジメントコンソールを開く
  2. CloudFormationを検索し、移動する
  3. 「スタックの作成」→「新しいリソースを使用(標準)」を選択する
  4. テンプレートファイルをアップロード
    cloud-fomartion-settings-1
  5. パラメータを設定(キーペア名など)して次へ進む
    cloud-fomartion-settings-2
  6. スタックオプションの設定はデフォルトのまま次へ進む
    cloud-fomartion-settings-3
    cloud-fomartion-settings-4
    cloud-fomartion-settings-5
  7. 確認画面に進み、「スタックの作成」をクリックする
    cloud-fomartion-settings-6
    cloud-fomartion-settings-7
  8. スタックの作成が完了するまで待つ(数分かかります)
    cloud-fomartion-settings-8

ステップ4:リソースの確認

  1. CloudFormationコンソールでスタックの状態を見て、「CREATE_COMPLETE」になっていることを確認する
    ※もし「ROLLBACK_IN_PROGRESS」や「CREATE_FAILED」になっている場合は、CloudFormationのイベントタブでエラー内容を確認し、スタックを削除して再度ステップ3を実行してください。

  2. リソースタブを開き、作成されたリソースを確認する
    confirm-cloud-fomartion-1
    ※物理IDのリンクをクリックすると、各リソースの詳細画面に遷移できます。
    今回のアーキテクチャ図が、このテンプレートをデプロイするだけで実現できたのが確認できると思います!

  3. 「出力」タブからWebサイトのURLを取得する
    confirm-cloud-fomartion-2

ステップ5:動作確認

  1. 出力されたURLにブラウザでアクセスする
  2. 「Hello CloudFormation!」のページが表示されることを確認する
    confirm-ec2
  3. インスタンスIDが正しく表示されることを確認する

🧹 片付け(リソース削除)

  1. CloudFormationコンソールでスタックを選択
  2. 「削除」ボタンをクリック
  3. 削除の確認
    delete-stack
  4. スタックの状態が「DELETE_COMPLETE」になることを確認

CloudFormationを使うことで、スタックを削除するだけで、作成したすべてのリソースが自動で削除されます!(ここがIaCのいいところ!!)

※念のため、EC2コンソールでインスタンスが削除されていることを確認しておきましょう。
confirm-deleting-resources

デプロイ用コマンド より簡単にCloudFormationスタックを作成・削除するために、AWS CLIを使用することもできます。以下のコマンドを参考にしてください。 ※AWS CLIがインストールされ、設定されていることを前提としています。 ※`file://webserver.yml`は、ご自身のテンプレートファイルのパスに置き換えてください。 ※`HandsOnKey`は、ご自身のEC2キーペアの名前に置き換えてください。
# スタックの作成
aws cloudformation create-stack \
  --stack-name WebServerStack \
  --template-body file://webserver.yml \
  --parameters ParameterKey=KeyName,ParameterValue=HandsOnKey

# スタックの状態確認
aws cloudformation describe-stacks --stack-name WebServerStack

# スタックの削除
aws cloudformation delete-stack --stack-name WebServerStack

おつかれさまでした!

この課題では、完成後のチェックポイントに加えて、Infrastructure as Code (IaC) の基本概念自動化の重要性が分かればクリアです!
完成後のチェックポイントはクリアしたけど、「EC2インスタンスを立てるなら、わざわざCloudFormationを使わなくてもいいのでは?」と思う方もいらっしゃるのかなと思います。例えば、実務で「100台のインスタンスをコンソールから立ててください」という指示が降りてきたらいかがでしょうか?…少し気が遠くなりますよね。
もちろん手間もかかるし、手動構築となるので当然ミスも増えるかと思います。今回の課題では1台のEC2インスタンスを構築しましたが、CloudFormationを使うことで、複数のリソースを一括で管理・デプロイすることができます。
また、近年では生成AIの発展により、インフラ構築の自動化がますます重要になっています。
この課題を通じて、IaCの基本概念とCloudFormationの使い方を理解し、自動化の重要性を実感していただければ幸いです。
次回は応用編として、CloudFormationを使って、ALBやAuto Scalingを使った高可用性構成にも挑戦してみましょう!

9
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?