You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeBuild Windows镜像中Terraform无法访问实例默认配置文件咨询

问题根因

核心原因是aws/codebuild/windows-base:2019-2.0官方镜像默认设置了系统级环境变量AWS_EC2_METADATA_DISABLED=true。
所有官方AWS SDK(包括Terraform用的AWS Provider)读取到这个变量时,会直接跳过EC2实例元数据服务(IMDS)的凭证检索环节。Ubuntu、Amazon Linux等CodeBuild托管镜像默认没有加这个环境变量,SDK会按默认凭证链走到IMDS环节,自动拉取CodeBuild绑定的实例配置文件对应的临时凭证,所以不会有问题。

解决方案

按优先级从高到低尝试,不需要拆分构建部署流程:

  • 会话级覆盖环境变量(90%以上的场景改完就好)
    不要修改系统级环境变量,只需要在执行Terraform命令的当前构建会话里把变量值改为false即可,完全不影响.NET 6的构建逻辑:
    如果用cmd执行命令:
    set AWS_EC2_METADATA_DISABLED=false
    terraform plan
    
    如果用PowerShell执行命令:
    $env:AWS_EC2_METADATA_DISABLED = "false"
    terraform plan
    
  • 显式配置Terraform AWS Provider的元数据检查(兜底方案,避免凭证链干扰)
    如果改完环境变量还是偶发读不到凭证,可以在Provider配置里强制开启元数据API检查,跳过其他无效凭证源的检索:
    provider "aws" {
      region                  = "你的目标部署区域"
      skip_metadata_api_check = false
    }
    
  • 角色配置校验
    如果前两步操作完还是报权限错误,检查CodeBuild项目绑定的服务角色:
    • 角色信任策略的可信实体必须包含codebuild.amazonaws.com
    • 角色不要绑定强制MFA校验的策略,CodeBuild运行时无法完成交互MFA验证
    • 角色附带的权限策略要覆盖Terraform脚本要操作的所有AWS资源权限
补充说明

这个镜像本身已经预装了.NET 6.0的SDK和运行时,完全可以在同一个构建任务里先执行dotnet publish完成项目编译,再执行Terraform相关命令,不需要拆分构建、部署为两个独立流程。

踩坑提示:不要用PowerShell的[Environment]::SetEnvironmentVariable命令修改机器级环境变量,会触发Windows镜像的内置系统文件保护,导致后续构建步骤随机异常,会话级变量设置完全足够生效。

内容的提问来源于stack exchange,提问作者Ajaxe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:39:15