ParameterOverride CodePipeline 中的 Cloudformation ImportValue
Cloudformation ImportValue within ParameterOverride CodePipeline
问题:
我有一个 cloudformation 模板,它应该检索在 CodeCommit
中找到的代码并将其推送到 Lambda
。 CodeCommit
中的代码还包含一个带有一些参数的 SAM
模板。 SAM
模板具有以下设置
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Deploy Python code to Lambda
Parameters:
ArtifactsBucket:
Description: The artifact bucket to get the lambda code
Type: String
Name:
Description: Name of the lambda function
Type: String
SqsARN:
Description: AWS SQS Arn to act as a trigger for the lambda function
Type: String
...
和 CodePipeline
Cloudformation
模板具有以下内容以覆盖 SAM
模板中存在的 3 个参数。
...
- Name: Deploy
Actions:
- Name: Deploy
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: 1
Configuration:
ActionMode: CREATE_UPDATE
Capabilities: 'CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND,CAPABILITY_NAMED_IAM'
ChangeSetName: !Join
- '-'
- - lambda
- !Ref CodeCommitRepoName
ParameterOverrides: !Sub |
{
"ArtifactsBucket": "${ArtifactsBucket}",
"Name": "${CodeCommitRepoName}",
"SqsARN": {"Fn::ImportValue": "My-queue:us-east-1:Queue:Arn"}
}
...
ArtifactBucket
和 Name
参数很容易被 !Sub
函数更改,但我无法为 SqsARN
提供有效值,这是一个导入的值。
问题是否可以在 ParametersOverride
中包含 ImportValue
和 Sub
函数?
尝试我也尝试从
切换
{"Fn::ImportValue": "My-queue:us-east-1:Queue:Arn"}
至
!ImportValue": "My-queue:us-east-1:Queue:Arn"
这也没有用。删除 !Sub
函数并使用 !Ref
函数产生与 ImportValue
.
相同的 output/problem
要记住的关键是,在 YAML
中使用 JSON
You can't use the short form of !ImportValue when it contains a !Sub.
It is valid for AWS CloudFormation, but not valid
for YAML:
假设环境作为参数,这是 Sub >> ImportValue >> Sub 的工作示例
Value: !Sub
- '{
"sqsUrl": "${sqsUrl}",
}'
- {
sqsUrl: { 'Fn::ImportValue': { 'Fn::Sub': 'QueUrl-${Environment}' } }
}
将其应用于上面的示例可能如下所示(使用 ssm 进行测试)
Parameters:
Environment:
Type: String
Default: DV
ArtifactsBucket:
Type: String
Default: TestBucket
CodeCommitRepoName:
Type: String
Default: Test
Resources:
SmsLambdaParameter:
Type: 'AWS::SSM::Parameter'
Properties:
Name: !Sub
- '/${EnvFullUpper}/My-Param/Test'
- { EnvFullUpper: !Ref Environment }
Type: 'String'
Value: !Sub
- '{
"ArtifactsBucket": "${ArtifactsBucket}",
"Name": "${CodeCommitRepoName}",
"SqsARN": "${SqsArn}"
}'
- { SqsARN: { 'Fn::ImportValue': { 'Fn::Sub': 'QueueArn-${Environment}' } } }
可以使用数组形式 Fn::Sub:
!Sub
- String
- Var1Name: Var1Value
Var2Name: Var2Value
这将导致:
ParameterOverrides: !Sub
- |
{
"ArtifactsBucket": "${ArtifactsBucket}",
"Name": "${CodeCommitRepoName}",
"SqsARN": "${SqsARNImport}"
}
- SqsARNImport: !ImportValue <name-of-your-queue-export>
问题:
我有一个 cloudformation 模板,它应该检索在 CodeCommit
中找到的代码并将其推送到 Lambda
。 CodeCommit
中的代码还包含一个带有一些参数的 SAM
模板。 SAM
模板具有以下设置
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for Deploy Python code to Lambda
Parameters:
ArtifactsBucket:
Description: The artifact bucket to get the lambda code
Type: String
Name:
Description: Name of the lambda function
Type: String
SqsARN:
Description: AWS SQS Arn to act as a trigger for the lambda function
Type: String
...
和 CodePipeline
Cloudformation
模板具有以下内容以覆盖 SAM
模板中存在的 3 个参数。
...
- Name: Deploy
Actions:
- Name: Deploy
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: 1
Configuration:
ActionMode: CREATE_UPDATE
Capabilities: 'CAPABILITY_IAM,CAPABILITY_AUTO_EXPAND,CAPABILITY_NAMED_IAM'
ChangeSetName: !Join
- '-'
- - lambda
- !Ref CodeCommitRepoName
ParameterOverrides: !Sub |
{
"ArtifactsBucket": "${ArtifactsBucket}",
"Name": "${CodeCommitRepoName}",
"SqsARN": {"Fn::ImportValue": "My-queue:us-east-1:Queue:Arn"}
}
...
ArtifactBucket
和 Name
参数很容易被 !Sub
函数更改,但我无法为 SqsARN
提供有效值,这是一个导入的值。
问题是否可以在 ParametersOverride
中包含 ImportValue
和 Sub
函数?
尝试我也尝试从
切换{"Fn::ImportValue": "My-queue:us-east-1:Queue:Arn"}
至
!ImportValue": "My-queue:us-east-1:Queue:Arn"
这也没有用。删除 !Sub
函数并使用 !Ref
函数产生与 ImportValue
.
要记住的关键是,在 YAML
中使用 JSONYou can't use the short form of !ImportValue when it contains a !Sub. It is valid for AWS CloudFormation, but not valid for YAML:
假设环境作为参数,这是 Sub >> ImportValue >> Sub 的工作示例
Value: !Sub
- '{
"sqsUrl": "${sqsUrl}",
}'
- {
sqsUrl: { 'Fn::ImportValue': { 'Fn::Sub': 'QueUrl-${Environment}' } }
}
将其应用于上面的示例可能如下所示(使用 ssm 进行测试)
Parameters:
Environment:
Type: String
Default: DV
ArtifactsBucket:
Type: String
Default: TestBucket
CodeCommitRepoName:
Type: String
Default: Test
Resources:
SmsLambdaParameter:
Type: 'AWS::SSM::Parameter'
Properties:
Name: !Sub
- '/${EnvFullUpper}/My-Param/Test'
- { EnvFullUpper: !Ref Environment }
Type: 'String'
Value: !Sub
- '{
"ArtifactsBucket": "${ArtifactsBucket}",
"Name": "${CodeCommitRepoName}",
"SqsARN": "${SqsArn}"
}'
- { SqsARN: { 'Fn::ImportValue': { 'Fn::Sub': 'QueueArn-${Environment}' } } }
可以使用数组形式 Fn::Sub:
!Sub
- String
- Var1Name: Var1Value
Var2Name: Var2Value
这将导致:
ParameterOverrides: !Sub
- |
{
"ArtifactsBucket": "${ArtifactsBucket}",
"Name": "${CodeCommitRepoName}",
"SqsARN": "${SqsARNImport}"
}
- SqsARNImport: !ImportValue <name-of-your-queue-export>