【问题标题】:Template error: every Fn::GetAtt object requires two non-empty parameters, the resource name and the resource attribute模板错误:每个 Fn::GetAtt 对象都需要两个非空参数,资源名称和资源属性
【发布时间】:2019-10-30 04:37:24
【问题描述】:

我正在尝试为两个 lambdas 和一个弹性 IP 部署 CloudFormation 模板。

我不确定如何在我的模板中修复此错误: 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

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation


    【解决方案1】:

    尝试改变:

    Fn::GetAtt:
    - LambdaFunctionProxy
    - Alias
    

    收件人:

    Fn::GetAtt:
        - "LambdaFunctionProxy"
        - "Alias"
    

    【讨论】:

      【解决方案2】:

      您应该使用完整的函数名:

      Fn::GetAtt: [ LoadBalancer, DNSName ]
      

      或简称:

      !GetAtt LoadBalancer.DNSName
      

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

      【讨论】:

        【解决方案3】:

        来自 AWS 支持

        对于无服务器函数别名可以引用为“Ref”:“MyLambdaFunction.Alias”

        由于对于无服务器功能 cloudformation 不接受格式逻辑名称,属性名称它发现“别名”属性为空 它不能解决它 需要这样提及:

        Properties:
        FunctionName: !Ref LambdaFunctionProxyToHc.Alias
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-04-26
          • 2017-06-10
          • 1970-01-01
          • 2021-10-25
          • 2020-08-30
          • 2018-08-16
          • 2021-11-12
          • 1970-01-01
          相关资源
          最近更新 更多