微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在Azure DevOps管道中分配AWS Cloudformation输出变量

我的团队正在使用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

解决方法

您可以尝试在设置变量的位置命名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)'

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。