在buildspec.yml中运行Python脚本时AWS CodeBuild报YAML_FILE_ERROR
解决AWS CodeBuild buildspec.yml的YAML语法错误
问题根源
你遇到的YAML_FILE_ERROR是因为在echo命令里直接写Python代码时,YAML解析器把代码中的冒号、特殊结构误判为YAML的键值分隔符,触发语法解析失败。
可行解决办法
方法1:用Here Document将Python代码写入文件后执行
这是最稳妥的方式,避免YAML解析特殊字符的问题,步骤如下:
在buildspec.yml的build阶段命令中,通过Here Document把Python代码写入临时文件,再执行该脚本:
version: 0.2 phases: build: commands: - | cat > send_email.py << 'EOF' import os import boto3 # 以下是你的SES发送邮件代码 def send_email(): ses_client = boto3.client('ses', region_name=os.environ['AWS_REGION']) # 补充你的邮件发送逻辑 response = ses_client.send_email( Source='sender@example.com', Destination={'ToAddresses': ['recipient@example.com']}, Message={ 'Subject': {'Data': 'Test Email from CodeBuild'}, 'Body': {'Text': {'Data': 'This is a test email.'}} } ) print(response) if __name__ == '__main__': send_email() EOF - python send_email.py
注意:
- 用
'EOF'(单引号包裹)可以防止YAML解析时替换代码中的环境变量或特殊字符 - 确保整个代码块的缩进和YAML结构匹配,统一用空格缩进(不能用制表符)
方法2:将Python脚本单独作为项目文件
把发送邮件的Python代码单独保存为send_email.py,放到CodeBuild构建的源码目录中,然后在buildspec.yml里直接执行:
version: 0.2 phases: build: commands: - python send_email.py
这种方式更利于代码维护,也完全规避了YAML解析多行代码的问题,推荐优先使用。
方法3:转义特殊字符(不推荐,仅适用于单行代码)
如果必须用echo单行写代码,需要对YAML敏感字符(比如冒号、大括号)进行转义,但多行代码转义会非常繁琐,示例:
- echo "import os\; import boto3\; ses_client = boto3.client('ses')" > send_email.py
这种方式仅适合极短的代码,不推荐用于完整的邮件发送脚本。
内容的提问来源于stack exchange,提问作者Yiffany
相关产品推荐
相关产品推荐

