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

如何使用Python通过AWS Lambda从S3获取文件并附加到Jira工单

实现步骤

前置准备

  • 给Lambda执行角色配置IAM权限:至少包含S3的s3:GetObject权限,以及Lambda基础执行权限(用于输出CloudWatch日志排查问题)
  • 提前获取Jira凭证:云版本Jira需生成账号对应的API令牌,自建Jira可使用账号密码或对应权限的API令牌,确保该账号对目标工单有添加附件的权限
  • 准备Python依赖:Lambda默认不自带Jira SDK,需要提前把jira库打包到部署包或者配置为Lambda层,打包时注意和Lambda的Python运行版本、操作系统架构匹配,避免兼容报错

Lambda环境变量配置

在Lambda控制台配置以下环境变量,避免敏感信息硬编码:

  • JIRA_BASE_URL:Jira实例访问地址,例:https://your-domain.atlassian.net
  • JIRA_USER_EMAIL:Jira账号绑定的邮箱
  • JIRA_API_TOKEN:Jira账号对应的API令牌
  • S3_BUCKET_NAME:存储目标文件的S3桶名称
  • JIRA_TICKET_KEY:目标工单编号,例:PROJ-123,也可根据触发事件(如S3对象元数据)动态获取

完整代码示例

import boto3
import os
from jira import JIRA

# 初始化全局客户端,避免冷启动重复初始化
s3_client = boto3.client('s3')
jira_client = JIRA(
    server=os.environ['JIRA_BASE_URL'],
    basic_auth=(os.environ['JIRA_USER_EMAIL'], os.environ['JIRA_API_TOKEN'])
)

def lambda_handler(event, context):
    # 从S3触发事件中获取目标文件key,也可根据业务逻辑手动指定
    s3_file_key = event['Records'][0]['s3']['object']['key']
    # 若不需要动态从事件取,可直接写死:s3_file_key = "your/target/file/path.csv"
    
    # 从S3拉取文件内容
    s3_resp = s3_client.get_object(
        Bucket=os.environ['S3_BUCKET_NAME'],
        Key=s3_file_key
    )
    file_content = s3_resp['Body'].read()
    # 提取纯文件名,去掉S3路径前缀
    file_name = s3_file_key.split("/")[-1]
    
    # 上传附件到Jira工单
    jira_client.add_attachment(
        issue=os.environ['JIRA_TICKET_KEY'],
        attachment=file_content,
        filename=file_name
    )
    
    return {
        "statusCode": 200,
        "body": f"文件{file_name}已成功上传至工单{os.environ['JIRA_TICKET_KEY']}"
    }

配置注意事项

  • 调整Lambda运行参数:如果上传的文件较大,需要把Lambda的超时时间从默认的3秒调整到30秒及以上,内存也适当上调避免OOM
  • 网络连通性:如果是自建Jira实例,需要把Lambda配置到能访问Jira的VPC下,配置对应NAT网关或安全组规则,确保网络连通
  • 权限校验:提前确认Jira账号对目标工单有添加附件的权限,S3桶策略也不要限制Lambda执行角色的访问权限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:45:04