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

AWS Lambda Python函数报RuntimeWarning及Confluence页面创建故障排查

排查你的Python Lambda函数报错问题

从你提供的代码和部署细节来看,大概率是这几个点导致了CloudWatch报错,咱们逐个排查修复:

1. PyConfluence客户端未初始化就调用

你直接用了pyco.api.rest()和pyco.get_page_content(),但PyConfluence需要先配置你的Confluence实例地址和认证信息才能正常工作,否则会抛出未初始化的异常。

修复方案:在lambda_handler最开头添加初始化代码(记得替换成你的Confluence域名):

# 初始化PyConfluence客户端
pyco.CONFLUENCE_URL = "https://你的confluence域名.atlassian.net/wiki"
pyco.CONFLUENCE_USER = os.environ["PYCONFLUENCE_USER"]
pyco.CONFLUENCE_TOKEN = os.environ["PYCONFLUENCE_TOKEN"]

2. 字符串替换用了Python 2的旧写法

你用了string.replace(content, "PK-200", event['issue_key']),但Python 3中已经移除了全局的string.replace方法,直接调用会触发AttributeError。

修复方案:改成Python 3的标准写法:

content = content.replace("PK-200", event['issue_key'])

3. 代码与依赖的路径不匹配

你的zip包结构是zip → src/lambda_function.py,但Lambda默认从根目录加载模块。如果依赖包(比如pyconfluence、requests)放在zip根目录,而代码在src子目录,Python会找不到这些依赖,因为默认的sys.path不包含src目录。

修复方案二选一:

  • 调整zip结构:把lambda_function.py移到zip根目录,依赖包也放在根目录;
  • 在代码开头添加路径适配:
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

4. 网络权限或超时设置不足

Lambda要访问Confluence API、Zapier Webhook,需要满足以下条件:

  • 检查Lambda的IAM角色是否允许出站访问atlassian.net和hooks.zapier.com;
  • 如果Lambda部署在VPC内,必须配置NAT网关才能访问公网;
  • 默认3秒超时可能不够,建议在Lambda控制台把超时时间调整为10-15秒,毕竟创建页面+调用接口需要一定时间。

5. 缺少错误捕获与日志记录

你的代码没有任何异常处理逻辑,一旦某一步出错(比如Confluence API调用失败、Webhook超时),只会在日志里抛出零散的栈信息,很难定位问题。

建议添加日志和异常捕获:

import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:
        # 先初始化PyConfluence
        pyco.CONFLUENCE_URL = "https://你的confluence域名.atlassian.net/wiki"
        pyco.CONFLUENCE_USER = os.environ["PYCONFLUENCE_USER"]
        pyco.CONFLUENCE_TOKEN = os.environ["PYCONFLUENCE_TOKEN"]
        
        # 获取模板内容
        content = pyco.get_page_content(12345678)
        logger.info("成功获取Confluence模板内容")
        
        # 替换模板变量并创建页面
        page_title = f"{event['issue_key']}: {event['issue_title']}"
        content = content.replace("PK-200", event['issue_key'])
        create_page(page_title, content, "active-product-requirement")
        logger.info(f"成功创建Confluence页面:{page_title}")
        
        # 获取远程链接并回调Zapier
        api_url = f"https://acmein.atlassian.net/rest/api/2/issue/{event['issue_key']}/remotelink/"
        webhook = 'https://hooks.zapier.com/hooks/catch/123456/8v6fde/'
        requisite_headers = {'Accept': 'application/json', 'Content-Type': 'application/json'}
        auth = (os.environ["PYCONFLUENCE_USER"], os.environ["PYCONFLUENCE_TOKEN"])
        
        result = requests.get(api_url, headers=requisite_headers, auth=auth).json()
        logger.info(f"获取到的远程链接:{result}")
        
        confluence_url = result[0]["object"]["url"] if len(result) > 0 else "Error getting the page"
        
        # 用json参数传数据,自动设置正确的Content-Type
        callback = requests.post(webhook, json={'issue_key': event['issue_key'], 'confluence_url': confluence_url })
        callback.raise_for_status()  # 主动触发HTTP错误,方便排查
        logger.info("成功回调Zapier Webhook")
        
        return {"status": "Success"}
    except Exception as e:
        logger.error(f"执行出错:{str(e)}", exc_info=True)
        raise e  # 重新抛出异常,让Lambda记录完整错误栈

另外提个小细节:requests.post用json参数代替data,会自动把数据序列化成JSON并设置Content-Type: application/json,更符合Zapier Webhook的接收要求,避免因为数据格式不对导致回调失败。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:45:11