Skip to content

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

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion content/en/20-prerequisites/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ To perform this tutorial, you need the following:
- for **AWS Lambda**:
- You can call APIs of Lambda from your local to your AWS account. See [here](https://pipecd.dev/docs/installation/install-piped/required-permissions/#for-lambdaapp) for details.
- You have all of (i.e. all you need to create a Lambda function):
- an image in your ECR Repository
- function’s execution role
- for **Terraform**:
- You can execute [`terraform` commands](https://developer.hashicorp.com/terraform/cli/commands) on local.
Expand Down
8 changes: 4 additions & 4 deletions content/en/40-deploy/01-simply.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ In this page, you will deploy an application to your platform in a simple way.
- `servicedef.yaml`: Edit `cluster`, `securityGroups`, and `subnets`.
- `taskdef.yaml`: Edit `executionRoleArn`.
- For **AWS Lambda**:
- You will create a function of your own image.
- Edit `lambda/simple/` as below.
- `function.yaml`: Edit `role` and `image`.
- Create a function from Python source code.
- Edit `lambda/simple/function.yaml`: Edit the `role` field.
- **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.
- Edit `terraform/simple/` as below.
Expand Down Expand Up @@ -91,4 +91,4 @@ In this page, you will deploy an application to your platform in a simple way.

[Next: Deploy with a Customized Pipeline >](02-pipeline.md)

[< Previous: Deploy](README.md)
[< Previous: Deploy](README.md)
6 changes: 3 additions & 3 deletions content/en/40-deploy/02-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
- Create a function from Python source code using a canary deployment strategy.
- Edit `lambda/canary/function.yaml`: Edit the `role` field.
- **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.
Expand Down
1 change: 0 additions & 1 deletion content/ja/20-prerequisites/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
- **AWS Lambda**向け:
- ローカルからあなたのAWSアカウントに対して、Lambdaの各種APIを実行できること。詳細は[こちら](https://pipecd.dev/docs/installation/install-piped/required-permissions/#for-lambdaapp)。
- 下記のすべて。(一般的なLambda関数を作る際に必要なものと同じです)
- ECRリポジトリにイメージがあること
- 関数の実行ロール
- **Terraform**向け:
- [`terraform` commands](https://developer.hashicorp.com/terraform/cli/commands)をローカルから実行できること。
Expand Down
8 changes: 4 additions & 4 deletions content/ja/40-deploy/01-simply.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
- `servicedef.yaml`: `cluster`, `securityGroups`, `subnets`
- `taskdef.yaml`: `executionRoleArn`.
- **AWS Lambda**向け:
- あなたのイメージを利用して関数をデプロイしていきます
- `lambda/simple/`の以下の箇所を編集してください
- `function.yaml`: `role`, `image`
- Pythonソースコードから関数を作成します
- `lambda/simple/function.yaml`を編集: `role`フィールドを編集してください
- **ZIPファイルを手動でビルドやアップロードする必要はありません。PipeCDが自動的に関数をパッケージ化してデプロイします。**
- **Terraform**向け:
- ファイルをローカルに生成していきます。
- `terraform/simple/`の以下の箇所を編集してください。
Expand Down Expand Up @@ -91,4 +91,4 @@

[次: カスタムのパイプラインでデプロイ>](02-pipeline.md)

[< 戻る: Deploy](README.md)
[< 戻る: Deploy](README.md)
6 changes: 3 additions & 3 deletions content/ja/40-deploy/02-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +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/`を以下のように編集してください
- `function.yaml`: `/src/deploy/lambda/simple/function.yaml`からコピーして、`name`を変更
- Canaryデプロイ戦略を使用してPythonソースコードから関数を作成します
- `lambda/canary/function.yaml`を編集: `role`フィールドを編集してください
- **ZIPファイルを手動でビルドやアップロードする必要はありません。PipeCDが自動的に関数をパッケージ化してデプロイします。**
- **Terraform**向け:
- ファイルをローカルに生成していきます。plan->承認->applyのパイプラインを構築します。
- `terraform/plan-approval-apply/`の下記の箇所を編集してください。
Expand Down
19 changes: 16 additions & 3 deletions src/deploy/lambda/canary/function.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,21 @@
apiVersion: pipecd.dev/v1beta1
kind: LambdaFunction
spec:
name: PipeCDTutorial_Canary
name: CanaryZipFunction
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 the Amazon ECR registry.
# Using PipeCD's built-in source code packaging - no manual zip building or S3 uploads needed!
source:
# git remote address where the source code is placing.
git: https://github.com/<YOUR_GITHUB_ACCOUNT_ID>/<YOUR_REPOSITORY_NAME>.git # [EDIT_HERE]
# the commit SHA or tag for remote git. Use branch name means you will always use
# the latest code of that branch as Lambda function code which is NOT recommended.
ref: main # [EDIT_HERE] Using main branch for simplicity in the tutorial
# relative path from the repository root directory to the function code directory.
path: "src"
runtime: python3.9
handler: index.lambda_handler
memory: 512
timeout: 30
timeout: 30
environment:
FUNCTION_VERSION: "v2.0.0"
DEPLOYMENT_TYPE: "canary"
85 changes: 85 additions & 0 deletions src/deploy/lambda/canary/src/index.py
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))
13 changes: 13 additions & 0 deletions src/deploy/lambda/canary/src/requirements.txt
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
18 changes: 15 additions & 3 deletions src/deploy/lambda/simple/function.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,20 @@
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 remote address where the source code is placing.
git: https://github.com/<YOUR_GITHUB_ACCOUNT_ID>/<YOUR_REPOSITORY_NAME>.git # [EDIT_HERE]
# the commit SHA or tag for remote git. Use branch name means you will always use
# the latest code of that branch as Lambda function code which is NOT recommended.
ref: main # [EDIT_HERE] Using main branch for simplicity in the tutorial
# relative path from the repository root directory to the function code directory.
path: "src"
runtime: python3.9
handler: index.lambda_handler
memory: 512
timeout: 30
timeout: 30
environment:
FUNCTION_VERSION: "v1.0.0"
76 changes: 76 additions & 0 deletions src/deploy/lambda/simple/src/index.py
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))
13 changes: 13 additions & 0 deletions src/deploy/lambda/simple/src/requirements.txt
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