Terraform 后端到 azure blob 存储错误

Posted

技术标签:

【中文标题】Terraform 后端到 azure blob 存储错误【英文标题】:Terraform back-end to azure blob storage errors 【发布时间】:2019-05-19 19:47:01 【问题描述】:

我一直在使用以下内容成功地在 Azure 存储中为 terraform 创建后端状态文件,但由于某种原因它停止工作。我已经回收了存储密码,尝试了两个密钥并每次都得到相同的错误

backend.tf

    terraform 
    backend "azurerm" 
        storage_account_name    = "terraformstorage"
        resource_group_name     = "automation"
        container_name          = "terraform" 
        key                     = "testautomation.terraform.tfstate"
        access_key              = "<storage key>"
    

错误返回

地形初始化 正在初始化后端... 成功配置后端“azurerm”! Terraform 将自动 除非后端配置更改,否则请使用此后端。 错误刷新状态:存储:服务返回错误:StatusCode=403,ErrorCode=AuthenticationFailed,ErrorMessage=Server 未能对请求进行身份验证。确保 Authorization 标头的值正确形成,包括签名。 请求编号:665e0067-b01e-007a-6084-97da67000000 时间:2018-12-19T10:18:18.7148241Z,RequestInitiated=Wed,2018 年 12 月 19 日 10:18:18 GMT,RequestId=665e0067-b01e-007a-6084-97da67000000,API 版本=,QueryParameterName=,QueryParameterValue=

任何想法我做错了什么?

【问题讨论】:

您的凭据似乎有误。您可以尝试通过其他机制访问 blob 存储中的状态文件吗? Azure 是否有一个有用的 CLI 工具可以用来测试这个? 嗨,ydaetskcoR,我可以使用“Azure 存储资源管理器”使用存储帐户名称和密钥成功连接到存储,这几乎是 terraform 使用的所有内容。只是为了增加混乱! 探索的另一个选项:确保 container_name 与用于生成 sas_token 的容器相匹配 【参考方案1】:

对我有用的是删除本地 .terraform 文件夹并重试。

【讨论】:

完美运行【参考方案2】:

另一个问题可能是时间分辨率。

我也遇到了这些问题,尝试了上述所有步骤,但没有任何帮助。

在我的系统(Windows 10、WSL2)上发生的事情是,WSL 失去了时间同步,而我的时间相隔数小时。 https://github.com/microsoft/WSL/issues/4245 中描述了此行为。

对我有帮助

在 WSL (sudo hwclock -s) 中获取适当的时间和

重启 WSL

希望,这也会对其他人有所帮助。

【讨论】:

这对我也有用。我只需要运行 hwclock -s,不需要重新启动。一看到命令,我只好翻白眼。这也给我造成了 Apache Airflow 的问题(通过运行相同的命令解决) - 原因是,当我的笔记本电脑进入睡眠状态时,WSL 也会打盹,所以会浪费时间。我可能只是在我的 bash 配置文件中创建一个脚本作为临时修复。 你也可以在主机中运行wsl -d docker-desktop hwclock -s 感谢@MaxiPalle,这也为我解决了这个问题。日期同步问题可能会导致很多问题。最糟糕的是它是间歇性的,所以我忘记了。我将sudo hwclock -s 附加到我的.profile 文件中,这样我就不会忘记这个问题,但是这个终端已经运行了一夜,所以我忘记了。【参考方案3】:

以下是一些建议:

运行:terraform init -reconfigure。 确认您的“terraform/backend”凭据。 如果您的 Terraform 包含一些“azurerm_storage_account/network_rules”以允许某些 IP 地址,或者确保您连接到正确的 *** 网络。 如果上述方法不起作用,请运行 TF_LOG=TRACE terraform init 以进一步调试。

【讨论】:

【参考方案4】:

请确保您已通过 Azure Cloud 的正确身份验证。

如果您在外部运行 Terraform,请重新运行:az login

如果您在实例上运行 Terraform,您可以使用 managed identities,或者通过定义以下环境变量:

ARM_USE_MSI=true
ARM_SUBSCRIPTION_ID=xxx-yyy-zzz
ARM_TENANT_ID=xxx-yyy-zzz

或者只是运行az login --identity,然后分配正确的角色(azurerm_role_assignment,例如“贡献者”)和适当的策略(azurerm_policy_definition)。

另见:

Azure Active Directory Provider: Authenticating using Managed Service Identity。 Unable to programmatically get the keys for Azure Storage Account。

【讨论】:

【参考方案5】:

应该有一个 .terraform 目录,您可以在其中运行 terraform init 命令。 删除 .terraform 或将其移至 Someotehr 名称。下次 terraform init 运行时,它将使用新的 init 重新创建该目录。

【讨论】:

重复***.com/a/55063132/533460

以上是关于Terraform 后端到 azure blob 存储错误的主要内容,如果未能解决你的问题,请参考以下文章

安全访问 Microsoft Azure Blob 存储

此处不应出现“azure_blob_fs_location”类型的块

JavaScript Azure Blob 存储移动 blob

使用 AspNet 从 Azure Blob 存储下载和重命名文件

terraform 模块依赖于 Azure

使用 Azure 市场的 Terraform