-
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 3 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 |
|---|---|---|
| @@ -0,0 +1,157 @@ | ||
| # Lambda Deployment with PipeCD Tutorial | ||
|
|
||
| This directory contains examples for deploying AWS Lambda functions using PipeCD with **direct source code deployment** instead of container images, making it much easier to get started. | ||
|
|
||
| ## 🎯 What's New (Issue #16) | ||
|
|
||
| Previously, the Lambda tutorial required: | ||
| - ❌ Building and pushing container images to ECR | ||
| - ❌ Complex Docker setup | ||
| - ❌ ECR repository management | ||
|
|
||
| Now it uses: | ||
| - ✅ Simple Python source code | ||
| - ✅ **Automatic packaging by PipeCD** | ||
| - ✅ **No manual zip building or S3 uploads** | ||
| - ✅ Minimal prerequisites (just an IAM role) | ||
|
||
|
|
||
| ## 📁 Directory Structure | ||
|
|
||
| ``` | ||
| lambda/ | ||
| ├── simple/ # Simple deployment example | ||
| │ ├── src/ | ||
| │ │ ├── index.py # Lambda function source code | ||
| │ │ └── requirements.txt # Python dependencies | ||
| │ ├── function.yaml # Lambda function configuration | ||
| │ └── app.pipecd.yaml # PipeCD application config | ||
| ├── canary/ # Canary deployment example | ||
| │ ├── src/ | ||
| │ │ ├── index.py # Enhanced Lambda function | ||
| │ │ └── requirements.txt # Python dependencies | ||
| │ ├── function.yaml # Lambda function configuration | ||
| │ └── app.pipecd.yaml # PipeCD canary pipeline config | ||
| └── README.md # This file | ||
| ``` | ||
|
|
||
| ## 🚀 Quick Start | ||
|
|
||
| ### Prerequisites | ||
|
|
||
| 1. **AWS CLI configured** with appropriate permissions | ||
| 2. **IAM role** for Lambda execution | ||
|
|
||
| ### Step 1: Configure function.yaml | ||
|
|
||
| Edit `simple/function.yaml`: | ||
|
|
||
| ```yaml | ||
| spec: | ||
| name: PipeCDTutorial_Simple | ||
| role: arn:aws:iam::123456789012:role/lambda-execution-role | ||
| source: | ||
| git: "" # Empty means same repository | ||
| ref: "" # Empty means current commit | ||
| path: "src" # Path to source code directory | ||
| runtime: python3.9 | ||
| handler: index.lambda_handler | ||
| ``` | ||
| ### Step 2: Deploy with PipeCD | ||
| Follow the main tutorial instructions to register and deploy the application. | ||
| **That's it!** PipeCD will automatically: | ||
| - Package your source code into a zip file | ||
| - Deploy it to AWS Lambda | ||
| - Handle all the complexity for you | ||
| ## 📋 Function Details | ||
| ### Simple Function (`simple/src/index.py`) | ||
|
|
||
| - Returns a JSON response with greeting and metadata | ||
| - Includes request information and timestamps | ||
| - Uses only Python standard library (no dependencies) | ||
| - Perfect for testing basic Lambda deployment | ||
|
|
||
| ### Canary Function (`canary/src/index.py`) | ||
|
|
||
| - Enhanced version with deployment tracking | ||
| - Additional logging for canary deployment monitoring | ||
| - Environment variables for version control | ||
| - Demonstrates gradual rollout capabilities | ||
|
|
||
| ## 🔧 Customization | ||
|
|
||
| ### Adding Dependencies | ||
|
|
||
| 1. Edit `src/requirements.txt`: | ||
| ``` | ||
| requests==2.31.0 | ||
| boto3==1.34.0 | ||
| ``` | ||
|
|
||
| 2. Commit and push - PipeCD will automatically install dependencies during packaging | ||
|
|
||
| ### Modifying the Function | ||
|
|
||
| 1. Edit `src/index.py` with your custom logic | ||
| 2. Test locally: `python src/index.py` | ||
| 3. Commit and push - PipeCD handles the rest | ||
|
|
||
| ### Environment Variables | ||
|
|
||
| Add environment variables in `function.yaml`: | ||
|
|
||
| ```yaml | ||
| spec: | ||
| environment: | ||
| CUSTOM_VAR: "custom_value" | ||
| API_ENDPOINT: "https://api.example.com" | ||
| ``` | ||
|
|
||
| ## 🧪 Local Testing | ||
|
|
||
| Test your function locally before deployment: | ||
|
|
||
| ```bash | ||
| cd simple/src/ | ||
| python index.py | ||
| ``` | ||
|
|
||
| This runs the function with a test event and displays the output. | ||
|
|
||
| ## 📊 Deployment Strategies | ||
|
|
||
| ### Simple Deployment | ||
| - Uses `simple/` directory | ||
| - Quick sync strategy | ||
| - Immediate deployment | ||
|
|
||
| ### Canary Deployment | ||
| - Uses `canary/` directory | ||
| - Gradual traffic shifting (10% → 50% → 100%) | ||
| - Built-in rollback capabilities | ||
| - Wait stages for monitoring | ||
|
|
||
| ## 🔍 Troubleshooting | ||
|
|
||
| ### Deployment Issues | ||
| - Verify IAM role has Lambda execution permissions | ||
| - Check function.yaml syntax | ||
| - Ensure source code is in the correct directory structure | ||
|
|
||
| ### Runtime Issues | ||
| - Review CloudWatch logs | ||
| - Test function locally first | ||
| - Verify environment variables | ||
|
|
||
| ## 📚 Next Steps | ||
|
|
||
| 1. Try the simple deployment first | ||
| 2. Experiment with the canary deployment | ||
| 3. Customize the function for your use case | ||
| 4. Explore PipeCD's advanced Lambda features | ||
|
|
||
| For more information, see the [PipeCD Lambda documentation](https://pipecd.dev/docs/user-guide/configuration-reference/#lambda-application). | ||
| 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" | ||
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.
Users cannot find this file. Move to a better place.
Do you understand the tutorial flow?
Uh oh!
There was an error while loading. Please reload this page.
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.
Thank you @t-kikuc for your feedback. I initially focused on the Lambda ZIP deployment itself, but after your comments, I reviewed the tutorial structure to ensure my changes fit the main flow. I’ve deleted the standalone
Lambda READMEand moved the instructions into01-simply.mdand02-pipeline.mdfor clarity. Thanks again for helping me see the tutorial from the user’s perspective!