この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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の設定し忘れにはお気をつけて。