CloudFormationを使ってセキュリティグループを作成する方法

# CloudFromationとは
CloudFormationはプログラミング言語やYAML,JSONを使用してAWSリソースを構築出来るサービスです。
AWS環境をテンプレート化しておくことで、同じ環境を作成する時間を削減することができます。

今回はYAMLで作成していきますので、JSONに変換したい方は次の記事をご参照下さい。
<a href="https://qiita.com/kazunobu2211/items/49deda949e97ea86bbf4" rel="nofollow noopener" target="_blank">YAMLからJSONに変換する方法</a>

## 構成
![スクリーンショット 2022-11-26 18.38.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/0ad6391a-d508-4674-d548-3806f7036f46.png)


## 完成したテンプレート
```:テンプレート
AWSTemplateFormatVersion: 2010-09-09

Metadata:
  AWS::CloudFormation::Interface:
    ParameterGroups:
      -
        Label:
          default: SecurityGroup
        Parameters:
          - SgName1
          - VpcId
          - SgIngFromPort1
          - SgIngCidrIp1
          - SgIngFromPort2
          - SgIngCidrIp2

Parameters:
  SgName1:
      Type: String
      Default: 'SgName1'  

  VpcId:
      Type: AWS::EC2::VPC::Id
  
  SgIngCidrIp1:
      Type: String
      Default: '0.0.0.0/0'  

  SgIngFromPort1:
    Type: String
    Default: '80' 

  SgIngCidrIp2:
    Type: String
    Default: '0.0.0.0/0' 

  SgIngFromPort2:
    Type: String
    Default: '22' 

Resources:   
  InstanceSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Ref SgName1
      GroupDescription: Allow http to client host
      VpcId: !Ref VpcId
      # アウトバウンド設定（フルオープン）
      SecurityGroupEgress:
        - CidrIp: 0.0.0.0/0
          IpProtocol: -1
      # インバウンド設定
      SecurityGroupIngress:
        - CidrIp: !Ref SgIngCidrIp1
          FromPort: !Ref SgIngFromPort1
          IpProtocol: tcp
          ToPort: !Ref SgIngFromPort1
        - CidrIp: !Ref SgIngCidrIp2
          FromPort: !Ref SgIngFromPort2
          IpProtocol: tcp
          ToPort: !Ref SgIngFromPort2
```
## 構築手順
### １ スタックの新規作成 
AWS CloudFormation管理コンソールから、スタックの作成をクリックし、[新しいリソースを使用(標準)]を選択。
![スクリーンショット 2022-11-22 20.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/47bb1ae7-a91c-5f62-c620-850cc285d438.png)


### ２ テンプレートアップロード 
[スタックの作成]で、[テンプレートの準備完了]を選択し、[テンプレートファイルのアップロード]>
[ファイルの選択]で、テンプレートを選択。
![スクリーンショット 2022-11-22 20.45.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/6334bb44-c5c2-617e-656d-a71daadb9056.png)

### ３ パラメータ入力 
各パラメータを入力します。`スタックの名前は任意の名前を入れる`
![スクリーンショット 2022-11-26 18.45.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/393be6cd-63bd-231f-711d-d70b77614f1d.png)


#### パラメータの詳細
今回はSGのインバウンドをHTTPとSSHを許可する設定を想定しております。

|パラメータ名|用途|備考|
|-|-|-|
|SgName1|SGの名前|例:SG-EC2|
|VpcId|SGを配置するVPC|VPCIDをプルダウンで選択|
|SgIngFromPort1|インバウンドで許可するポート|例:80|
|SgIngCidrIp1|インバウンドで許可するCIDR|例:0.0.0.0/0|
|SgIngFromPort2|インバウンドで許可するポート|例:22|
|SgIngCidrIp2|インバウンドで許可するCIDR|例:0.0.0.0/0|

### 4 CloudFormation詳細設定 
次へを選択。`CloudFormationの詳しい設定について次の記事をご覧下さい。`
<a href="https://qiita.com/kazunobu2211/items/3fd42d5482a3331332d0#cloudformation%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90%E6%89%8B%E9%A0%86" target="_blank rel="nofollow noopener"">CloudFormationの詳しい設定について</a>

### 5 最終確認
最終確認を行い`送信`を選択
![スクリーンショット 2022-11-22 22.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/8ce53f29-daec-d456-5905-fb39a0001fda.png)

### 6 正常終了確認 
ステータスがCREATE_COMPLETEになったらスタック正常終了です。
![スクリーンショット 2022-11-26 19.36.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2983197/ca9bb975-563e-4856-024a-13a829ddfca5.png)


## 公式ドキュメント
<a href="https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html" target="_blank rel="nofollow noopener"">CloudFormation セキュリティグループ AWS公式ドキュメント</a>