Azure DevOps Terraform Task 可以使用存储帐户 SAS 令牌来存储远程状态文件吗?

Can Azure DevOps Terraform Task can use a Storage Account SAS token to store remote state file?

我正在尝试创建 Azure DevOps 管道以在 Azure 中构建 Terraform 环境。我希望 tfstate 文件在 Azure 存储帐户中是远程的。如果您希望存储帐户保持可公开访问,有很多简单的示例可以执行此操作。

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

然而我很难过:

  1. 找到关于这个主题的合理参考。
  2. 找到任何可以帮助我在管道 yaml 中定义 sas 令牌的东西。

我的想法是 SAS 令牌将是一个安全管道变量或变量组的一部分,然后将其插入到管道 yaml 中,然后传递给底层 terraform。

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

Error: Failed to get existing workspaces: storage: service returned error: StatusCode=403, ErrorCode=AuthorizationFailure, ErrorMessage=This request is not authorized to perform this operation.

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

这是当前的尝试:

- 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)"

好的,那我有什么选择?

这是不可能完成的任务吗?这在狭窄的 Microsoft Happy Path 之外不受支持吗?我是否需要构建自己的代理和规模集?那会有帮助吗?有什么好的参考资料吗?

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

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>'

用您的值删除 <>。 关于服务连接,可以在DevOps中创建:).