我希望用户传入一个完全合格的域名(FQDN),它不一定是AWS云的一部分。我要求FQDN对用户更友好(我知道要求IP会使这件事变得非常简单)。我想获取这个FQDN,计算它的IP,并在安全组入口CidrIp属性中使用该IP。
如何计算IP?
我的参数
Parameters:
FQDN:
Type: String #Pass in FQDN as a String
Description: The Fully Qualified Domain Name (FQDN) of your server我的安全组
SecurityGroup:
Type: AWS::EC2::SecurityGroup
DependsOn: Subnet
Properties:
GroupDescription: Security Group governing ingress and egress rules.
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 8443
ToPort: 8443
CidrIp: <IP of FQDN>/32发布于 2020-04-16 06:56:16
您可以使用lambda支持的自定义资源来实现这一点,lambda将接受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处理事件时,lambda可能看起来像这样
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(_, _):
passhttps://stackoverflow.com/questions/61235535
复制相似问题