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 令牌限制对存储帐户的访问。
然而我很难过:
- 找到关于这个主题的合理参考。
- 找到任何可以帮助我在管道 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中创建:).
我正在尝试创建 Azure DevOps 管道以在 Azure 中构建 Terraform 环境。我希望 tfstate 文件在 Azure 存储帐户中是远程的。如果您希望存储帐户保持可公开访问,有很多简单的示例可以执行此操作。
然而我没有。我想使用 SAS 令牌限制对存储帐户的访问。
然而我很难过:
- 找到关于这个主题的合理参考。
- 找到任何可以帮助我在管道 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中创建:).