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执行命令:
如果用PowerShell执行命令:set AWS_EC2_METADATA_DISABLED=false terraform plan$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
相关产品推荐
相关产品推荐

