Ошибка шаблона: для каждого объекта Fn :: GetAtt требуются два непустых параметра: имя ресурса и атрибут ресурса - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь развернуть шаблон CloudFormation для двух лямбд и эластичного IP-адреса.

Я не уверен, как исправить эту ошибку в моем шаблоне: Fn::GetAtt объект требует два непустых параметра

Не могли бы вы дать мне некоторые идеи, пожалуйста? Каковы некоторые рекомендации по отладке шаблона CloudFormation?

AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: 
Parameters:
  PrivateSubnets:
    Type: AWS::SSM::Parameter::Value<List<AWS::EC2::Subnet::Id>>
    Default: /vpc/subnets/private-ids
  VpcId:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::VPC::Id>
    Default: /vpc/id
  LogLevel:
    Type: String
    AllowedValues:
    - debug
    - warn
    - info
    - error
    - critical
    Default: debug
  Xray:
    Type: String
    AllowedValues:
    - Active
    - PassThrough
    Default: Active
Globals:
  Function:
    AutoPublishAlias: live
    Runtime: nodejs10.x
    Tracing:
      Ref: Xray
    Environment:
      Variables:
        NODE_ENV: production
        LOG_LEVEL:
          Ref: LogLevel
        ALB_ENDPOINT:
          Fn::GetAtt:
          - LoadBalancer
          - DNSName
        SECRETS_ID:
          Ref: ServiceSecrets
Resources:
  ServiceSecrets:
    Type: AWS::SecretsManager::Secret
    Properties:
      KmsKeyId:
        Fn::ImportValue: kms-default-key-id
      Description:
        Ref: AWS::StackName
      SecretString: '{ "refresh_token": "abc", "id_token": "abc" }'
  LambdaPolicyCommon:
    Type: AWS::IAM::ManagedPolicy
    Properties:
      Path: /
      PolicyDocument:
        Version: '2012-10-17'
        Statement:
        - Effect: Allow
          Action:
          - secretsmanager:GetSecretValue
          Resource:
            Ref: ServiceSecrets
        - Effect: Allow
          Action:
          - kms:GenerateDataKey
          - kms:Decrypt
          Resource:
            Fn::ImportValue: kms-default-key-arn
  LambdaFunctionCronJob:
    Type: AWS::Serverless::Function
    Properties:
      ReservedConcurrentExecutions: 1
      CodeUri: s3://s3bucket-881
      Handler: index.handler
      Timeout: 60
      Policies:
      - Ref: LambdaPolicyCommon
      - Fn::ImportValue: iam-policy-lambda-common-arn
      VpcConfig:
        SubnetIds:
          Ref: PrivateSubnets
        SecurityGroupIds:
        - Ref: LoadBalancerSecurityGroup
      Events:
        Cron:
          Type: Schedule
          Properties:
            Schedule: rate(1 minute)
  LambdaFunctionProxy:
    Type: AWS::Serverless::Function
    Properties:
      ReservedConcurrentExecutions: 1
      CodeUri: s3://cicd-buildartifactsbucket-3d345d2c
      Handler: index.handler
      Timeout: 60
      Policies:
      - Ref: LambdaPolicyCommon
      - Fn::ImportValue: iam-policy-lambda-common-arn
  LoadBalancer:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Scheme: internal
      Subnets:
        Ref: PrivateSubnets
      SecurityGroups:
      - Ref: LoadBalancerSecurityGroup
  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    DependsOn: AlbLambdaFunctionInvokePermission
    Properties:
      TargetType: lambda
      Targets:
      - Id:
          Fn::GetAtt:
          - LambdaFunctionCronJob
          - Alias
  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
      - TargetGroupArn:
          Ref: TargetGroup
        Type: forward
      LoadBalancerArn:
        Ref: LoadBalancer
      Port: 80
      Protocol: HTTP
  LoadBalancerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: group description
      VpcId:
        Ref: VpcId
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
  AlbLambdaFunctionInvokePermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName:
        Fn::GetAtt:
        - LambdaFunctionProxy
        - Alias
      Action: lambda:InvokeFunction
      Principal: elasticloadbalancing.amazonaws.com

Ответы [ 3 ]

3 голосов
/ 29 октября 2019

Попробуйте изменить:

Fn::GetAtt:
- LambdaFunctionProxy
- Alias

Кому:

Fn::GetAtt:
    - "LambdaFunctionProxy"
    - "Alias"
1 голос
/ 29 октября 2019

Из поддержки AWS

Для псевдонима безсерверной функции можно ссылаться как «Ref»: «MyLambdaFunction.Alias»

Поскольку для безсерверной функции облачная информация не принимает формат логического имени, имя атрибутаон находит атрибут «псевдоним» пустым и не разрешает его. Об этом нужно упомянуть так:

Properties:
FunctionName: !Ref LambdaFunctionProxyToHc.Alias
1 голос
/ 29 октября 2019

Вы должны использовать полное имя функции:

Fn::GetAtt: [ LoadBalancer, DNSName ]

или краткую форму:

!GetAtt LoadBalancer.DNSName

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html

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