Этого можно добиться с помощью пользовательского ресурса, поддерживаемого лямбда-выражением, лямбда примет параметр FQDN, определит IP-адрес и вернет его для ссылки в ресурсе группы безопасности.
Например, Вот как может выглядеть CloudFormation (используя SAM для этого конкретного примера):
Transform: AWS::Serverless-2016-10-31
Parameters:
FQDN:
Type: String
Resources:
GetIpFromFqdnFunction:
Type: AWS::Serverless::Function
Properties:
Handler: main.handler
Runtime: python3.7
CodeUri: ./
GetIpFromFqdn:
Type: Custom::GetIpFromFqdn
Properties:
ServiceToken: !GetAtt GetIpFromFqdnFunction.Arn
FQDN: !Ref FQDN
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: SG allowing IP from given FQDN
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: !Sub ${GetIpFromFqdn}/32
И лямбда может выглядеть примерно так, используя crhelper для обработки событий
from crhelper import CfnResource
import socket
helper = CfnResource()
def handler(event, context):
helper(event, context)
@helper.create
@helper.update
def get_ip_from_fqdn(event, _):
fqdn = event['ResourceProperties']['FQDN']
ip = socket.gethostbyname(fqdn)
return ip
@helper.delete
def no_op(_, _):
pass