Glueジョブの自己参照インバウンドルールに苦しめられている同士へ

## 初めに
業務でGlueジョブのセキュリティグループを作成しようとした際に、「自己参照インバウンドルール」なるものに苦しめられ半日を溶かしたので、備忘録として残そうと思います。

Glueジョブのセキュリティグループ作成につまずいている同士のお役にたてれば幸いです。


## 自己参照インバウンドルールって何？
### 公式のドキュメントを見てみる
公式のドキュメントには以下のように記載してあります。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/setup-vpc-for-glue-access.html

> AWS Glue がコンポーネントと通信できるようにするには、すべての TCP ポートに対して自己参照のインバウンドルールを持つセキュリティグループを指定します。自己参照ルールを作成することで、ソースをすべてのネットワークではなく VPC 内の同じセキュリティグループに制限することができます。

日本語で書いてある気がするのですが、全く理解できませんした。

### 作成に成功した今だからわかる答え
自己参照インバウンドルールとは、「ソースが自セキュリティグループであるインバウンドルール」の事でした。
実際に作成してみると画像の赤丸のようにソースと自セキュリティグループIDが一致していることが分かります。
![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545896/4843c2e8-f7a1-76de-ac5a-0bd0cd34fef1.jpeg)


## CloudFormationでGlueジョブのセキュリティグループを作成する
実際にCloudFormationを用いてGlueジョブのセキュリティグループを作成します。
自己参照インバウンドルールに関して
なんとなく分かったから実際につくってみたい！という方や
全然よく分かんないけどとりあえず急ぎでつくりたい！という方に参考にしていただければと思います。

### 作成するリソース
* VPC：test-vpc
    * セキュリティグループのデプロイに必要なので作成します
* セキュリティグループ：test-sg-glue
    * 下記のインバウンドルールとアウトバウンドルールを持ちます
* インバウンドルール
    * タイプ：すべてのTCP
    * プロトコル：TCP
    * ポート範囲：0 - 65535
    * ソース：上記セキュリティグループ
* アウトバウンドルール
    * タイプ：すべてのトラフィック
    * プロトコル：すべて
    * ポート範囲：すべて
    * 送信先：0.0.0.0/0

### CloudFormationテンプレート
``` SgGlue.yaml
AWSTemplateFormatVersion: "2010-09-09"

Resources:
  # ---------- Network Resources ----------
  # VPC
  TestVpc:
    Type: "AWS::EC2::VPC"
    Properties:
      CidrBlock: "10.0.0.0/16"
      InstanceTenancy: default
      EnableDnsSupport: "true"
      EnableDnsHostnames: "true"
      Tags:
        - Key: Name
          Value: test-vpc
  # セキュリティグループ
  SgGlue:
    Properties:
      GroupDescription: Security Group to allow connection to the application
      GroupName: test-sg-glue
      Tags: 
        - Key: Name
          Value: test-sg-glue
      VpcId:
        Ref: TestVpc
    Type: AWS::EC2::SecurityGroup
  # インバウンドルール
  SgGlueIngress:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      GroupId:
        Fn::GetAtt: SgGlue.GroupId
      IpProtocol: tcp
      FromPort: "0"
      ToPort: "65535"
      # 今回の肝はここ!!ソースに自セキュリティグループのセキュリティグループIDを指定しています。
      SourceSecurityGroupId:
        Fn::GetAtt: SgGlue.GroupId
  # アウトバウンドルール
  SgGlueEgress:
    Properties:
      CidrIp: 0.0.0.0/0
      Description: Outbound connection to the VPC
      # FromPortとToPortに-1を指定することで、「すべてのポート」を表現できます。
      FromPort: -1
      ToPort: -1
      GroupId:
        Fn::GetAtt: SgGlue.GroupId
      # IpProtocolに-1を指定することで「すべてのプロトコル」を表現できます。
      IpProtocol: '-1'
    Type: AWS::EC2::SecurityGroupEgress
```

### デプロイしてみる
AWSのWEBコンソールのCloudFormationサービスから「スタックの作成」を押し、スタックを作成してみます。
![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545896/155df3ce-05bd-3d1c-7760-169c8b699e64.png)

VPCの「セキュリティグループ」から作成したリソースを確認してみます。
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545896/d7f7c898-21c5-40ac-31be-a018b147f12e.jpeg)

インバウンドルール・アウトバウンドルールも正しく設定されていることが確認できました！！
![003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545896/5910e109-0c38-454a-853a-6e98ebdd69ea.png)
![004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545896/39f9e28c-cb56-08b0-5a62-a39b8434e5c2.png)





## まとめ
つくってるときは難しく感じるけど、つくり終えてみたら意外と簡単なものって多いですよね。



また今回はCloudFormationのテンプレートをYAML形式で作成していますが、Visual Studio CodeのプラグインでYAML⇔JSON変換もできるそうなので（試してはいません）、JSON派の方も参考にしていただければと思います。
https://bsblog.casareal.co.jp/archives/4936

![004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545896/bf9fac03-0ba2-552a-b116-747f0a4492b4.png)