AWS CloudFormation - Рассчитать IP из полного доменного имени, переданного через параметр - PullRequest
0 голосов
/ 15 апреля 2020

Я хочу, чтобы пользователи передавали полное доменное имя (FQDN), которое необязательно должно быть частью облака AWS. Я прошу полное доменное имя, чтобы оно было более удобным для пользователя (я знаю, что запросить IP сделает это очень просто). Я хочу взять это полное доменное имя, рассчитать его IP-адрес и использовать этот IP-адрес в свойстве CidrIp входной группы безопасности.

Как рассчитать 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

1 Ответ

0 голосов
/ 16 апреля 2020

Этого можно добиться с помощью пользовательского ресурса, поддерживаемого лямбда-выражением, лямбда примет параметр 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...