From 47ed7e72dbeb6d1ee500c780f804165afe7177d2 Mon Sep 17 00:00:00 2001 From: CHIKAMATSU Naohiro Date: Fri, 9 Feb 2024 22:44:55 +0900 Subject: [PATCH 1/3] Lambda with API Gateway --- .../api-gateway-with-lambda/.gitignore | 1 + .../api-gateway-with-lambda/Makefile | 28 ++++++++ .../api-gateway-with-lambda/README.md | 0 .../api-gateway-with-lambda/main.go | 37 ++++++++++ .../api-gateway-with-lambda/template.yml | 71 +++++++++++++++++++ 5 files changed, 137 insertions(+) create mode 100644 cloudformation/api-gateway-with-lambda/.gitignore create mode 100644 cloudformation/api-gateway-with-lambda/Makefile create mode 100644 cloudformation/api-gateway-with-lambda/README.md create mode 100644 cloudformation/api-gateway-with-lambda/main.go create mode 100644 cloudformation/api-gateway-with-lambda/template.yml diff --git a/cloudformation/api-gateway-with-lambda/.gitignore b/cloudformation/api-gateway-with-lambda/.gitignore new file mode 100644 index 0000000..fab0672 --- /dev/null +++ b/cloudformation/api-gateway-with-lambda/.gitignore @@ -0,0 +1 @@ +/bootstrap diff --git a/cloudformation/api-gateway-with-lambda/Makefile b/cloudformation/api-gateway-with-lambda/Makefile new file mode 100644 index 0000000..0ac2fe8 --- /dev/null +++ b/cloudformation/api-gateway-with-lambda/Makefile @@ -0,0 +1,28 @@ +.DEFAULT_GOAL := help + +BINARY_NAME = bootstrap +AWS_STACK_NAME = lambda-batch +TEMPLATE_FILE = template.yml + +.PHONY: help clean dependency_check build deploy +help: ## Show this help message + @grep -E '^[0-9a-zA-Z_-]+[[:blank:]]*:.*?## .*$$' $(MAKEFILE_LIST) | sort \ + | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[1;32m%-15s\033[0m %s\n", $$1, $$2}' + +clean: ## Clean project + -rm -rf $(BINARY_NAME) + +dependency_check: ## Check dependencies + @command -v sam > /dev/null 2>&1 || { echo "Error: sam is not installed. See https://github.com/aws/aws-sam-cli"; exit 1; } + +build: ## Build binary + @echo "Building for Lambda execution environment (Linux/ARM64)" + GOOS=linux GOARCH=arm64 go build -o $(BINARY_NAME) main.go + +deploy: dependency_check build ## Deploy CloudFormation Template + sam deploy --stack-name $(AWS_STACK_NAME) --template-file $(TEMPLATE_FILE) \ + --capabilities CAPABILITY_IAM --resolve-s3 --region ap-northeast-1 || { echo "SAM deployment failed"; exit 1; } + +test-deploy: build ## Deploy CloudFormation Template for test + samlocal deploy --stack-name $(AWS_STACK_NAME) --template-file $(TEMPLATE_FILE) \ + --capabilities CAPABILITY_IAM --resolve-s3 --region ap-northeast-1 || { echo "SAM deployment failed"; exit 1; } \ No newline at end of file diff --git a/cloudformation/api-gateway-with-lambda/README.md b/cloudformation/api-gateway-with-lambda/README.md new file mode 100644 index 0000000..e69de29 diff --git a/cloudformation/api-gateway-with-lambda/main.go b/cloudformation/api-gateway-with-lambda/main.go new file mode 100644 index 0000000..b4b8513 --- /dev/null +++ b/cloudformation/api-gateway-with-lambda/main.go @@ -0,0 +1,37 @@ +package main + +import ( + "context" + "encoding/json" + "log" + + "github.com/aws/aws-lambda-go/events" + "github.com/aws/aws-lambda-go/lambda" +) + +// HealthResponse struct defines the response structure +type HealthResponse struct { + Status string `json:"status"` +} + +// Handler is the Lambda function handler +func Handler(_ context.Context) (events.APIGatewayProxyResponse, error) { + // Create a response + responseBody, err := json.Marshal(HealthResponse{Status: "healthy"}) + if err != nil { + log.Printf("Error marshalling JSON response: %v", err) + return events.APIGatewayProxyResponse{StatusCode: 500}, err + } + + // Return API Gateway response + return events.APIGatewayProxyResponse{ + StatusCode: 200, + Headers: map[string]string{"Content-Type": "application/json"}, + Body: string(responseBody), + }, nil +} + +func main() { + // Start the Lambda handler + lambda.Start(Handler) +} diff --git a/cloudformation/api-gateway-with-lambda/template.yml b/cloudformation/api-gateway-with-lambda/template.yml new file mode 100644 index 0000000..3901bb4 --- /dev/null +++ b/cloudformation/api-gateway-with-lambda/template.yml @@ -0,0 +1,71 @@ +AWSTemplateFormatVersion: "2010-09-09" +Transform: + - AWS::Serverless-2016-10-31 +Description: "API Gateway with Lambda" + +Resources: + LambdaFuncttion: + Type: "AWS::Serverless::Function" + Properties: + FunctionName: lambda-function + Handler: "handler" + Runtime: provided.al2 + Architectures: [arm64] + Timeout: 10 + CodeUri: ./ + MemorySize: 128 + Policies: + - AWSLambdaBasicExecutionRole + Events: + GetApi: + Type: Api + Properties: + Path: /health + Method: get + RestApiId: !Ref API + + API: + Type: "AWS::Serverless::Api" + Properties: + Name: sam-test-get-api + EndpointConfiguration: REGIONAL + StageName: dev + + LambdaLogGroup: + Type: "AWS::Logs::LogGroup" + DeletionPolicy: Retain + UpdateReplacePolicy: Retain + Properties: + LogGroupName: !Sub "/aws/lambda/${LambdaFuncttion}" + RetentionInDays: 7 + KmsKeyId: !GetAtt LambdaLogGroupKMSKey.Arn + + LambdaLogGroupKMSKey: + Type: AWS::KMS::Key + UpdateReplacePolicy: Retain + DeletionPolicy: Retain + Properties: + Description: "KMS key for encrypting CloudWatch Logs" + EnableKeyRotation: true + KeyPolicy: + Version: "2012-10-17" + Id: "key-default" + Statement: + - Sid: "Allow administration of the key" + Effect: "Allow" + Principal: + AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root" + Action: + - "kms:*" + Resource: "*" + - Sid: "Allow use of the key" + Effect: "Allow" + Principal: + Service: "logs.ap-northeast-1.amazonaws.com" + Action: + - "kms:Encrypt" + - "kms:Decrypt" + - "kms:ReEncrypt*" + - "kms:GenerateDataKey*" + - "kms:DescribeKey" + Resource: "*" \ No newline at end of file From 4e3d19da89b3687e58ca3dfbf5e8fe9ffbc55311 Mon Sep 17 00:00:00 2001 From: CHIKAMATSU Naohiro Date: Fri, 9 Feb 2024 22:50:40 +0900 Subject: [PATCH 2/3] Fix reviewdog and coderabbit --- .../api-gateway-with-lambda/main.go | 4 +-- cloudformation/lambda-batch/template.yml | 25 +++++++++++++++++-- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/cloudformation/api-gateway-with-lambda/main.go b/cloudformation/api-gateway-with-lambda/main.go index b4b8513..8d951c2 100644 --- a/cloudformation/api-gateway-with-lambda/main.go +++ b/cloudformation/api-gateway-with-lambda/main.go @@ -19,8 +19,8 @@ func Handler(_ context.Context) (events.APIGatewayProxyResponse, error) { // Create a response responseBody, err := json.Marshal(HealthResponse{Status: "healthy"}) if err != nil { - log.Printf("Error marshalling JSON response: %v", err) - return events.APIGatewayProxyResponse{StatusCode: 500}, err + log.Printf("Error marshaling JSON response: %v", err) + return events.APIGatewayProxyResponse{StatusCode: 500, Body: `{"error":"Internal Server Error"}`}, nil } // Return API Gateway response diff --git a/cloudformation/lambda-batch/template.yml b/cloudformation/lambda-batch/template.yml index a8962fb..ffc1461 100644 --- a/cloudformation/lambda-batch/template.yml +++ b/cloudformation/lambda-batch/template.yml @@ -53,7 +53,7 @@ Resources: Properties: LogGroupName: !Sub "/aws/lambda/${LambdaBatch}" RetentionInDays: 7 - KmsKeyId: !Ref LambdaLogGroupKMSKey + KmsKeyId: !GetAtt LambdaLogGroupKMSKey.Arn LambdaLogGroupKMSKey: Type: AWS::KMS::Key @@ -62,4 +62,25 @@ Resources: Properties: Description: "KMS key for encrypting CloudWatch Logs" EnableKeyRotation: true - \ No newline at end of file + KeyPolicy: + Version: "2012-10-17" + Id: "key-default" + Statement: + - Sid: "Allow administration of the key" + Effect: "Allow" + Principal: + AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root" + Action: + - "kms:*" + Resource: "*" + - Sid: "Allow use of the key" + Effect: "Allow" + Principal: + Service: "logs.ap-northeast-1.amazonaws.com" + Action: + - "kms:Encrypt" + - "kms:Decrypt" + - "kms:ReEncrypt*" + - "kms:GenerateDataKey*" + - "kms:DescribeKey" + Resource: "*" \ No newline at end of file From 192e6e6c8fe2447587e52d5c95b27ebd03e55eb9 Mon Sep 17 00:00:00 2001 From: CHIKAMATSU Naohiro Date: Fri, 9 Feb 2024 23:22:41 +0900 Subject: [PATCH 3/3] Update --- README.md | 1 + .../api-gateway-with-lambda/README.md | 39 +++++++++++++ .../lambda-with-apigateway.drawio | 53 ++++++++++++++++++ .../lambda-with-apigateway.png | Bin 0 -> 44723 bytes 4 files changed, 93 insertions(+) create mode 100644 cloudformation/api-gateway-with-lambda/lambda-with-apigateway.drawio create mode 100644 cloudformation/api-gateway-with-lambda/lambda-with-apigateway.png diff --git a/README.md b/README.md index 3c6f611..aecfc43 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ The s3hub command provides following features: |Name|README|implementation| |:--|:--|:--| |[Lambda batch with EventBridge (CloudWatch Events)](./cloudformation/lambda-batch/README.md)|✅|100%| +|[Lambda with API Gateway](./cloudformation/api-gateway-with-lambda/README.md)|✅|100%| |[CloudWatch Real User Monitoring (RUM)](./cloudformation/cloudwatch-rum/README.md)|✅|100%| diff --git a/cloudformation/api-gateway-with-lambda/README.md b/cloudformation/api-gateway-with-lambda/README.md index e69de29..b339be9 100644 --- a/cloudformation/api-gateway-with-lambda/README.md +++ b/cloudformation/api-gateway-with-lambda/README.md @@ -0,0 +1,39 @@ +## API Gateway with Lambda +### Overview + +Lambda and API Gateway combined infrastructure is a powerful means for realizing serverless architecture. Lambda is a service for executing code, while API Gateway creates HTTP endpoints and forwards requests to Lambda functions. + +![lambda-with-apigateway](./lambda-with-apigateway.png) + +This combination offers the following characteristics: + +- Simplified Serverless Architecture: Combining API Gateway with Lambda allows for the creation of a serverless architecture, eliminating issues with server management and scaling. +- Cost Efficiency: Being billed only for the resources you use, costs can scale with traffic, reducing wasteful spending. +- Seamless Integration: API Gateway provides seamless integration with Lambda, allowing you to define API endpoints and route requests to Lambda functions. +- Facilitates the implementation of microservices architecture, allowing deployment of independent Lambda functions for each functionality. + +### Limitations +- Long Processing Time: Lambda functions are limited by execution time. If long processing is required, Lambda might not be suitable. Alternative methods should be explored for long-running processes. +- Heavy Data Processing: Lambda functions have resource limits. For tasks requiring heavy data processing or significant memory, other services or architectures might be more suitable. +- Always Active Services: Lambda is event-driven and goes to sleep when there are no requests. For services that need to be always active or for background processing, Lambda might not be appropriate. + + +### How to deploy +> [!NOTE] +> Before running `make deploy`, ensure you have configured AWS credentials and set the correct region. Otherwise, you use single sign-on (SSO). + +```shell +$ make deploy +``` + +### Endpoint Base URL Syntax +The URL syntax for the API Gateway endpoint is as follows: + +``` +https://.execute-api..amazonaws.com/ +``` + +- ``: The API Gateway ID. +- ``: The AWS region where the API Gateway is deployed. +- ``: The stage name of the API Gateway. + diff --git a/cloudformation/api-gateway-with-lambda/lambda-with-apigateway.drawio b/cloudformation/api-gateway-with-lambda/lambda-with-apigateway.drawio new file mode 100644 index 0000000..a754b3f --- /dev/null +++ b/cloudformation/api-gateway-with-lambda/lambda-with-apigateway.drawio @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cloudformation/api-gateway-with-lambda/lambda-with-apigateway.png b/cloudformation/api-gateway-with-lambda/lambda-with-apigateway.png new file mode 100644 index 0000000000000000000000000000000000000000..a220008b1cc6ddffeeaa31535c4ecdf0d81685ec GIT binary patch literal 44723 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 BaGC%B literal 0 HcmV?d00001