aws-cloudformation / aws-cloudformation/cloudformation-coverage-roadmap
400 InvalidParameter Error in AWS::ApiGateway::Method Integration with SNS Publish Action
- Dominant language
- No language data
- Stars
- 1.1k
- Forks
- 62
- PR merge metrics
- No merged PRs in 30d
Description
### Resource Name
AWS::ApiGateway::Method
### Details
Hi, I am encountering an issue with the `AWS::ApiGateway::Method` resource when integrating with the SNS Publish action. The API Gateway method is configured to send a request to an SNS FIFO topic, but the integration is failing with a `400 InvalidParameter` error. The error message indicates that the `TopicArn` or `TargetArn` parameter is missing, even though it is explicitly included in the request template.
I have reviewed the documentation for the `RequestTemplates` property in the [AWS CloudFormation documentation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-apigateway-method-integration.html#cfn-apigateway-method-integration-requesttemplates), but I could not find detailed examples or syntax guidance for this specific use case. Based on the documentation, the `RequestTemplates` property is described as:
> Represents a map of Velocity templates that are applied on the request payload based on the value of the Content-Type header sent by the client. The content type value is the key in this map, and the template (as a String) is the value.
## Resource Definition
Here is the relevant `AWS::ApiGateway::Method` resource definition from my CloudFormation template (sensitive data has been anonymized):
```yml
Method:
Type: AWS::ApiGateway::Method
Properties:
RestApiId: !Ref Api
ResourceId: !Ref Resource
HttpMethod: POST
AuthorizationType: CUSTOM
AuthorizerId: !Ref Authorizer
Integration:
Type: AWS
IntegrationHttpMethod: POST
Uri: !Sub arn:aws:apigateway:${AWS::Region}:sns:action/Publish
Credentials: !GetAtt ApiGatewayToSnsRole.Arn
PassthroughBehavior: WHEN_NO_MATCH
RequestTemplates:
application/json: |
Action=Publish&TopicArn=arn:aws:sns:us-east-1:123456789012:my-sns-topic.fifo&Message=$util.urlEncode($input.body)&MessageGroupId=default
IntegrationResponses:
- StatusCode: 200
ResponseTemplates:
application/json: |
{
"message": "SNS message published successfully."
}
- StatusCode: 500
ResponseTemplates:
application/json: |
{
"message": "Failed to publish SNS message."
}
MethodResponses:
- StatusCode: 200
ResponseModels:
application/json: Empty
- StatusCode: 500
ResponseModels:
application/json: Empty
```
## API Gateway Logs
Here are the relevant logs from API Gateway (sensitive data has been anonymized):
```txt
(12345678-1234-1234-1234-123456789012) Endpoint request body after transformations: Action=Publish&TopicArn=arn:aws:sns:us-east-1:123456789012:my-sns-topic.fifo&Message=%5B%0A%09%7B%0A%09%09%22PropAKey%22%3A+123%2C%0A%09%09%22PropBKey%22%3A+%22PropBValue%22%2C%0A%09%09%22PropCKey%22%3A+456%2C%0A%09%09%22PropDKey%22%3A+%22PropDValue%22%0A%09%7D%0A%5D&MessageGroupId=default
(12345678-1234-1234-1234-123456789012) Sending request to https://sns.us-east-1.amazonaws.com/?Action=Publish
(12345678-1234-1234-1234-123456789012) Received response. Status: 400, Integration latency: 8 ms
(12345678-1234-1234-1234-123456789012) Endpoint response headers: {x-amzn-RequestId=2b0e6598-903b-58da-a2b6-05e4041cfa1e, Date=Fri, 18 Apr 2025 17:54:47 GMT, Content-Type=application/json, Content-Length=197, connection=keep-alive}
(12345678-1234-1234-1234-123456789012) Endpoint response body before transformations:
{
"Error": {
"Code": "InvalidParameter",
"Message": "Invalid parameter: TopicArn or TargetArn Reason: no value for required parameter",
"Type": "Sender"
},
"RequestId": "2b0e6598-903b-58da-a2b6-05e4041cfa1e"
}
(12345678-1234-1234-1234-123456789012) Method response body after transformations:
{
"message": "SNS message published successfully."
}
```
This is the request body been encoded in above logs:
```json
[
{
"PropAKey": 123,
"PropBKey": "PropBValue",
"PropCKey": 456,
"PropDKey": "PropDValue"
}
]
```
## Expected Behavior
The `TopicArn` parameter is included in the request template and should be passed to the SNS Publish action. The request should succeed, and the message should be published to the SNS topic.
## Actual Behavior
The integration fails with a `400 InvalidParameter` error, indicating that the `TopicArn` or `TargetArn` parameter is missing. However, the logs show that the `TopicArn` is present in the request body.
## Environment
- **AWS Region**: `us-east-1`
- **API Gateway Type**: REST API
- **SNS Topic Type**: FIFO
- **CloudFormation Template**: YAML
## Additional Notes
- I used GitHub Copilot and Amazon Q AI from the AWS documentation website to validate the syntax of my template, and both tools suggest that the template is correct.
- The `ApiGatewayToSnsRole` IAM role has the necessary `sns:Publish` permissions for the SNS topic.
- The `Uri` for the integration is set to `arn:aws:apigateway:${AWS::Region}:sns:action/Publish`.
Please let me know if additional information is needed to debug this issue. Thank you!
Contributor guide
Research direction
No repository file or test is identified. Start with the AWS::ApiGateway::Method Integration RequestTemplates documentation and reproduce the SNS Publish request using the supplied CloudFormation definition and API Gateway logs. Done means determining why the visible TopicArn is rejected and documenting a verified configuration or documentation change.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- aws, yaml
- Domain
- api, cloud
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100