SecurityGroupをCloudFormationで取り扱う時に気をつけたいこと

CloudFormationでSecurityGroupのRef関数を使った時にハマったので、その備忘録です。

やりたかったこと

Ref関数を使った、SecurityGroupのグループIDアウトプットです。

Outputs:
  SecurityGroupEc2:
    Value: !Ref SecurityGroupEc2

実際に起こったこと

SecurityGroupのグループID、どこいった???グループ名が表示されている???

間違えたこと

VpcIdの設定を忘れました。

---
AWSTemplateFormatVersion: '2010-09-09'

Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id

Resources:
  # Security Group for EC2
  SecurityGroupEc2:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: !Sub "${AWS::StackName}-ec2-sg"
      GroupDescription: for alb
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: '0.0.0.0/0'
      VpcId: !Ref VpcId
      Tags:
        - Key: Name
          Value: !Sub "${AWS::StackName}-ec2-sg"

Outputs:
  SecurityGroupEc2:
    Value: !Ref SecurityGroupEc2

間違えていたのはわかったけど、セキュリティグループ名が表示されていたのはなぜ?と思い調べました。 

SecurityGroupの戻り値はセキュリティグループIDとは限らない

こういう時はまず、公式ドキュメントをあたって見ましょう。ズバリ答えが載っている場合があります。
今回はそのケースでした。

まず、SecurityGroupのVpcIdは、デフォルトVPCがある場合、省略が可能です。
省略するとデフォルトVPCのSecurityGroup所属になります。

AWS::EC2::SecurityGroup - AWS CloudFormation

そして、同ページにRef関数の戻り値についてもはっきりと記載されています。

AWS::EC2::SecurityGroup タイプを Ref 関数の引数として指定すると、AWS CloudFormation は、セキュリティグループ名またはセキュリティグループ ID (デフォルト VPC に含まれない EC2-VPC セキュリティグループの場合) を返します。

要するに、デフォルトVPCに属するセキュリティグループを作ったので、Ref関数の戻り値がセキュリティグループ名になったようです。こんな仕様だとは知りませんでした。

おわりに

VPCの設定し忘れにはお気をつけて。