Search code examples
amazon-web-servicesaws-cloudformationaws-api-gatewayaws-event-bridge

AWS API Gateway integration with AWS Event Bridge(Cloudwatch Events) in Cloudformation Script


Original Requirement:

Create a route/path on AWS Api Gateway which connects API Gateway directly to AWS Event Bridge (Cloudwatch Events) and puts/pushes event on an event bus of it.

Was able to create it and executes just fine when done from AWS Console.

Actual Problem:

When writing the AWS Cloudformation script for this API Gateway, it looks like this:

EventsPostMethod:
 Type: AWS::ApiGateway::Method
 Properties:
   ResourceId:
     Ref: EventsResource
 RestApiId:
   Ref: RestAPI
 HttpMethod: POST
 AuthorizationType: NONE
 Integration:
   Type: AWS
   IntegrationHttpMethod: POST
   Uri:
     Fn::Sub: arn:aws:apigateway:${AWS::Region}:cloudwatchEvents:action/PutEvents
   RequestParameters:
     integration.request.header.X-Amz-Target: "'AWSEvents.PutEvents'"
   RequestTemplate:
     some-script-here...
   

Notice the Uri value:

"arn:aws:apigateway:${AWS::Region}:cloudwatchEvents:action/PutEvents"
arn:aws:apigateway:{region}:{subdomain.service|service}:path|action/{service_api}

According to AWS Docs the value of uri should be following:

For AWS or AWS_PROXY integrations, the URI is of the form arn:aws:apigateway:{region}:{subdomain.service|service}:path|action/{service_api}. Here, {Region} is the API Gateway region (e.g., us-east-1); {service} is the name of the integrated AWS service (e.g., s3); and {subdomain} is a designated subdomain supported by certain AWS service for fast host-name lookup. action can be used for an AWS service action-based API, using an Action={name}&{p1}={v1}&p2={v2}... query string. The ensuing {service_api} refers to a supported action {name} plus any required input parameters. Alternatively, path can be used for an AWS service path-based API. The ensuing service_api refers to the path to an AWS service resource, including the region of the integrated AWS service, if applicable. For example, for integration with the S3 API of GetObject, the uri can be either arn:aws:apigateway:us-west-2:s3:action/GetObject&Bucket={bucket}&Key={key} or arn:aws:apigateway:us-west-2:s3:path/{bucket}/{key}

You must have noticed that I replaced the service with cloudwatchEvents in the above mentioned uri.

Now, error Given by AWS Cloudformation Console during Publish of API Gateway:

AWS Service of type cloudwatchEvents not supported (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException; Request ID: 07bae22c-d198-4595-8de9-6ea23763eff5; Proxy: null)

Now I have tried replacing service with

  • cloudwatch
  • eventBridge
  • cloudwatchEvent
  • event-bus

This is the real problem. What should I place in service in uri so that it accepts ?

enter image description here


Solution

  • Based on the comments,

    The URI should be something like below for events:

    arn:aws:apigateway:${AWS::Region}:events:action/PutEvents