如何使用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.netJIRA_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
相关产品推荐
相关产品推荐

