使用Makefile调用AWS-CLI时提示找不到配置文件Error 255
我之前也踩过这个坑!你明明在命令行里能正常执行AWS CloudFormation打包命令,但放到Makefile里用变量引用profile就报错The config profile (abc) could not be found,实在让人头疼对吧?下面给你分析几种可能的原因和对应的解决办法:
原因1:Makefile的子shell不继承当前Shell的环境变量
Makefile在执行命令时,会启动一个全新的子shell,这个子shell不会自动继承你当前终端里的所有环境变量——比如如果你自定义了AWS_CONFIG_FILE或者AWS_SHARED_CREDENTIALS_FILE路径,子shell里是读不到这些的,导致AWS CLI找不到你的配置文件。
解决办法:
- 方法一:在Makefile开头显式指定AWS配置文件路径(如果是默认路径可以省略,但加上更稳妥):
PROFILE = abc # 指定默认的AWS配置文件路径,如果你自定义过路径就改成你的路径 AWS_CONFIG_FILE ?= $(HOME)/.aws/config AWS_SHARED_CREDENTIALS_FILE ?= $(HOME)/.aws/credentials .PHONY: package package: aws cloudformation package \ --profile $(PROFILE) \ --template-file template.yaml \ --s3-bucket cfts \ --s3-prefix _temp \ --output-template-file _o.yaml
- 方法二:执行make命令时手动传递环境变量:
make package AWS_CONFIG_FILE=~/.aws/config AWS_SHARED_CREDENTIALS_FILE=~/.aws/credentials
原因2:Makefile命令的换行反斜杠后有多余空格
你用反斜杠\来换行拆分AWS命令时,一定要注意反斜杠后面不能有任何空格或制表符,必须直接换行。如果反斜杠后有空格,会导致命令被截断,--profile $(PROFILE)可能没被正确解析,看起来就像是找不到配置文件。
解决办法:
检查你的Makefile每一行的反斜杠,确保后面没有多余字符,修正后的代码如下:
PROFILE = abc .PHONY: package package: aws cloudformation package \ --profile $(PROFILE) \ --template-file template.yaml \ --s3-bucket cfts \ --s3-prefix _temp \ --output-template-file _o.yaml
原因3:变量展开出现问题
有时候Makefile的变量定义或展开可能出现意料之外的问题,比如变量名写错、定义时有特殊字符等。
解决办法:
先把变量替换成硬编码的值测试,看看能不能正常执行:
.PHONY: package package: aws cloudformation package \ --profile abc \ --template-file template.yaml \ --s3-bucket cfts \ --s3-prefix _temp \ --output-template-file _o.yaml
如果这个能成功,说明是变量PROFILE的问题,检查PROFILE = abc这一行,确保等号前后的空格没问题,或者有没有不小心加了引号之类的多余字符。
原因4:排查执行时的实际环境
如果上面的方法都没用,你可以在Makefile里加一些调试输出,看看执行时的变量和环境变量到底是什么:
PROFILE = abc .PHONY: package package: @echo "当前使用的PROFILE: $(PROFILE)" @echo "AWS配置文件路径: $(AWS_CONFIG_FILE)" @echo "AWS凭证文件路径: $(AWS_SHARED_CREDENTIALS_FILE)" aws cloudformation package \ --profile $(PROFILE) \ --template-file template.yaml \ --s3-bucket cfts \ --s3-prefix _temp \ --output-template-file _o.yaml
执行make package后,看看打印出来的信息是不是符合预期,这样就能快速定位到底是变量没传递对,还是环境变量的问题了。
内容的提问来源于stack exchange,提问作者Balu

