通过S3部署Python版AWS Synthetics Canary遇加载失败求助
问题分析与解决方案
核心问题定位
- Terraform参数配置错误:
aws_synthetics_canary的s3_key参数误用了aws_s3_object的id字段(格式为bucket/key),但该参数仅需传入S3对象的键(Key),不需要包含bucket名称。 - 执行角色权限缺失:Canary的执行角色未被授予读取S3代码包的权限,导致无法拉取脚本文件到运行环境。
- 脚本语法瑕疵:代码中
__name_少了一个下划线,会引发运行时语法错误(虽不是当前模块找不到的直接原因,但需修正)。
具体修复步骤
1. 修正Terraform的S3路径配置
将aws_synthetics_canary中的s3_key字段从aws_s3_object.function_archive_upload.id改为aws_s3_object.function_archive_upload.key:
resource "aws_synthetics_canary" "canary_api_calls" { # 保留原有其他配置 s3_bucket = module.assets_s3.canary_reports_bucket_id s3_key = aws_s3_object.function_archive_upload.key # 仅传入S3对象的键 # 保留原有其他配置 }
2. 为执行角色添加S3读取权限
给Canary的执行角色添加读取代码包所在S3路径的权限,示例IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-canary-bucket/functions/${aws:accountId}/${aws:region}/your-canary-name/function.zip" } ] }
如果用Terraform管理IAM角色,可通过aws_iam_role_policy_attachment或内嵌策略完成权限配置。
3. 确认代码包结构
你的压缩包结构是合规的(根目录直接包含canary.py),无需调整。注意压缩时不要将脚本嵌套在子文件夹内。
4. 修正Python脚本语法错误
将__name_改为__name__,避免运行时异常:
_LOGGER = logging.getLogger(__name__) # 修正下划线数量
验证操作
- 重新执行
terraform apply,确保配置更新生效。 - 查看Canary UI的“Canary script”区域,确认加载错误消失。
- 手动触发Canary运行,检查日志是否不再出现
ModuleNotFoundError。
内容的提问来源于stack exchange,提问作者Dustin Oprea
相关产品推荐
相关产品推荐

