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の設定し忘れにはお気をつけて。