Skip to content

Instantly share code, notes, and snippets.

@ijin
Last active August 16, 2023 07:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ijin/db027846fefb339187e3f2833fe2d034 to your computer and use it in GitHub Desktop.
Save ijin/db027846fefb339187e3f2833fe2d034 to your computer and use it in GitHub Desktop.
[Terraform] API Gateway to get Elastic Beanstalk IP(s)
provider "aws" {
region = "ap-northeast-1"
allowed_account_ids = ["${var.names.account_id}"]
}
variable "names" {
default = {
account_id = "$ACCOUNT_ID"
}
}
# REST API
resource "aws_api_gateway_rest_api" "EB" {
name = "EB"
description = "get EB info"
}
# Resources
resource "aws_api_gateway_resource" "eb" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
parent_id = "${aws_api_gateway_rest_api.EB.root_resource_id}"
path_part = "eb"
}
resource "aws_api_gateway_resource" "env_name" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
parent_id = "${aws_api_gateway_resource.eb.id}"
path_part = "{env_name}"
}
resource "aws_api_gateway_resource" "ip" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
parent_id = "${aws_api_gateway_resource.env_name.id}"
path_part = "ip"
}
resource "aws_api_gateway_resource" "server_num" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
parent_id = "${aws_api_gateway_resource.ip.id}"
path_part = "{server_num}"
}
# Methods
resource "aws_api_gateway_method" "ip_get" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.ip.id}"
http_method = "GET"
authorization = "NONE"
}
resource "aws_api_gateway_method" "server_num_get" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.server_num.id}"
http_method = "GET"
authorization = "NONE"
}
# Integrations
resource "aws_api_gateway_integration" "ip_get" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.ip.id}"
http_method = "${aws_api_gateway_method.ip_get.http_method}"
integration_http_method = "POST"
type = "AWS"
uri = "arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:${var.names.account_id}:function:eb_ip/invocations"
request_templates = {
"application/json" = "{ \"env_name\": \"$input.params('env_name')\" }"
}
depends_on = ["aws_api_gateway_method.ip_get"]
}
resource "aws_api_gateway_integration" "server_num_get" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.server_num.id}"
http_method = "${aws_api_gateway_method.server_num_get.http_method}"
integration_http_method = "POST"
type = "AWS"
uri = "arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:${var.names.account_id}:function:eb_ip/invocations"
request_templates = {
"application/json" = "{\n \"env_name\": \"$input.params('env_name')\",\n \"server_num\": \"$input.params('server_num')\" \n}"
}
depends_on = ["aws_api_gateway_method.server_num_get"]
}
# Method responses
resource "aws_api_gateway_method_response" "ip_200" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.ip.id}"
http_method = "${aws_api_gateway_method.ip_get.http_method}"
status_code = "200"
}
resource "aws_api_gateway_method_response" "ip_400" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.ip.id}"
http_method = "${aws_api_gateway_method.ip_get.http_method}"
status_code = "400"
depends_on = ["aws_api_gateway_method_response.ip_200"]
}
resource "aws_api_gateway_method_response" "server_num_200" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.server_num.id}"
http_method = "${aws_api_gateway_method.server_num_get.http_method}"
status_code = "200"
}
resource "aws_api_gateway_method_response" "server_num_400" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.server_num.id}"
http_method = "${aws_api_gateway_method.server_num_get.http_method}"
status_code = "400"
depends_on = ["aws_api_gateway_method_response.server_num_200"]
}
# Integration responses
resource "aws_api_gateway_integration_response" "ip_get_200" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.ip.id}"
http_method = "${aws_api_gateway_method.ip_get.http_method}"
status_code = "${aws_api_gateway_method_response.ip_200.status_code}"
response_templates = {
"application/json" = "$input.path('$')"
}
}
resource "aws_api_gateway_integration_response" "ip_get_400" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.ip.id}"
http_method = "${aws_api_gateway_method.ip_get.http_method}"
status_code = "${aws_api_gateway_method_response.ip_400.status_code}"
selection_pattern = "[^0-9](.|\n)*"
response_templates = {
"application/json" = "$input.path('$').errorMessage"
}
depends_on = ["aws_api_gateway_integration_response.ip_get_200"]
}
resource "aws_api_gateway_integration_response" "server_num_get_200" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.server_num.id}"
http_method = "${aws_api_gateway_method.server_num_get.http_method}"
status_code = "${aws_api_gateway_method_response.server_num_200.status_code}"
response_templates = {
"application/json" = "$input.path('$')"
}
}
resource "aws_api_gateway_integration_response" "server_num_get_400" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
resource_id = "${aws_api_gateway_resource.server_num.id}"
http_method = "${aws_api_gateway_method.server_num_get.http_method}"
status_code = "${aws_api_gateway_method_response.server_num_400.status_code}"
selection_pattern = "[^0-9](.|\n)*"
response_templates = {
"application/json" = "$input.path('$').errorMessage"
}
depends_on = ["aws_api_gateway_integration_response.server_num_get_200"]
}
resource "aws_api_gateway_deployment" "eb_deployment" {
rest_api_id = "${aws_api_gateway_rest_api.EB.id}"
depends_on = ["aws_api_gateway_integration.ip_get"]
stage_name = "prod"
}
# Permissions
#resource "aws_lambda_permission" "apigw_ip" {
# statement_id = "apigw_for_ip"
# action = "lambda:InvokeFunction"
# function_name = "eb_ip"
# principal = "apigateway.amazonaws.com"
# source_arn = "arn:aws:execute-api:ap-northeast-1:${var.names.account_id}:${aws_api_gateway_rest_api.EB.id}/*/GET/eb/*/${aws_api_gateway_resource.ip.path_part}"
#}
#resource "aws_lambda_permission" "apigw_server_num" {
# statement_id = "apigw_for_server_num"
# action = "lambda:InvokeFunction"
# function_name = "eb_ip"
# principal = "apigateway.amazonaws.com"
# source_arn = "arn:aws:execute-api:ap-northeast-1:${var.names.account_id}:${aws_api_gateway_rest_api.EB.id}/*/GET/eb/*/${aws_api_gateway_resource.ip.path_part}/*"
#}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment