class ApiGatewayToService:
"""
Encapsulates Amazon API Gateway functions that are used to create a REST API that
integrates with another AWS service.
"""
def __init__(self, apig_client):
"""
:param apig_client: A Boto3 API Gateway client.
"""
self.apig_client = apig_client
self.api_id = None
self.root_id = None
self.stage = None
def add_integration_method(
self,
resource_id,
rest_method,
service_endpoint_prefix,
service_action,
service_method,
role_arn,
mapping_template,
):
"""
Adds an integration method to a REST API. An integration method is a REST
resource, such as '/users', and an HTTP verb, such as GET. The integration
method is backed by an AWS service, such as Amazon DynamoDB.
:param resource_id: The ID of the REST resource.
:param rest_method: The HTTP verb used with the REST resource.
:param service_endpoint_prefix: The service endpoint that is integrated with
this method, such as 'dynamodb'.
:param service_action: The action that is called on the service, such as
'GetItem'.
:param service_method: The HTTP method of the service request, such as POST.
:param role_arn: The Amazon Resource Name (ARN) of a role that grants API
Gateway permission to use the specified action with the
service.
:param mapping_template: A mapping template that is used to translate REST
elements, such as query parameters, to the request
body format required by the service.
"""
service_uri = (
f"arn:aws:apigateway:{self.apig_client.meta.region_name}"
f":{service_endpoint_prefix}:action/{service_action}"
)
try:
self.apig_client.put_method(
restApiId=self.api_id,
resourceId=resource_id,
httpMethod=rest_method,
authorizationType="NONE",
)
self.apig_client.put_method_response(
restApiId=self.api_id,
resourceId=resource_id,
httpMethod=rest_method,
statusCode="200",
responseModels={"application/json": "Empty"},
)
logger.info("Created %s method for resource %s.", rest_method, resource_id)
except ClientError:
logger.exception(
"Couldn't create %s method for resource %s.", rest_method, resource_id
)
raise
try:
self.apig_client.put_integration(
restApiId=self.api_id,
resourceId=resource_id,
httpMethod=rest_method,
type="AWS",
integrationHttpMethod=service_method,
credentials=role_arn,
requestTemplates={"application/json": json.dumps(mapping_template)},
uri=service_uri,
passthroughBehavior="WHEN_NO_TEMPLATES",
)
self.apig_client.put_integration_response(
restApiId=self.api_id,
resourceId=resource_id,
httpMethod=rest_method,
statusCode="200",
responseTemplates={"application/json": ""},
)
logger.info(
"Created integration for resource %s to service URI %s.",
resource_id,
service_uri,
)
except ClientError:
logger.exception(
"Couldn't create integration for resource %s to service URI %s.",
resource_id,
service_uri,
)
raise