AWS cloudformation无法导入导出变量的值

时间:2018-08-21 05:57:02

标签: amazon-s3 aws-lambda amazon-cloudformation

我正在尝试使用cloudformation yaml文件在AWS云中创建堆栈。

以下是我的第一个堆栈文件的摘要。在“输出”部分中,我将使用Lambda函数Arn的值创建导出变量。

Resources:
  FileTriggerFunction:
    Type: 'AWS::Lambda::Function'
    Properties:
      FunctionName:
        'Fn::Join':
          - '-'
          - - 'Fn::ImportValue': !Sub '${EnvironmentStackName}-EnvironmentId'
            - Arc
            - FileTrigger
      Description: ARC File Trigger for offline files
      Runtime: dotnetcore2.1
      MemorySize: 256
      Handler: >- Offline.FileTrigger::Offline.FileTrigger.TriggerFileHandler::ReadFileFromS3
      Role: !GetAtt FileTriggerLambdaRole.Arn
      VpcConfig:
        SecurityGroupIds:
          - !Ref FileTriggerSecurityGroup      
        SubnetIds:
          'Fn::Split':
            - ','
            - 'Fn::ImportValue': !Sub '${EnvironmentStackName}-PrivateSubnets'
      Timeout: 300
      Code: Offline.FileTrigger.zip
Outputs:
    FileTriggerLambdaFunction:
        Description: FileTrigger Lambda Function Arn
        Value: !GetAtt FileTriggerFunction.Arn   
        Export:
            Name: !Sub ${EnvironmentStackName}-FileTriggerFunctionArn

堆栈已正确创建,我可以在输出中看到导出变量。

Output of the created stack

现在在下一个cloudformation中,我试图使用ImportValue来获取值,类似这样。

  OfflineBucket:
    Type: 'AWS::S3::Bucket'
    Properties: 
        BucketName:
            'Fn::Join':
                - .
                - - offline-files
                  - !Ref LowerBusinessUnit
                  - 'Fn::Sub': '${LowerEnvStackName}'
        NotificationConfiguration:
          LambdaConfigurations:
            - Event: 's3:ObjectCreated:*'
            - Function: !ImportValue 
                          'Fn::Sub': '${EnvironmentStackName}-FileTriggerFunctionArn'

在创建第二个堆栈时,出现以下错误。

CREATE_FAILED   AWS::S3::Bucket OfflineBucket   Property Function cannot be empty.

看起来ImportValue无法从导出的变量中读取值。 我已经验证EnvironmentStackName是正确的。我也尝试过直接将变量名放进去,但仍然是相同的错误。

  OfflineBucket:
    Type: 'AWS::S3::Bucket'
    Properties: 
        BucketName:
            'Fn::Join':
                - .
                - - offline-files
                  - !Ref LowerBusinessUnit
                  - 'Fn::Sub': '${LowerEnvStackName}'
        NotificationConfiguration:
          LambdaConfigurations:
            - Event: 's3:ObjectCreated:*'
            - Function: !ImportValue ocsdebug-kd-environment-FileTriggerFunctionArn

有人可以告诉我我在做什么错吗?

2 个答案:

答案 0 :(得分:0)

根据official documentation of Fn::ImportValue函数:

重要

当包含!Sub时,不能使用!ImportValue的缩写形式。以下示例对AWS CloudFormation有效,但对YAML无效:

!ImportValue
  !Sub "${NetworkStack}-SubnetID" 

相反,必须使用完整的函数名,例如:

Fn::ImportValue:
  !Sub "${NetworkStack}-SubnetID"

答案 1 :(得分:0)

问题是NotificationConfiguration。在创建存储桶时,AWS CF不支持此功能。 因此,现在我只创建没有NotificationConfiguration的存储桶,以后再使用aws cli添加通知配置。