feat: example of apigateway rest api
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
<!-- This readme file is generated with terraform-docs -->
|
||||
## Requirements
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| terraform | ~> 1.13.0 |
|
||||
| aws | >= 5.0 |
|
||||
|
||||
## Providers
|
||||
|
||||
| Name | Version |
|
||||
|------|---------|
|
||||
| archive | 2.7.1 |
|
||||
| aws | 6.36.0 |
|
||||
|
||||
## Modules
|
||||
|
||||
| Name | Source | Version |
|
||||
|------|--------|---------|
|
||||
| LambdaRole | ../modules/security_identity_compliance/iam-role-v2 | n/a |
|
||||
|
||||
## Resources
|
||||
|
||||
| Name | Type |
|
||||
|------|------|
|
||||
| [aws_api_gateway_deployment.HashWebApp](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_deployment) | resource |
|
||||
| [aws_api_gateway_rest_api.HashWebApp](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_rest_api) | resource |
|
||||
| [aws_api_gateway_stage.test](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/api_gateway_stage) | resource |
|
||||
| [aws_lambda_function.HashWebApp](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_function) | resource |
|
||||
| [aws_lambda_permission.HashWebApp](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/lambda_permission) | resource |
|
||||
| [archive_file.HashWebApp](https://registry.terraform.io/providers/hashicorp/archive/latest/docs/data-sources/file) | data source |
|
||||
| [aws_caller_identity.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source |
|
||||
|
||||
## Inputs
|
||||
|
||||
| Name | Description | Type | Default | Required |
|
||||
|------|-------------|------|---------|:--------:|
|
||||
| application | n/a | `any` | n/a | yes |
|
||||
| aws-region | n/a | `any` | n/a | yes |
|
||||
| environment | n/a | `any` | n/a | yes |
|
||||
| owner | n/a | `any` | n/a | yes |
|
||||
| project | n/a | `any` | n/a | yes |
|
||||
|
||||
## Outputs
|
||||
|
||||
| Name | Description |
|
||||
|------|-------------|
|
||||
| TestUrl | n/a |
|
||||
| last-updated | n/a |
|
||||
|
||||
---
|
||||
## Authorship
|
||||
This module was developed by xpk.
|
||||
@@ -0,0 +1,45 @@
|
||||
# this function takes in "input_string" and return the sha256 hash of that string
|
||||
|
||||
import json
|
||||
import hashlib
|
||||
|
||||
def lambda_handler(event, context):
|
||||
# Get input_string from query params, body, or path
|
||||
input_string = None
|
||||
|
||||
# Try query parameters first
|
||||
if 'queryStringParameters' in event and event['queryStringParameters']:
|
||||
input_string = event['queryStringParameters'].get('input_string')
|
||||
|
||||
# Try request body
|
||||
if not input_string and 'body' in event:
|
||||
try:
|
||||
body = json.loads(event['body']) if isinstance(event['body'], str) else event['body']
|
||||
input_string = body.get('input_string')
|
||||
except:
|
||||
input_string = event['body']
|
||||
|
||||
# Try path parameter as fallback
|
||||
if not input_string and 'pathParameters' in event:
|
||||
input_string = event['pathParameters'].get('input_string', event['pathParameters'].get('proxy'))
|
||||
|
||||
if not input_string:
|
||||
return {
|
||||
'statusCode': 400,
|
||||
'headers': {'Content-Type': 'application/json'},
|
||||
'body': json.dumps({'error': 'input_string required'})
|
||||
}
|
||||
|
||||
# Calculate SHA256
|
||||
sha256_hash = hashlib.sha256(input_string.encode('utf-8')).hexdigest()
|
||||
|
||||
return {
|
||||
'statusCode': 200,
|
||||
'headers': {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
'body': json.dumps({
|
||||
'input_string': input_string,
|
||||
'sha256': sha256_hash
|
||||
})
|
||||
}
|
||||
Binary file not shown.
@@ -0,0 +1,90 @@
|
||||
# Lambda function and role
|
||||
|
||||
module "LambdaRole" {
|
||||
source = "../modules/security_identity_compliance/iam-role-v2"
|
||||
role-name = "AWSLambdaBasicExecutionRole-HashWebApp"
|
||||
description = "Lambda execution role for HashWebApp"
|
||||
create-instance-profile = false
|
||||
trusted-entity = "lambda.amazonaws.com"
|
||||
policies = {
|
||||
AWSLambdaBasicExecutionRole = {
|
||||
description = "AWSLambdaBasicExecutionRole for HashWebApp"
|
||||
policy = jsonencode(
|
||||
{
|
||||
"Version" : "2012-10-17",
|
||||
"Statement" : [
|
||||
{
|
||||
"Effect" : "Allow",
|
||||
"Action" : "logs:CreateLogGroup",
|
||||
"Resource" : "arn:aws:logs:${var.aws-region}:${data.aws_caller_identity.this.account_id}:*"
|
||||
},
|
||||
{
|
||||
"Effect" : "Allow",
|
||||
"Action" : [
|
||||
"logs:CreateLogStream",
|
||||
"logs:PutLogEvents"
|
||||
],
|
||||
"Resource" : [
|
||||
"arn:aws:logs:${var.aws-region}:${data.aws_caller_identity.this.account_id}:log-group:/aws/lambda/HashWebApp:*"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
data "archive_file" "HashWebApp" {
|
||||
type = "zip"
|
||||
source_file = "${path.module}/function.py"
|
||||
output_path = "${path.module}/function.zip"
|
||||
}
|
||||
|
||||
resource "aws_lambda_function" "HashWebApp" {
|
||||
filename = data.archive_file.HashWebApp.output_path
|
||||
function_name = "HashWebApp"
|
||||
role = module.LambdaRole.role-arn
|
||||
handler = "function.lambda_handler"
|
||||
code_sha256 = data.archive_file.HashWebApp.output_base64sha256
|
||||
architectures = ["arm64"]
|
||||
|
||||
runtime = "python3.14"
|
||||
}
|
||||
|
||||
resource "aws_lambda_permission" "HashWebApp" {
|
||||
statement_id = "AllowExecutionFromApiGateway"
|
||||
action = "lambda:InvokeFunction"
|
||||
function_name = aws_lambda_function.HashWebApp.function_name
|
||||
principal = "apigateway.amazonaws.com"
|
||||
source_arn = "${aws_api_gateway_rest_api.HashWebApp.execution_arn}/*/*/*"
|
||||
}
|
||||
|
||||
# rest api
|
||||
resource "aws_api_gateway_rest_api" "HashWebApp" {
|
||||
body = file("${path.module}/restapi-oas30.json")
|
||||
|
||||
name = "HashWebApp"
|
||||
|
||||
endpoint_configuration {
|
||||
types = ["REGIONAL"]
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_api_gateway_deployment" "HashWebApp" {
|
||||
rest_api_id = aws_api_gateway_rest_api.HashWebApp.id
|
||||
|
||||
triggers = {
|
||||
redeployment = sha1(jsonencode(aws_api_gateway_rest_api.HashWebApp.body))
|
||||
}
|
||||
|
||||
lifecycle {
|
||||
create_before_destroy = true
|
||||
}
|
||||
}
|
||||
|
||||
resource "aws_api_gateway_stage" "test" {
|
||||
deployment_id = aws_api_gateway_deployment.HashWebApp.id
|
||||
rest_api_id = aws_api_gateway_rest_api.HashWebApp.id
|
||||
stage_name = "test"
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
output "TestUrl" {
|
||||
value = "${aws_api_gateway_stage.test.invoke_url}/?input_string=TestString"
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
provider "aws" {
|
||||
region = var.aws-region
|
||||
|
||||
default_tags {
|
||||
tags = {
|
||||
Environment = var.environment
|
||||
Project = var.project
|
||||
Application = var.application
|
||||
Owner = var.owner
|
||||
TerraformDir = "${reverse(split("/", path.cwd))[1]}/${reverse(split("/", path.cwd))[0]}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
output "last-updated" {
|
||||
value = timestamp()
|
||||
}
|
||||
|
||||
terraform {
|
||||
required_version = "~> 1.13.0"
|
||||
required_providers {
|
||||
aws = {
|
||||
source = "hashicorp/aws"
|
||||
version = ">= 5.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"openapi" : "3.0.1",
|
||||
"info" : {
|
||||
"title" : "HelloWorld",
|
||||
"version" : "2026-03-15T04:22:58Z"
|
||||
},
|
||||
"servers" : [ {
|
||||
"url" : "https://8cti482053.execute-api.ap-east-1.amazonaws.com/{basePath}",
|
||||
"variables" : {
|
||||
"basePath" : {
|
||||
"default" : "test"
|
||||
}
|
||||
}
|
||||
} ],
|
||||
"paths" : {
|
||||
"/" : {
|
||||
"x-amazon-apigateway-any-method" : {
|
||||
"responses" : {
|
||||
"200" : {
|
||||
"description" : "200 response",
|
||||
"content" : {
|
||||
"application/json" : {
|
||||
"schema" : {
|
||||
"$ref" : "#/components/schemas/Empty"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"x-amazon-apigateway-integration" : {
|
||||
"type" : "aws_proxy",
|
||||
"uri" : "arn:aws:apigateway:ap-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-east-1:040216112220:function:HashWebApp/invocations",
|
||||
"httpMethod" : "POST",
|
||||
"responses" : {
|
||||
"default" : {
|
||||
"statusCode" : "200"
|
||||
}
|
||||
},
|
||||
"passthroughBehavior" : "when_no_match",
|
||||
"timeoutInMillis" : 10000,
|
||||
"responseTransferMode" : "BUFFERED",
|
||||
"contentHandling" : "CONVERT_TO_TEXT"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"components" : {
|
||||
"schemas" : {
|
||||
"Empty" : {
|
||||
"title" : "Empty Schema",
|
||||
"type" : "object"
|
||||
}
|
||||
}
|
||||
},
|
||||
"x-amazon-apigateway-security-policy" : "SecurityPolicy_TLS13_1_3_2025_09",
|
||||
"x-amazon-apigateway-endpoint-access-mode" : "BASIC"
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
variable "aws-region" {}
|
||||
variable "environment" {}
|
||||
variable "project" {}
|
||||
variable "application" {}
|
||||
variable "owner" {}
|
||||
|
||||
data "aws_caller_identity" "this" {}
|
||||
Reference in New Issue
Block a user