前提

・VPCが作成済みでリリースがエクスポートされていること
・CloudFormationのテンプレートをyaml形式とする。
・AWSの管理者ユーザで検証しています。
・AWS CloudShellよりCLI実行することでCloudFormationスタックを作成します。
・AWS CloudShellの使い方を割愛します。

VPCの作成について、下記のブログを参照
CloudFormationでVPC(NATGatewayを作成しない)を作成してみました。(AWS CloudShellよりCLI実行で作成)

SGのテンプレート

ALBのSG

AWSTemplateFormatVersion: '2010-09-09'
Description: KbyDev3-Tyo-Sg-Alb-Web01
Resources:
  KbyDev3TyoSgAlbWeb01:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: KbyDev3-Tyo-Sg-Alb-Web01
      GroupDescription: KbyDev3-Tyo-Sg-Alb-Web01
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
          Description: HTTP From AnyWhere
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: 0.0.0.0/0
          Description: HTTPS From AnyWhere

      Tags:
      - Key: Name
        Value: KbyDev3-Tyo-Sg-Alb-Web01
      - Key: Env
        Value: KbyDev3
      VpcId: !ImportValue KbyDev3-Tyo-Vpc
Outputs:
  KbyDev3TyoSgAlbWeb01:
    Value:
      Ref: KbyDev3TyoSgAlbWeb01
    Export:
      Name: KbyDev3-Tyo-Sg-Alb-Web01

EC2のSG(ALBのターゲットグループEC2用)

※直接SGのIDを記載する場合、下記のように記載する

        # - IpProtocol: tcp
        #   FromPort: 80
        #   ToPort: 80
        #   SourceSecurityGroupId: sg-xxxxxxxxxxxxxxxxx

ここでは、ImportValueを使って、ALBのSGのエクスポート名を参照しています。

AWSTemplateFormatVersion: '2010-09-09'
Description: KbyDev3-Tyo-Sg-Ec2-Web01
Resources:
  KbyDev3SgEc2Web01:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: KbyDev3-Tyo-Sg-Ec2-Web01
      GroupDescription: KbyDev3-Tyo-Sg-Ec2-Web01
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: '0.0.0.0/0'
          Description: SSH From AnyWhere
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          SourceSecurityGroupId: !ImportValue KbyDev3-Tyo-Sg-Alb-Web01
          Description: HTTP From Alb Web01

      Tags:
      - Key: Name
        Value: KbyDev3-Tyo-Sg-Ec2-Web01
      - Key: Env
        Value: KbyDev3
      VpcId: !ImportValue KbyDev3-Tyo-Vpc
Outputs:
  KbyDev3SgEc2Web01:
    Value:
      Ref: KbyDev3SgEc2Web01
    Export:
      Name: KbyDev3-Tyo-Sg-Ec2-Web01

SGの作成順番

1.ALBのSGを作成
2.EC2のSGを作成

※削除する場合、逆順になります。(削除する前に参照するリソースからデタッチしてください。)
1.EC2のSGを削除
2.ALBのSGを削除

SGの作成

CLIでスタックの作成手順

1.予め必要なファイルをAWS CloudShellにアップします。

2.テンプレートファイルとパラメーターファイルが存在していることを確認

[cloudshell-user@ip-10-0-135-137 ~]$ ll
total 8
-rw-rw-r-- 1 cloudshell-user cloudshell-user 872 Jul 31 06:24 KbyDev3-Tyo-Sg-Alb-Web01.yaml
-rw-rw-r-- 1 cloudshell-user cloudshell-user 905 Jul 31 06:23 KbyDev3-Tyo-Sg-Ec2-Web01.yaml

3.SG作成コマンド

コマンド:

aws cloudformation create-stack --template-body file://テンプレートファイル.yaml --stack-name [スタック名]

3-1 SGのスタック作成例(ALB用SGのスタック作成)

コマンド例:

[cloudshell-user@ip-10-0-135-137 ~]$ aws cloudformation create-stack --template-body file://KbyDev3-Tyo-Sg-Alb-Web01.yaml --stack-name KbyDev3-Tyo-Sg-Alb-Web01
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:887233683286:stack/KbyDev3-Tyo-Sg-Alb-Web01/c8a34f60-1099-11ed-bae9-0a1cc6ae8993"
}
[cloudshell-user@ip-10-0-135-137 ~]$ 

3-2 作成後の確認(ALB用SGのスタック作成)

イベント画面の確認

リソース画面の確認

EC2用SGテンプレートから参照する場合、下記赤枠のように記載する

3-3 SGのスタック作成例(EC2用SGのスタック作成)

[cloudshell-user@ip-10-0-135-137 ~]$ aws cloudformation create-stack --template-body file://KbyDev3-Tyo-Sg-Ec2-Web01.yaml --stack-name KbyDev3-Tyo-Sg-Ec2-Web01
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:887233683286:stack/KbyDev3-Tyo-Sg-Ec2-Web01/61bafb60-109c-11ed-a6c0-0e65a22044f3"
}
[cloudshell-user@ip-10-0-135-137 ~]$ 

3-4 作成後の確認(EC2用SGのスタック作成)

イベント画面の確認

リソース画面の確認

まとめ

テンプレートを利用する時、名前の命名ルールを自分の環境に読み替えでください。また、ssh接続時にCidrIp「’0.0.0.0/0’」を設定していますが、自分の環境に合わせて読み替えてください。
以前のブログでVPC作成した時にリソースをエクスポートしました。
今回、SGを作成する時にVPCのエクスポート名を参照して作成しています。
リソースIDが構築する時に都度変わるため、エクスポート名を使ったほうがらくになるかと思います。(特に頻繫に作り直す場合)

少しでもお役に立てれば幸いです。

参考

CloudFormation でよく使うAWS CLIコマンド

CloudFormationでVPC(NATGatewayを作成しない)を作成してみました。(AWS CloudShellよりCLI実行で作成)

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group-ingress.html

Last modified: 2022-07-31

Author