无法从Azure DevOps Pipeline YAML传参至CloudFormation YAML的问题
我在Azure DevOps Pipeline的yaml文件中无法将参数传递到CloudFormation的yaml文件,报错:
##[error]ValidationError: Parameters: [EnvironmentType] must have values
即EnvironmentType参数未成功传递。
azure-pipeline.yaml 配置
pool: name: AWS variables: ArtifactName: update-email stages: - stage: Build displayName: Build Stage ... - stage: DeployToDev displayName: 'Deploy To Dev' variables: EnvironmentType: 'dev' AwsCredentials: '${{ variables.EnvironmentType }}-xx' AwsRegion: 'eu-central-1' CodeBucket: 's3-$(EnvironmentType)-xx' BucketPrefix: 'xx-$(ArtifactName)' StackName: 'clf-$(EnvironmentType)-xx' jobs: - job: DeployToDev steps: ... - task: AmazonWebServices.aws-vsts-tools.CloudFormationCreateOrUpdateStack.CloudFormationCreateOrUpdateStack@1 displayName: 'Create/Update Stack: $(StackName)' inputs: awsCredentials: ${{ variables.AwsCredentials }} regionName: $(AwsRegion) stackName: $(StackName) templateFile: '$(ArtifactName)/clf-xx-$(EnvironmentType).yml' parameters: | EnvironmentType=$(EnvironmentType)
clf.yaml 配置
Parameters: EnvironmentType: Description: 部署环境类型 Type: String AllowedValues: - dev - prod Resources: xx: Type: AWS::Lambda::Function Properties: FunctionName: !Sub "lbd-${EnvironmentType}-xx" ...
已尝试的写法
1. 使用templateParameters字段
- task: AmazonWebServices.aws-vsts-tools.CloudFormationCreateOrUpdateStack.CloudFormationCreateOrUpdateStack@1 displayName: 'Create/Update Stack: $(StackName)' inputs: awsCredentials: ${{ variables.AwsCredentials }} regionName: $(AwsRegion) stackName: $(StackName) templateFile: '$(ArtifactName)/clf-xx-$(EnvironmentType).yml' templateParameters: | - ParameterKey: EnvironmentType ParameterValue: ${{variables.EnvironmentType}}
2. 在parameters字段使用ParameterKey格式
- task: AmazonWebServices.aws-vsts-tools.CloudFormationCreateOrUpdateStack.CloudFormationCreateOrUpdateStack@1 displayName: 'Create/Update Stack: $(StackName)' inputs: awsCredentials: ${{ variables.AwsCredentials }} regionName: $(AwsRegion) stackName: $(StackName) templateFile: '$(ArtifactName)/clf-xx-$(EnvironmentType).yml' parameters: | - ParameterKey: EnvironmentType ParameterValue: ${{variables.EnvironmentType}}
3. 设置templateParametersSource为inline
- task: AmazonWebServices.aws-vsts-tools.CloudFormationCreateOrUpdateStack.CloudFormationCreateOrUpdateStack@1 displayName: 'Create/Update Stack: $(StackName)' inputs: awsCredentials: ${{ variables.AwsCredentials }} regionName: $(AwsRegion) stackName: $(StackName) templateFile: '$(ArtifactName)/clf-xx-$(EnvironmentType).yml' templateParametersSource: inline templateParameters: - ParameterKey: EnvironmentType ParameterValue: 'dev'
第三种写法报错:A sequence was not expected,指向ParameterKey行。
我知道可以用SSM,但希望仅通过CloudFormationCreateOrUpdateStack任务解决问题。请问我是否遗漏了什么配置?该任务是否支持这种传参方式?
解决方案
1. 修正parameters字段的变量替换方式
原写法中使用运行时变量$(EnvironmentType),可以替换为编译期解析的模板表达式${{ variables.EnvironmentType }},确保参数在任务执行前就被正确注入:
parameters: | EnvironmentType=${{ variables.EnvironmentType }}
2. 正确使用templateParameters字段
当设置templateParametersSource: inline时,templateParameters需要传入JSON格式的字符串,而非YAML数组。修正后的写法如下:
- task: AmazonWebServices.aws-vsts-tools.CloudFormationCreateOrUpdateStack.CloudFormationCreateOrUpdateStack@1 displayName: 'Create/Update Stack: $(StackName)' inputs: awsCredentials: ${{ variables.AwsCredentials }} regionName: $(AwsRegion) stackName: $(StackName) templateFile: '$(ArtifactName)/clf-xx-$(EnvironmentType).yml' templateParametersSource: inline templateParameters: | [ { "ParameterKey": "EnvironmentType", "ParameterValue": "${{ variables.EnvironmentType }}" } ]
3. 确认变量作用域与替换时机
阶段级变量EnvironmentType使用${{ variables.EnvironmentType }}会在Pipeline编译阶段完成替换,而$(EnvironmentType)是运行时替换。如果任务运行时无法读取变量,优先使用模板表达式。
4. 验证模板文件的正确性
确保templateFile指向的CloudFormation模板中,Parameters部分确实定义了EnvironmentType,且没有拼写错误。
内容的提问来源于stack exchange,提问作者Mapotofu

