CloudFormationでEC2インスタンスとセキュリティグループを作成してみた

2021.11.01

こんにちは、イムチェジョンです。
最近、CloudFormationを勉強しています。CloudFormationは簡単にAWSリソースを作成できる便利なサービスです。
今回のブログではCloudFormationを利用してEC2インスタンスとセキュリティグループを作成し、セキュリティグループをEC2インスタンスに設定するのをまとめます。

アジェンダ

  1. テンプレートファイル作成 (YAML)
  2. スタック生成
  3. まとめ

1. テンプレートファイル作成 (YAML)

CloudFormationのテンプレートファイル作成はJSONまたはYAMLで作成します。
今回はYAMLでテンプレートファイルを作成します。

1-1. EC2インスタンス

EC2インスタンスの作成方法は下のブログにまとめたので、参考してください。

Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
        ImageId: ami-0e4a9ad2eb120e054
        InstanceType: t2.micro

1-2. セキュリティグループ

次は、セキュリティグループをテンプレートファイルに作成してみましょう。
下のドキュメントで作成方法及び詳細情報が確認できます。

セキュリティグループの生成

実際に作成をしてみました。下のテンプレートには以下の内容が含まれています。

SSHSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
        SecurityGroupIngress:
            - IpProtocol: tcp
            FromPort: 22
            ToPort: 22
            CidrIp: 0.0.0.0/0
  • SSHSecurityGroupという新しいリソースを作成する
  • SSHSecurityGroupのリソースタイプはAWS::EC2::SecurityGroup(EC2 Security Group)にする
  • SSHSecurityGroupプロトコルtcpに設定する
  • SSHSecurityGroupポート範囲22にする
  • SSHSecurityGroupソース0.0.0.0/0に設定する

セキュリティグループにEC2インスタンスに設定

テンプレートにセキュリティグループの生成できるように作成しましたので、作成したセキュリティグループをEC2インスタンスに設定してみましょう。
設定する時にはRef関数を使います。

Ref 組み込み関数

EC2インスタンスのテンプレートのSecurityGroups部分にRef関数を使い、上で作成したSSHSecurityGroupを指定します。
これでEC2インタンスのリソースを生成する時に、セキュリティグループとしてSSHSecurityGroupが設定されます。

Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
        ImageId: ami-0e4a9ad2eb120e054
        InstanceType: t2.micro
        SecurityGroups:
            - !Ref  SSHSecurityGroup

1-3. Descriptionの設定

今回はDescription(説明)も追加で作成します。
Descriptionは単語のそのままスタックまたはリソースの説明を言います。

スタックの説明はこのように書けます。

Description: EC2 instance, Security Group

または、Security Groupのリソースを作成する時にPropertiesGroupDescription部分にリソースの説明を書けます。

SSHSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
            GroupDescription: Enable SSH access via port 22
            SecurityGroupIngress:
                - IpProtocol: tcp
                FromPort: 22
                ToPort: 22
                CidrIp: 0.0.0.0/0

1-4. 完成したテンプレートファイル

上のEC2インスタンス、セキュリティグループ、Descriptionまで含んだテンプレートです。
3つのリソースを作成します

  • Ec2Instance: EC2インスタンス
  • SSHSecurityGroup: Security Group (SSH)
  • HTTPSecurityGroup: Security Group (HTTP)
Description: The template is EC2 instance, Security Group

Resources:
    # EC2 instance
    Ec2Instance:
        Type: AWS::EC2::Instance
        Properties:
            ImageId: ami-0e4a9ad2eb120e054
            InstanceType: t2.micro
            SecurityGroups:
                - !Ref  SSHSecurityGroup
                - !Ref  HTTPSecurityGroup

    # Security Group
    SSHSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
            GroupDescription: Enable SSH access via port 22
            SecurityGroupIngress:
                - IpProtocol: tcp
                FromPort: 22
                ToPort: 22
                CidrIp: 0.0.0.0/0

    HTTPSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
            GroupDescription: HTTP access port 80
            SecurityGroupIngress:
                - IpProtocol: tcp
                FromPort: 80
                ToPort: 80
                CidrIp: 0.0.0.0/0

2. スタック生成

テンプレートファイルの作成ができたら、次はCloudFormationにテンプレートをアップロードしてスタックを実行してみましょう。

スタック生成

実際にスタックを生成してみます。

新しいリソースを使用 (標準)をクリックして新しいスタックを生成します。

テンプレートの準備 : テンプレートの準備完了を選択
テンプレートソース : テンプレートファイルのアップロードを選択
テンプレートとしてアップロードするファイルを選択します。

スタックの名前はec2-sgに設定します。

オプションは何も設定しません。

最後にレビューを確認してみると、上で追加したDescriptionの内容がスタックの説明として書いています。
それ以外に内容を確認して[スタックの作成]をクリックすると、スタックが作成されます。

リソースの確認

作られたリソースを確認してみましょう。
まず、[スタックの情報]の説明で上で確認したDescriptionの内容がスタックの説明として書いています。

リソースはEC2インスタンスと2つのセキュリティグループがあります。

EC2インスタンスから確認してみると、実際にインスタンスが生成されてタグでもCloudFormationのスタックで作成されたのを確認できます。

次は、EC2インスタンスの[セキュリティ]に設定されているセキュリティグループを確認できますが、テンプレートでRef関数を使って設定したように二つのセキュリティグループが追加されています。

セキュリティグループも確認してみましょう。
二つのセキュリティグループが作成されました。
テンプレートで設定したようにSSHとHTTPによく設定されています。

これでEC2インスタンスとセキュリティグループの作成がよくされたのが確認できます。

3. まとめ

今回はCloudFormationを利用してEC2とセキュリティグループを作成、設定するのをまとめてみました。CloudFormationを使うと、いろんなサービスの作成と設定を一気にできるので便利でした!