在AWS的服务体系中,API Gateway和Lambda的组合是构建无服务器接口的常见方案,当接口需要接收XML格式数据时,需要通过CloudFormation模板完成两者的关联配置,同时做好数据解析的相关处理。

核心配置思路
要实现接收XML的API Gateway和Lambda,整体配置需要包含三个核心部分:首先是定义API Gateway的REST API资源,配置支持XML的请求内容类型;其次创建Lambda函数,编写XML解析逻辑;最后配置API Gateway到Lambda的集成权限,确保请求可以正确转发到Lambda处理。
CloudFormation模板完整示例
以下是一个完整的CloudFormation模板示例,实现了接收XML的API Gateway接口和对应的Lambda函数:
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "CloudFormation模板:定义接收XML的API Gateway和Lambda",
"Resources": {
# 定义Lambda函数
"XmlProcessLambda": {
"Type": "AWS::Lambda::Function",
"Properties": {
"FunctionName": "xml-receiver-lambda",
"Runtime": "python3.9",
"Handler": "index.lambda_handler",
"Code": {
"ZipFile": "import jsonnimport xml.etree.ElementTree as ETnndef lambda_handler(event, context):n # 获取请求体中的XML数据n xml_body = event.get('body', '')n if not xml_body:n return {n 'statusCode': 400,n 'body': json.dumps({'message': '请求体为空'})n }n try:n # 解析XML数据n root = ET.fromstring(xml_body)n # 提取XML根节点名称作为示例返回n result = {'root_node': root.tag, 'content': xml_body}n return {n 'statusCode': 200,n 'body': json.dumps(result)n }n except ET.ParseError:n return {n 'statusCode': 400,n 'body': json.dumps({'message': 'XML格式解析失败'})n }"
},
"Role": {
"Fn::GetAtt": ["LambdaExecutionRole", "Arn"]
}
}
},
# 定义Lambda执行角色
"LambdaExecutionRole": {
"Type": "AWS::IAM::Role",
"Properties": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
},
"ManagedPolicyArns": [
"arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
]
}
},
# 定义API Gateway REST API
"XmlApiGateway": {
"Type": "AWS::ApiGateway::RestApi",
"Properties": {
"Name": "xml-receiver-api",
"Description": "接收XML数据的API Gateway"
}
},
# 定义API资源
"XmlResource": {
"Type": "AWS::ApiGateway::Resource",
"Properties": {
"RestApiId": {
"Ref": "XmlApiGateway"
},
"ParentId": {
"Fn::GetAtt": ["XmlApiGateway", "RootResourceId"]
},
"PathPart": "receive-xml"
}
},
# 定义POST方法
"XmlPostMethod": {
"Type": "AWS::ApiGateway::Method",
"Properties": {
"RestApiId": {
"Ref": "XmlApiGateway"
},
"ResourceId": {
"Ref": "XmlResource"
},
"HttpMethod": "POST",
"AuthorizationType": "NONE",
"RequestParameters": {
"method.request.header.Content-Type": true
},
"Integration": {
"Type": "AWS",
"IntegrationHttpMethod": "POST",
"Uri": {
"Fn::Sub": "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${XmlProcessLambda.Arn}/invocations"
},
"RequestTemplates": {
# 配置支持application/xml内容类型
"application/xml": "{"body": "$input.body"}"
},
"IntegrationResponses": [
{
"StatusCode": 200
}
]
},
"MethodResponses": [
{
"StatusCode": 200
},
{
"StatusCode": 400
}
]
}
},
# 配置API Gateway调用Lambda的权限
"LambdaApiPermission": {
"Type": "AWS::Lambda::Permission",
"Properties": {
"FunctionName": {
"Ref": "XmlProcessLambda"
},
"Action": "lambda:InvokeFunction",
"Principal": "apigateway.amazonaws.com",
"SourceArn": {
"Fn::Sub": "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${XmlApiGateway}/*/POST/receive-xml"
}
}
},
# 定义API部署
"ApiDeployment": {
"Type": "AWS::ApiGateway::Deployment",
"DependsOn": "XmlPostMethod",
"Properties": {
"RestApiId": {
"Ref": "XmlApiGateway"
},
"StageName": "prod"
}
}
},
"Outputs": {
"ApiEndpoint": {
"Description": "API Gateway调用地址",
"Value": {
"Fn::Sub": "https://${XmlApiGateway}.execute-api.${AWS::Region}.ipipp.com/prod/receive-xml"
}
}
}
}
模板核心配置说明
Lambda函数部分
Lambda函数的代码中引入了Python内置的xml.etree.ElementTree模块用于解析XML数据,首先从event参数中获取请求体,判断是否为空后尝试解析XML,解析成功则返回根节点信息,失败则返回对应的错误提示。同时Lambda的执行角色需要关联基础的Lambda执行权限,确保函数可以正常输出日志。
API Gateway部分
API Gateway的配置中,关键是在RequestTemplates里添加application/xml的映射模板,将请求的XML原始数据传递到Lambda的event.body中。同时需要开启method.request.header.Content-Type请求参数,允许客户端指定请求的内容类型为XML。
权限配置部分
必须添加AWS::Lambda::Permission资源,授予API Gateway调用Lambda函数的权限,否则API Gateway收到请求后无法转发到Lambda,会返回权限错误。
部署与测试
将上述模板保存为xml-api-template.json文件,通过AWS CLI执行以下命令部署:
aws cloudformation create-stack --stack-name xml-api-stack --template-body file://xml-api-template.json --capabilities CAPABILITY_IAM
部署完成后,通过输出的API地址发送XML格式的POST请求测试:
curl -X POST "https://生成的API地址/prod/receive-xml" -H "Content-Type: application/xml" -d "<user><name>test</name><age>20</age></user>"
如果配置正确,会返回解析后的XML根节点名称和原始内容,说明接口已经可以正常接收和处理XML数据。
AWS_CloudFormationAPI_GatewayLambdaXML修改时间:2026-06-30 00:48:34