Skip to content
Open
Show file tree
Hide file tree
Changes from 4 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
6 changes: 3 additions & 3 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`.
- You will create a function from your own Python source code.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not 'your own 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
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`.
- 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`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are you gonna copy??

- **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
6 changes: 3 additions & 3 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
5 changes: 3 additions & 2 deletions content/ja/40-deploy/02-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -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ソースコードから関数を作成します。
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
- Canaryデプロイ戦略を使用してあなた自身のPythonソースコードから関数を作成します
- Canaryデプロイ戦略を使用してPythonソースコードから関数を作成します

- `lambda/canary/function.yaml`を編集: `src/deploy/lambda/simple/function.yaml`からコピーして`name`を変更してください。
- **ZIPファイルを手動でビルドやアップロードする必要はありません。PipeCDが自動的に関数をパッケージ化してデプロイします。**
- `function.yaml`: `/src/deploy/lambda/simple/function.yaml`からコピーして、`name`を変更
- **Terraform**向け:
- ファイルをローカルに生成していきます。plan->承認->applyのパイプラインを構築します。
Expand Down
15 changes: 12 additions & 3 deletions src/deploy/lambda/canary/function.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,17 @@
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: "" # 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: "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
14 changes: 11 additions & 3 deletions src/deploy/lambda/simple/function.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how did you know this spec?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

how did you know this spec?

hey @t-kikuc I implemented this based on the code comments and the pattern I saw in other PipeCD resources. The Helm chart docs mention that 'Empty means the same repository' (https://pipecd.dev/docs-v0.52.x/user-guide/configuration-reference/#analysis-template-configuration:~:text=Empty%20means%20the%20same%20repository), and I assumed this convention applies to Lambda functions too.

If this approach isn't correct for Lambda functions, I'd appreciate your guidance on what values should be used instead for the tutorial. Should we use explicit git/ref values or is there a better way to reference the current repository?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not helm chart.

See https://pipecd.dev/docs-v0.52.x/user-guide/managing-application/defining-app-configuration/lambda/ and https://github.com/pipe-cd/pipecd/blob/0c999367d009c143baa72785d4ad6bd841bdb189/pkg/app/piped/platformprovider/lambda/function.go#L128-L142

@t-kikuc Thank you for pointing out my mistake with the empty git / ref fields. I've corrected both function.yaml files to align exactly with the documentation at https://pipecd.dev/docs-v0.52.x/user-guide/managing-application/defining-app-configuration/lambda/#:~:text=Deploy%20source%20code,Lambda%20function%20pattern. I've maintained the same comment style as the official example while using HTTPS URLs for GitHub repositories, which is more beginner-friendly for the tutorial. The [EDIT_HERE] markers will guide users to replace these values with their own repository information.

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"
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