экспорт выходных данных в облачную информацию с использованием настраиваемых ресурсов с лямбда-выражением - PullRequest
2 голосов
/ 14 июля 2020

Я запустил шаблон CFN, используя пользовательские ресурсы для экспорта имени частной размещенной зоны route53. Мне удалось экспортировать имя hostedzonename, как я хотел, но я не могу импортировать это имя hostedzonename в другой стек. Я получаю эту ошибку:

Value of property HostedZoneName must be of type String

Любая помощь приветствуется. Спасибо. вот мой код.

AWSTemplateFormatVersion: 2010-09-09
Description: CloudFormation exports


Resources:
  LambdaExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Principal:
            Service:
            - lambda.amazonaws.com
          Action:
          - sts:AssumeRole
      Path: "/"
      Policies:
      - PolicyName: root
        PolicyDocument:
          Version: '2012-10-17'
          Statement:
          - Effect: Allow
            Action:
            - "logs:CreateLogGroup"
            - "logs:CreateLogStream"
            - "logs:PutLogEvents"
            - "route53:Get*"
            - "route53:List*"
            - "route53:TestDNSAnswer"
            Resource: "*"
  GetCertARN: 
    Type: "AWS::Lambda::Function"
    DeletionPolicy: Delete
    DependsOn:
      - LambdaExecutionRole
    Properties: 
      Handler: "index.handler"
      Role: 
        Fn::GetAtt: 
          - "LambdaExecutionRole"
          - "Arn"
      Runtime: "python3.7"
      MemorySize: 128
      Timeout: 100
      Code: 
        ZipFile: |
          import boto3
          import botocore
          import cfnresponse
          route53 = boto3.client('route53')
          def handler(event, context):
            hostedZoneName=''
            response2 = route53.list_hosted_zones()
            f=response2['HostedZones']
            for zone in f:
                config=zone["Config"]
                name=zone["Name"]
                e=config["PrivateZone"]
                if ('abcxyz.cloud' in name) and e:
                    hostedZoneName=name
            responseData = {}
            responseData['hostedzonename'] = hostedZoneName
            cfnresponse.send(event, context, cfnresponse.SUCCESS, responseData)
  CertArnInvocation:
    Type: Custom::CertArn
    Properties:
      ServiceToken: !GetAtt GetCertARN.Arn
      Region: !Ref "AWS::Region"

Outputs:
  ExportsStackName:
    Value: !Ref 'AWS::StackName'
    Export:
      Name: !Sub '${AWS::StackName}'

  HostedZoneNameOutput: 
    Value: !GetAtt CertArnInvocation.hostedzonename
    Description: Return Value of private hosted zone name
    Export: 
      Name: !Sub 'nonProdHostedZoneName'

1 Ответ

1 голос
/ 14 июля 2020

Вы экспортируете HostedZoneNameOutput под именем nonProdHostedZoneName:

    Export: 
      Name: !Sub 'nonProdHostedZoneName'

Но похоже, что вы импортируете (не показано) значение с именем HostedZoneName.

Обновить на основе комментариев (HostedZoneName было списком, а не строкой). Исправленная версия:

HostedZoneName: !ImportValue nonProdHostedZoneName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...