我正在尝试使用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
堆栈已正确创建,我可以在输出中看到导出变量。
现在在下一个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
有人可以告诉我我在做什么错吗?
答案 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添加通知配置。