【问题标题】:How to modify API gateway integration request using Boto3如何使用 Boto3 修改 API 网关集成请求
【发布时间】:2020-12-01 05:01:22
【问题描述】:

我已经使用 boto3 import 命令从我现有的 api 创建了一个 api 网关。

apiClient = boto3.client('apigateway', awsregion)
api_response=apiClient.import_rest_api
(
   failOnWarnings=True,
   body=open('apifileswagger.json', 'rb').read()
)

但我无法修改集成请求。我尝试使用以下 Boto3 命令。

 apiClient = boto3.client('apigateway', awsregion)
 api_response=apiClient.put_integration
 (
   restApiId=apiName,
   resourceId='/api/v1/hub',
   httpMethod='GET',
   integrationHttpMethod='GET',
   type='AWS',
   uri='arn:aws:lambda:us-east-1:141697213513:function:test-lambda',
  )

但是我遇到了这样的错误

Unexpected error: An error occurred () when calling the PutIntegration operation: 

我需要使用 Boto3 命令更改 lambda 函数区域和名称。可能吗? .

如果可能的话,这个命令的实际问题是什么?

【问题讨论】:

    标签: python amazon-web-services aws-lambda aws-api-gateway boto3


    【解决方案1】:

    在上面列出的 put_integration() 调用中,您的 restApiId 和 resourceId 看起来不正确。这是你应该做的。

    导入您的 REST API 后,通过调用您的 apiClient 的 get_rest_apis() 检查它是否可用。如果 API 已正确导入,您应该会在响应中看到它以及 API 的 ID(由 AWS 生成)。捕获此 ID 以供将来操作。

    接下来,您需要通过调用 apiClient 的 get_resources() 查看与此 API 关联的所有资源。捕获您要修改的资源的资源 ID。

    使用 API ID 和资源 ID,通过调用 apiClient 的 get_integration() 检查是否存在集成配置。如果确实存在,您可以通过调用 update_integration() 来修改集成请求;如果不存在,则需要通过调用 put_integration() 并将集成请求作为参数传递来创建新的集成。


    以下是代码中的示例:

    # Import API
    api_response1 = apiClient.import_rest_api(failOnWarnings=True, body=open('apifileswagger.json', 'rb').read())
    print(api_response1)
    
    # Get API ID
    api_response2 = apiClient.get_rest_apis()
    for endpoint in api_response2['items']:
        if endpoint['name'] == "YOUR_API_NAME":
            api_ID = endpoint['id']
    
    # Get Resource ID
    api_response3 = apiClient.get_resources(restApiId=api_ID)
        for resource in api_response3['items']:
            if resource['path'] == "YOUR_PATH":
                resource_ID = resource['id']
    
    # Check for Existing Integrations
    api_response4 = apiClient.get_integration(restApiId=api_ID, resourceId=resource_ID , httpMethod='GET')
    print(api_response4)
    
    # Create Integration with Request
    integration_request = { 'application/json': '{\r\n  "body" : $input.json(\'$\'),\r\n}' }
    api_response5 = apiClient.put_integration(restApiId=api_ID, resourceId=resource_ID , httpMethod='GET', type='AWS', 
        integrationHttpMethod='GET', uri="YOUR_LAMBDA_URI", requestTemplates=integration_request)
    print(api_response5)
    

    上面列出的所有方法都在 here 找到的 Boto3 文档中进行了解释。

    【讨论】:

      【解决方案2】:

      与大多数 API Gateway 对 API 定义的更新一样,为了更新集成请求,您必须执行 PATCH 并使用预期格式传递带有补丁文档的正文。见documentation here

      【讨论】:

        猜你喜欢
        • 2020-03-10
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 2022-07-05
        • 2011-10-17
        • 2016-03-24
        • 1970-01-01
        • 2013-07-08
        相关资源
        最近更新 更多