-
Notifications
You must be signed in to change notification settings - Fork 2
feat: Simplify Lambda deployment with zip files instead of container images #18
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 4 commits
e61ef22
c0b5cc3
76a1c4d
cfd3d2c
8456252
918d6a4
5c377df
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -21,9 +21,9 @@ _The process is almost the same as [1. Deploy Simply](01-simply.md). Only the co | |
| - `servicedef.yaml`: Copy from your `/src/deploy/ecs/simple/servicedef.yaml` and rename `serviceName`. | ||
| - `taskdef.yaml`: Copy from your `/src/deploy/ecs/simple/taskdef.yaml` and rename `family`. | ||
| - For **AWS Lambda**: | ||
| - You will create a function of your own image by Canary release. | ||
| - Edit `lambda/canary/` as below. | ||
| - `function.yaml`: Copy from your `/src/deploy/lambda/simple/function.yaml`] and rename `name`. | ||
| - You will create a function from your own Python source code using a canary deployment strategy. | ||
| - Edit `lambda/canary/function.yaml`: Copy from your `src/deploy/lambda/simple/function.yaml` and rename the `name`. | ||
|
||
| - **No need to build or upload a ZIP file manually. PipeCD will package and deploy your function automatically.** | ||
| - For **Terraform**: | ||
| - You will generate a file on local with plan->approval->apply pipeline. | ||
| - Edit `terraform/plan-approval-apply/` as below. | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -21,8 +21,9 @@ _手順は[1. シンプルなデプロイ](01-simply.md)とほとんど同じで | |||||
| - `servicedef.yaml`: `/src/deploy/ecs/simple/servicedef.yaml`からコピーして、`serviceName`を変更 | ||||||
| - `taskdef.yaml`: `/src/deploy/ecs/simple/taskdef.yaml`からコピーして、`family`を変更 | ||||||
| - **AWS Lambda**向け: | ||||||
| - あなたのイメージを利用して関数をCanaryリリースしていきます。 | ||||||
| - `lambda/canary/`を以下のように編集してください。 | ||||||
| - Canaryデプロイ戦略を使用してあなた自身のPythonソースコードから関数を作成します。 | ||||||
|
||||||
| - Canaryデプロイ戦略を使用してあなた自身のPythonソースコードから関数を作成します。 | |
| - Canaryデプロイ戦略を使用してPythonソースコードから関数を作成します。 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,85 @@ | ||
| """ | ||
| Canary Lambda function for PipeCD Tutorial | ||
|
|
||
| This is a Lambda function for demonstrating canary deployments with PipeCD. | ||
| It includes version information and enhanced logging for deployment tracking. | ||
| """ | ||
|
|
||
| import json | ||
| import os | ||
| from datetime import datetime, timezone | ||
|
|
||
|
|
||
| def lambda_handler(event, context): | ||
| """ | ||
| AWS Lambda handler function for canary deployment demo | ||
|
|
||
| Args: | ||
| event: The event dict that contains the request data | ||
| context: The context object that contains runtime information | ||
|
|
||
| Returns: | ||
| dict: Response object with statusCode, headers, and body | ||
| """ | ||
|
|
||
| # Get environment variables | ||
| function_name = context.function_name if context else "unknown" | ||
| version = os.environ.get('FUNCTION_VERSION', 'v2.0.0') | ||
| deployment_type = os.environ.get('DEPLOYMENT_TYPE', 'canary') | ||
|
|
||
| # Create response message with canary-specific information | ||
| message = { | ||
| "greeting": "Hello from PipeCD Tutorial Lambda (Canary)!", | ||
| "function_name": function_name, | ||
| "version": version, | ||
| "deployment_type": deployment_type, | ||
| "timestamp": datetime.now(timezone.utc).isoformat(), | ||
| "canary_info": { | ||
| "strategy": "gradual rollout", | ||
| "traffic_percentage": "controlled by PipeCD pipeline" | ||
| }, | ||
| "event_info": { | ||
| "http_method": event.get("httpMethod", "N/A"), | ||
| "path": event.get("path", "N/A"), | ||
| "query_params": event.get("queryStringParameters") or {} | ||
| } | ||
| } | ||
|
|
||
| # Enhanced logging for canary deployment tracking | ||
| print(f"🚀 Canary deployment - Processing request for {function_name} version {version}") | ||
| print(f"📊 Deployment type: {deployment_type}") | ||
| print(f"📝 Event: {json.dumps(event, default=str)}") | ||
|
|
||
| # Return response with canary-specific headers | ||
| response = { | ||
| "statusCode": 200, | ||
| "headers": { | ||
| "Content-Type": "application/json", | ||
| "Access-Control-Allow-Origin": "*", | ||
| "Access-Control-Allow-Headers": "Content-Type", | ||
| "Access-Control-Allow-Methods": "GET, POST, OPTIONS", | ||
| "X-Function-Version": version, | ||
| "X-Deployment-Type": deployment_type | ||
| }, | ||
| "body": json.dumps(message, indent=2) | ||
| } | ||
|
|
||
| return response | ||
|
|
||
|
|
||
| # For local testing | ||
| if __name__ == "__main__": | ||
| # Test event | ||
| test_event = { | ||
| "httpMethod": "GET", | ||
| "path": "/canary-test", | ||
| "queryStringParameters": {"deployment": "canary"} | ||
| } | ||
|
|
||
| # Mock context | ||
| class MockContext: | ||
| function_name = "pipecd-tutorial-canary-local" | ||
|
|
||
| result = lambda_handler(test_event, MockContext()) | ||
| print("Canary test result:") | ||
| print(json.dumps(result, indent=2)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| # Requirements for PipeCD Tutorial Lambda Function (Canary) | ||
| # This file lists the Python dependencies needed for the canary Lambda function | ||
|
|
||
| # No external dependencies required for this simple example | ||
| # The function only uses Python standard library modules: | ||
| # - json (built-in) | ||
| # - os (built-in) | ||
| # - datetime (built-in) | ||
|
|
||
| # If you need to add dependencies in the future, list them here | ||
| # For example: | ||
| # requests==2.31.0 | ||
| # boto3==1.34.0 |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,8 +2,16 @@ | |
| apiVersion: pipecd.dev/v1beta1 | ||
| kind: LambdaFunction | ||
| spec: | ||
| name: PipeCDTutorial_Simple | ||
| name: SimpleZipFunction | ||
| role: <IAM_ROLE_ARN> # [EDIT_HERE] The ARN of the function’s execution role. | ||
| image: <IMAGE_URI> # [EDIT_HERE] The URI of a container image in your ECR repository. | ||
| # Using PipeCD's built-in source code packaging - no manual zip building or S3 uploads needed! | ||
| source: | ||
| git: "" # Empty means same repository | ||
| ref: "" # Empty means current commit | ||
|
||
| path: "src" # Path to source code directory relative to this function.yaml | ||
| runtime: python3.9 | ||
| handler: index.lambda_handler | ||
| memory: 512 | ||
| timeout: 30 | ||
| timeout: 30 | ||
| environment: | ||
| FUNCTION_VERSION: "v1.0.0" | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,76 @@ | ||
| """ | ||
| Simple Lambda function for PipeCD Tutorial | ||
|
|
||
| This is a basic Lambda function that demonstrates deployment with PipeCD. | ||
| It returns a simple JSON response with a greeting message. | ||
| """ | ||
|
|
||
| import json | ||
| import os | ||
| from datetime import datetime, timezone | ||
|
|
||
|
|
||
| def lambda_handler(event, context): | ||
| """ | ||
| AWS Lambda handler function | ||
|
|
||
| Args: | ||
| event: The event dict that contains the request data | ||
| context: The context object that contains runtime information | ||
|
|
||
| Returns: | ||
| dict: Response object with statusCode, headers, and body | ||
| """ | ||
|
|
||
| # Get environment variables | ||
| function_name = context.function_name if context else "unknown" | ||
| version = os.environ.get('FUNCTION_VERSION', 'v1.0.0') | ||
|
|
||
| # Create response message | ||
| message = { | ||
| "greeting": "Hello from PipeCD Tutorial Lambda!", | ||
| "function_name": function_name, | ||
| "version": version, | ||
| "timestamp": datetime.now(timezone.utc).isoformat(), | ||
| "event_info": { | ||
| "http_method": event.get("httpMethod", "N/A"), | ||
| "path": event.get("path", "N/A"), | ||
| "query_params": event.get("queryStringParameters") or {} | ||
| } | ||
| } | ||
|
|
||
| # Log the request | ||
| print(f"Processing request for {function_name} version {version}") | ||
| print(f"Event: {json.dumps(event, default=str)}") | ||
|
|
||
| # Return response | ||
| response = { | ||
| "statusCode": 200, | ||
| "headers": { | ||
| "Content-Type": "application/json", | ||
| "Access-Control-Allow-Origin": "*", | ||
| "Access-Control-Allow-Headers": "Content-Type", | ||
| "Access-Control-Allow-Methods": "GET, POST, OPTIONS" | ||
| }, | ||
| "body": json.dumps(message, indent=2) | ||
| } | ||
|
|
||
| return response | ||
|
|
||
|
|
||
| # For local testing | ||
| if __name__ == "__main__": | ||
| # Test event | ||
| test_event = { | ||
| "httpMethod": "GET", | ||
| "path": "/test", | ||
| "queryStringParameters": {"name": "PipeCD"} | ||
| } | ||
|
|
||
| # Mock context | ||
| class MockContext: | ||
| function_name = "pipecd-tutorial-local" | ||
|
|
||
| result = lambda_handler(test_event, MockContext()) | ||
| print("Test result:") | ||
| print(json.dumps(result, indent=2)) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| # Requirements for PipeCD Tutorial Lambda Function | ||
| # This file lists the Python dependencies needed for the Lambda function | ||
|
|
||
| # No external dependencies required for this simple example | ||
| # The function only uses Python standard library modules: | ||
| # - json (built-in) | ||
| # - os (built-in) | ||
| # - datetime (built-in) | ||
|
|
||
| # If you need to add dependencies in the future, list them here | ||
| # For example: | ||
| # requests==2.31.0 | ||
| # boto3==1.34.0 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
not 'your own code'