在Azure DevOps管道中分配AWS Cloudformation输出变量

时间:2020-09-18 16:33:36

标签: azure-devops continuous-integration amazon-cloudformation azure-pipelines continuous-deployment

我的团队正在使用Azure Devops管道将Cloudformation堆栈部署到AWS。我们有重复使用的常见Cloudformation模板(例如,一个Lambda.yml Cloudformation模板可重复使用以部署多个Lambda函数)。

与此同时,我正在设置一个步进功能来协调逻辑流程。步骤功能步骤需要引用基础结构各个部分的ARN(在此示例中,重点是lambda函数)。

由于Lambda.yml被重用,因此每次任务重用模板部署新的lambda时,输出变量都会被覆盖。我想在Azure Devops中的变量或参数中捕获每个任务之后的输出。我看了无数的示例和有关变量的文档,但我无法使其正常工作。这里列出了Cloudformation模板和部署脚本的相关部分(YAML格式)。

Lambda.yml(Cloudformation模板)

FFI return struct/union is not implemented 

Deploy.yml(Azure Devops管道部署)

AWSTemplateFormatVersion: '2010-09-09'
Description: Template for Lambda function.
Parameters:
  FunctionName: 
    Description: The name of the Lambda function
    Type: String

Resources:
  LambdaFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: !Ref FunctionName
.....

Outputs:
  LambdaFunctionName:
    Description: Lambda function name
    Value: !Ref LambdaFunction
  LambdaFunctionARN:
    Description: Lambda ARN
    Value: 
      Fn::GetAtt:
        - LambdaFunction
        - Arn

1 个答案:

答案 0 :(得分:1)

您可以尝试在设置变量的位置命名step,然后将step的名称用作变量名的一部分。您甚至可以将变量名定义为模板参数,以便每次获得唯一的名称。在代码中可能看起来像这样:

template.yaml

class Player:
    def __init__(self, hp, image):
        self.hp = hp
        self.image = image #creating an instance variable
        self.pic = ImageTk.PhotoImage(self.image) #making an photoimage instance
        self.cv = Map.create_image(updatex, y, image = self.pic) #passing the photo image instance
        self.pic.image = self.pic #keeping a reference to the image

和主文件

parameters:
- name: name
  type: string
  default: 'lambdaNumbertOneFunctionName'
- name: arn
  type: string
  default: 'lambdaNumberOneFunctionArn'
- name: stepName
  type: string
  default: 'StepOne'
- name: value
  type: string
  default: 'testValue'

steps:
- bash: |
    echo "##vso[task.setvariable variable=${{ parameters.name }};isOutput=true]${{ parameters.value }}"
    echo "##vso[task.setvariable variable=${{ parameters.arn }};isOutput=true]${{ parameters.value }}"
    echo "##vso[task.setvariable variable=Test;isOutput=true]${{ parameters.value }}"
    echo "##vso[task.setvariable variable=Test2;isOutput=true]Yesy2"
  name: ${{ parameters.stepName }}

- script: |
    echo $(${{ parameters.stepName }}.${{ parameters.name }})
    echo $(${{ parameters.stepName }}.${{ parameters.arn }})
    echo $(${{ parameters.stepName }}.Test)
    echo $(${{ parameters.stepName }}.Test2)

为此,我得到了

jobs:
- job: myJob
  timeoutInMinutes: 10
  pool:
    vmImage: 'ubuntu-16.04'
  steps:
  - template: template.yaml
    parameters:
      name: 'lambdaNumbertOneFunctionName'
      arn: 'lambdaNumberOneFunctionArn'
      value: 'value-1'
      stepName: 'StepOne'
  - template: template.yaml
    parameters:
      name: 'lambdaNumberTwoFunctionName'
      arn: 'lambdaNumberTwoFunctionArn'
      value: 'value-2'
      stepName: 'StepTwo'
  - script: |
      echo 'lambdaNumbertOneFunctionName - $(StepOne.lambdaNumbertOneFunctionName)'
      echo 'lambdaNumberOneFunctionArn - $(StepOne.lambdaNumberOneFunctionArn)'
      echo 'lambdaNumberTwoFunctionName - $(StepTwo.lambdaNumberTwoFunctionName)'
      echo 'lambdaNumberTwoFunctionArn - $(StepTwo.lambdaNumberTwoFunctionArn)'

希望我能理解您和您的问题,并且能解决问题:)