Azure devops Azure DevOps Terraform任务能否使用存储帐户SAS令牌存储远程状态文件?

Azure devops Azure DevOps Terraform任务能否使用存储帐户SAS令牌存储远程状态文件?,azure-devops,azure-pipelines,terraform-provider-azure,Azure Devops,Azure Pipelines,Terraform Provider Azure,我正在尝试创建一个Azure DevOps管道,以在Azure中构建一个地形环境。我希望tfstate文件在Azure存储帐户中是远程的。如果您希望存储帐户保持可公开访问,那么有许多简单的示例可以这样做 但是我没有。我想使用SAS令牌限制对存储帐户的访问 然而,我的日子不好过: 在这个问题上寻找合理的参考 在管道yaml中查找任何有助于我定义sas令牌的内容 我的想法是,SAS令牌将是一个安全管道变量或变量组的一部分,然后将其插入管道yaml,然后传递到底层terraform 尝试脚本和Terr

我正在尝试创建一个Azure DevOps管道,以在Azure中构建一个地形环境。我希望tfstate文件在Azure存储帐户中是远程的。如果您希望存储帐户保持可公开访问,那么有许多简单的示例可以这样做

但是我没有。我想使用SAS令牌限制对存储帐户的访问

然而,我的日子不好过:

  • 在这个问题上寻找合理的参考
  • 在管道yaml中查找任何有助于我定义sas令牌的内容
  • 我的想法是,SAS令牌将是一个安全管道变量或变量组的一部分,然后将其插入管道yaml,然后传递到底层terraform

    尝试脚本和TerraformTaskV1构造的尝试失败。在init命令的管道构建过程中,我收到的最新错误是:

    错误:无法获取现有工作区:存储:服务返回错误:StatusCode=403,ErrorCode=AuthorizationFailure,ErrorMessage=未授权此请求执行此操作。

    我相信这告诉我sas令牌定义失败是因为它没有被应用。我已经在订阅中的VM中手动测试了令牌

    以下是当前的尝试:

    - task: ms-devlabs.custom-terraform-tasks.custom-terraform-release-task.TerraformTaskV1@0
        displayName: 'Terraform init'
        inputs:
          provider: 'azurerm'
          command: 'init'
          workingDirectory: '$(System.DefaultWorkingDirectory)/modules/terraform/basic-sastoken'
          backendServiceArm: $(service_connection)
          backendAzureRmResourceGroupName: $(resource_group_name)
          backendAzureRmStorageAccountName: $(storage_account_name)
          backendAzureRmContainerName: $(container_name)
          backendAzureRmKey: $(key)
          commandOptions: -input=false -var "sastoken=$(sas_token)"
    
    好的,那么我有什么选择呢


    这是一项不可能完成的任务吗?这是不是在狭窄的微软快乐之路之外不受支持?我需要建立自己的代理和规模集吗?那会有帮助吗。是否有合适的参考资料?

    请不要使用SAS令牌,而是使用服务主体来访问存储帐户。授予SP contributer在存储帐户上的权限,您就可以开始了

    steps:
    - task: ms-devlabs.custom-terraform-tasks.custom-terraform-release-task.TerraformTaskV1@0
      displayName: 'Terraform : init'
      inputs:
        workingDirectory: '$(System.DefaultWorkingDirectory)/<YOUR TERRAFORM FILES>'
        backendServiceArm: '<SERVICE CONNECTION YOU CREATED>'
        backendAzureRmResourceGroupName: '<RESOURCE GROUP YOUR STATE STORAGE ACCOUNT IS LOCATED'
        backendAzureRmStorageAccountName: <NAME OF STORAGE ACCOUNT WITH STATE>
        backendAzureRmContainerName: <CONTAINER NAME>
        backendAzureRmKey: '<TERRAFORM STATE KEY>'
    
    步骤:
    -任务:ms-devlabs.custom-terraform-tasks.custom-terraform-release-task。TerraformTaskV1@0
    displayName:'地形:初始'
    投入:
    工作目录:'$(System.DefaultWorkingDirectory)/'
    backendServiceArm:'
    
    backendAzureRmResourceGroupName:'您不使用SAS令牌的具体原因是什么。如果存储帐户上没有公共端点,我对该机制漠不关心。@garthoid您可以使用SAS令牌,但我们选择服务主体以将授权/身份验证方法的数量保持在最低限度。我们有一个Terraform服务主体,用于部署资源和访问。这是否适用于配置了专用端点的存储帐户?或者这是因为Azure DevOps不是Azure且位于单独的网络上且不是受信任的服务而被阻止的?如果您想从Azure DevOps执行任何涉及访问受保护服务的操作,您应该拥有自托管部署代理(VM)。每当您在DevOps中运行管道时,就会在您所在的区域中分配一个随机VM。有一个非常糟糕的解决方法,它涉及将Azure数据中心中的所有IP列入白名单。更好的解决方法是创建部署代理VM,并为您的资源创建私有端点。