Cloudformation does not support create vpc links in apigateway

后端 未结 2 1415
醉梦人生
醉梦人生 2021-01-18 19:40

In aws api gateway there is a section called API Link and I can manually set that.

The problem is I cannot find any section in cloudformation documentation on how I

2条回答
  •  攒了一身酷
    2021-01-18 20:21

    You can use swagger to define an API Gateway using VPC Link. This is a complete CloudFormation template you can deploy to test it out...

    {
        "AWSTemplateFormatVersion": "2010-09-09",
        "Description": "Test backend access via API Gateway. This template provisions a Regional API Gateway proxing requests to a backend via VPC Link and Direct Connect to on-premises resources using private ip addresses.",
        "Parameters": {
            "VPCId": {
                "Description": "VPC Id for API Gateway VPC Link",
                "Type": "AWS::EC2::VPC::Id"
            },
            "NLBSubnetList": {
                "Type": "List",
                "Description": "Subnet Ids for provisioning load balancer supporting the VPC Link"
            },
            "BackendBaseEndpoint": {
                "Description": "The backend service base url including protocol. e.g.: https://",
                "Type": "String",
                "Default": "https://mybackend.dev.mycompany.com"
            },
            "TargetIpAddresses": {
                "Type": "CommaDelimitedList",
                "Description": "Comma separated list of NLB target ip addresses. Specify two entries.",
                "Default": "10.78.80.1, 10.79.80.1"
            }
        },
        "Resources": {
            "API": {
                "Type": "AWS::ApiGateway::RestApi",
                "Properties": {
                    "Name": "Test Api",
                    "Description": "Test Api using VPC_LINK and AWS_IAM authorisation",
                    "Body": {
                        "swagger": "2.0",
                        "info": {
                            "title": "Test Api"
                        },
                        "schemes": [
                            "https"
                        ],
                        "paths": {
                            "/{proxy+}": {
                                "x-amazon-apigateway-any-method": {
                                    "parameters": [
                                        {
                                            "name": "proxy",
                                            "in": "path",
                                            "required": true,
                                            "type": "string"
                                        }
                                    ],
                                    "responses": {},
                                    "security": [
                                        {
                                            "sigv4": []
                                        }
                                    ],
                                    "x-amazon-apigateway-integration": {
                                        "responses": {
                                            "default": {
                                                "statusCode": "200"
                                            }
                                        },
                                        "requestParameters": {
                                            "integration.request.path.proxy": "method.request.path.proxy"
                                        },
                                        "uri": {
                                            "Fn::Join": [
                                                "",
                                                [
                                                    {
                                                        "Ref": "BackendBaseEndpoint"
                                                    },
                                                    "/{proxy}"
                                                ]
                                            ]
                                        },
                                        "passthroughBehavior": "when_no_match",
                                        "connectionType": "VPC_LINK",
                                        "connectionId": "${stageVariables.vpcLinkId}",
                                        "httpMethod": "GET",
                                        "type": "http_proxy"
                                    }
                                }
                            }
                        },
                        "securityDefinitions": {
                            "sigv4": {
                                "type": "apiKey",
                                "name": "Authorization",
                                "in": "header",
                                "x-amazon-apigateway-authtype": "awsSigv4"
                            }
                        }
                    },
                    "EndpointConfiguration": {
                        "Types": [
                            "REGIONAL"
                        ]
                    }
                },
                "DependsOn": "VPCLink"
            },
            "APIStage": {
                "Type": "AWS::ApiGateway::Stage",
                "Properties": {
                    "StageName": "dev",
                    "Description": "dev Stage",
                    "RestApiId": {
                        "Ref": "API"
                    },
                    "DeploymentId": {
                        "Ref": "APIDeployment"
                    },
                    "MethodSettings": [
                        {
                            "ResourcePath": "/*",
                            "HttpMethod": "GET",
                            "MetricsEnabled": "true",
                            "DataTraceEnabled": "true",
                            "LoggingLevel": "ERROR"
                        }
                    ],
                    "Variables": {
                        "vpcLinkId": {
                            "Ref": "VPCLink"
                        }
                    }
                }
            },
            "APIDeployment": {
                "Type": "AWS::ApiGateway::Deployment",
                "Properties": {
                    "RestApiId": {
                        "Ref": "API"
                    },
                    "Description": "Test Deployment"
                }
            },
            "VPCLink": {
                "Type": "AWS::ApiGateway::VpcLink",
                "Properties": {
                    "Description": "Vpc link to GIS platform",
                    "Name": "VPCLink",
                    "TargetArns": [
                        {
                            "Ref": "NLB"
                        }
                    ]
                }
            },
            "NLBTargetGroup": {
                "Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
                "Properties": {
                    "Name": "NLBTargetGroup",
                    "Port": 443,
                    "Protocol": "TCP",
                    "TargetGroupAttributes": [
                        {
                            "Key": "deregistration_delay.timeout_seconds",
                            "Value": "20"
                        }
                    ],
                    "TargetType": "ip",
                    "Targets": [
                        {
                            "Id": { "Fn::Select" : [ "0", {"Ref": "TargetIpAddresses"} ] },
                            "Port": 443,
                            "AvailabilityZone": "all"
                        },
                        {
                            "Id": { "Fn::Select" : [ "1", {"Ref": "TargetIpAddresses"} ] },
                            "Port": 443,
                            "AvailabilityZone": "all"
                        }
                    ],
                    "VpcId": {
                        "Ref": "VPCId"
                    },
                    "Tags": [
                        {
                            "Key": "Project",
                            "Value": "API and VPC Link Test"
                        }
                    ]
                }
            },
            "NLB": {
                "Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
                "Properties": {
                    "Type": "network",
                    "Scheme": "internal",
                    "Subnets": {
                        "Ref": "NLBSubnetList"
                    }
                }
            },
            "NLBListener": {
                "Type": "AWS::ElasticLoadBalancingV2::Listener",
                "Properties": {
                    "DefaultActions": [
                        {
                            "Type": "forward",
                            "TargetGroupArn": {
                                "Ref": "NLBTargetGroup"
                            }
                        }
                    ],
                    "LoadBalancerArn": {
                        "Ref": "NLB"
                    },
                    "Port": "443",
                    "Protocol": "TCP"
                }
            }
        },
        "Outputs": {
            "NetworkLoadBalancerArn": {
                "Value": {
                    "Ref": "NLB"
                },
                "Description": "The network elastic load balancer Amazon resource name"
            }
        }
    }
    

提交回复
热议问题