AWS CloudFormation/API Gateway gives 'Invalid Resource identifier specified'
12,567
Solution 1
ResourceId must be a reference to a cloudformation resource, not a simple string.
e.g.
ResourceId:
Ref: UsersResource
Solution 2
I figured that actually it was the RestApiId which needed to be a reference too:
"RestApiId": {
"Ref": "MyApi"
},
Author by
user3067870
Updated on June 18, 2022Comments
-
user3067870 almost 2 years
I have been trying to use CloudFormation to deploy to API Gateway, however, I constantly run into the same issue with my method resources. The stack deployments keep failing with 'Invalid Resource identifier specified'.
Here is my method resource from my CloudFormation template:
"UsersPut": { "Type": "AWS::ApiGateway::Method", "Properties": { "ResourceId": "UsersResource", "RestApiId": "MyApi", "ApiKeyRequired": true, "AuthorizationType": "NONE", "HttpMethod": "PUT", "Integration": { "Type": "AWS_PROXY", "IntegrationHttpMethod": "POST", "Uri": { "Fn::Join": ["", ["arn:aws:apigateway:", { "Ref": "AWS::Region" }, ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": ["MyLambdaFunc", "Arn"] }, "/invocations"]] } }, "MethodResponses": [{ "StatusCode": 200 }] } }
Is anyone able to help me figure out why this keeps failing the stack deployment?
UPDATE: I forgot to mention that I had also tried using references to add the resource ID, that also gave me the same error:
"UsersPut": { "Type": "AWS::ApiGateway::Method", "Properties": { "ResourceId": { "Ref": "UsersResource" }, "RestApiId": "MyApi", "ApiKeyRequired": true, "AuthorizationType": "NONE", "HttpMethod": "PUT", "Integration": { "Type": "AWS_PROXY", "IntegrationHttpMethod": "POST", "Uri": { "Fn::Join": ["", ["arn:aws:apigateway:", { "Ref": "AWS::Region" }, ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": ["MyLambdaFunc", "Arn"] }, "/invocations"]] } }, "MethodResponses": [{ "StatusCode": 200 }] } }
Here is the full CloudFormation template:
{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "LambdaDynamoDBRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Action": [ "sts:AssumeRole" ] }] }, "Path": "/", "Policies": [{ "PolicyName": "DynamoReadWritePolicy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [{ "Sid": "1", "Action": [ "dynamodb:DeleteItem", "dynamodb:GetItem", "dynamodb:PutItem", "dynamodb:Query", "dynamodb:Scan", "dynamodb:UpdateItem" ], "Effect": "Allow", "Resource": "*" }, { "Sid": "2", "Resource": "*", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Effect": "Allow" }] } }] } }, "MyFirstLambdaFn": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "S3Bucket": "myfirstlambdafn", "S3Key": "lambda_handler.py.zip" }, "Description": "", "FunctionName": "MyFirstLambdaFn", "Handler": "lambda_function.lambda_handler", "MemorySize": 512, "Role": { "Fn::GetAtt": [ "LambdaDynamoDBRole", "Arn" ] }, "Runtime": "python2.7", "Timeout": 3 }, "DependsOn": "LambdaDynamoDBRole" }, "MySecondLambdaFn": { "Type": "AWS::Lambda::Function", "Properties": { "Code": { "S3Bucket": "mysecondlambdafn", "S3Key": "lambda_handler.py.zip" }, "Description": "", "FunctionName": "MySecondLambdaFn", "Handler": "lambda_function.lambda_handler", "MemorySize": 512, "Role": { "Fn::GetAtt": [ "LambdaDynamoDBRole", "Arn" ] }, "Runtime": "python2.7", "Timeout": 3 }, "DependsOn": "LambdaDynamoDBRole" }, "MyApi": { "Type": "AWS::ApiGateway::RestApi", "Properties": { "Name": "Project Test API", "Description": "Project Test API", "FailOnWarnings": true } }, "FirstUserPropertyModel": { "Type": "AWS::ApiGateway::Model", "Properties": { "ContentType": "application/json", "Name": "FirstUserPropertyModel", "RestApiId": { "Ref": "MyApi" }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "FirstUserPropertyModel", "type": "object", "properties": { "Email": { "type": "string" } } } } }, "SecondUserPropertyModel": { "Type": "AWS::ApiGateway::Model", "Properties": { "ContentType": "application/json", "Name": "SecondUserPropertyModel", "RestApiId": { "Ref": "MyApi" }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "SecondUserPropertyModel", "type": "object", "properties": { "Name": { "type": "string" } } } } }, "ErrorCfn": { "Type": "AWS::ApiGateway::Model", "Properties": { "ContentType": "application/json", "Name": "ErrorCfn", "RestApiId": { "Ref": "MyApi" }, "Schema": { "$schema": "http://json-schema.org/draft-04/schema#", "title": "Error Schema", "type": "object", "properties": { "message": { "type": "string" } } } } }, "UsersResource": { "Type": "AWS::ApiGateway::Resource", "Properties": { "RestApiId": { "Ref": "MyApi" }, "ParentId": { "Fn::GetAtt": ["MyApi", "RootResourceId"] }, "PathPart": "users" } }, "UsersPost": { "Type": "AWS::ApiGateway::Method", "Properties": { "ResourceId": { "Ref": "UsersResource" }, "RestApiId": "MyApi", "ApiKeyRequired": true, "AuthorizationType": "NONE", "HttpMethod": "POST", "Integration": { "Type": "AWS_PROXY", "IntegrationHttpMethod": "POST", "Uri": { "Fn::Join": ["", ["arn:aws:apigateway:", { "Ref": "AWS::Region" }, ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": ["MyFirstLambdaFn", "Arn"] }, "/invocations"]] } }, "MethodResponses": [{ "ResponseModels": { "application/json": { "Ref": "FirstUserPropertyModel" } }, "StatusCode": 200 }, { "ResponseModels": { "application/json": { "Ref": "ErrorCfn" } }, "StatusCode": 404 }, { "ResponseModels": { "application/json": { "Ref": "ErrorCfn" } }, "StatusCode": 500 }] } }, "UsersPut": { "Type": "AWS::ApiGateway::Method", "Properties": { "ResourceId": { "Ref": "UsersResource" }, "RestApiId": "MyApi", "ApiKeyRequired": true, "AuthorizationType": "NONE", "HttpMethod": "PUT", "Integration": { "Type": "AWS_PROXY", "IntegrationHttpMethod": "POST", "Uri": { "Fn::Join": ["", ["arn:aws:apigateway:", { "Ref": "AWS::Region" }, ":lambda:path/2015-03-31/functions/", { "Fn::GetAtt": ["MySecondLambdaFn", "Arn"] }, "/invocations"]] } }, "MethodResponses": [{ "ResponseModels": { "application/json": { "Ref": "SecondUserPropertyModel" } }, "StatusCode": 200 }, { "ResponseModels": { "application/json": { "Ref": "ErrorCfn" } }, "StatusCode": 404 }, { "ResponseModels": { "application/json": { "Ref": "ErrorCfn" } }, "StatusCode": 500 }] } }, "RestApiDeployment": { "Type": "AWS::ApiGateway::Deployment", "Properties": { "RestApiId": { "Ref": "MyApi" }, "StageName": "Prod" }, "DependsOn": ["UsersPost", "UsersPut"] } }, "Description": "Project description"
}
-
user3067870 almost 7 yearsYea sorry I did also try using references but that gave me the same error.
-
jens walter almost 7 yearsHow did you define your resource? Can you post a more complete version of the CF-template?
-
user3067870 almost 7 yearsI have updated the question with the full template, thanks.