【问题标题】:Can Azure DevOps Terraform Task can use a Storage Account SAS token to store remote state file?Azure DevOps Terraform Task 可以使用存储帐户 SAS 令牌来存储远程状态文件吗?
【发布时间】:2021-08-01 10:54:54
【问题描述】:

我正在尝试创建一个 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 之外是否不受支持?我需要构建自己的代理和规模集吗?这甚至会有所帮助。有没有像样的参考资料?

【问题讨论】:

    标签: azure-devops azure-pipelines terraform-provider-azure


    【解决方案1】:

    请不要使用 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>'
    

    使用您的值删除 &lt;&gt;。 关于服务连接,您可以在 DevOps 中创建它:)。

    【讨论】:

    • 您不使用 SAS 令牌的具体原因是什么。如果存储帐户上没有公共端点,我对这种机制漠不关心。
    • @garthoid 您可以使用 SAS 令牌,但我们选择服务主体以将授权/身份验证方法的数量保持在最低限度。我们有一个 Terraform 服务主体,我们也可以使用它来部署资源和访问。
    • 这是否适用于配置有专用终结点的存储帐户?还是因为 Azure DevOps 不是 Azure 并且在单独的网络上而不是受信任的服务而被阻止?
    • 如果你想从 Azure Devops 做任何涉及访问受保护服务的事情,你应该有一个自托管的部署代理 (VM)。每当您在 DevOps 中运行管道时,您都会在您所在地区分配一个随机 VM。有一个非常糟糕的解决方法,涉及将 Azure 数据中心的所有 IP 列入白名单。更好的解决方法是创建一个部署代理 VM 并为您的资源创建一个专用端点。
    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 2021-10-02
    • 2020-03-08
    • 2021-11-20
    • 2021-09-02
    • 2019-12-05
    • 2021-10-29
    • 1970-01-01
    相关资源
    最近更新 更多