Skip to content

Commit f65ec32

Browse files
authored
[doc] add a deployment guide and update the readme (#432)
As discussed with @0xTim This PR - adds a minimal example of deployment using SAM in the README - adds a `Deployment.md` Swift Docc file to cover deployment with the AWS console, CLI, SAM, and CDK. It mentions and contains a call to contributions to further examples for third-party tools such as the Serverless Framework, Terraform, or Pulumi.
1 parent cef85b9 commit f65ec32

15 files changed

+955
-18
lines changed

Examples/_MyFirstFunction/.gitignore

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.DS_Store
2+
/.build
3+
/Packages
4+
xcuserdata/
5+
DerivedData/
6+
.swiftpm/configuration/registries.json
7+
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
8+
.netrc

Examples/_MyFirstFunction/clean.sh

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/bin/bash
2+
##===----------------------------------------------------------------------===##
3+
##
4+
## This source file is part of the SwiftAWSLambdaRuntime open source project
5+
##
6+
## Copyright (c) 2017-2024 Apple Inc. and the SwiftAWSLambdaRuntime project authors
7+
## Licensed under Apache License v2.0
8+
##
9+
## See LICENSE.txt for license information
10+
## See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors
11+
##
12+
## SPDX-License-Identifier: Apache-2.0
13+
##
14+
##===----------------------------------------------------------------------===##
15+
16+
echo "This script deletes the Lambda function and the IAM role created in the previous step and deletes the project files."
17+
read -r -p "Are you you sure you want to delete everything that was created? [y/n] " continue
18+
if [[ ! $continue =~ ^[Yy]$ ]]; then
19+
echo "OK, try again later when you feel ready"
20+
exit 1
21+
fi
22+
23+
echo "🚀 Deleting the Lambda function and the role"
24+
aws lambda delete-function --function-name MyLambda
25+
aws iam detach-role-policy \
26+
--role-name lambda_basic_execution \
27+
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
28+
aws iam delete-role --role-name lambda_basic_execution
29+
30+
echo "🚀 Deleting the project files"
31+
rm -rf .build
32+
rm -rf ./Sources
33+
rm trust-policy.json
34+
rm Package.swift Package.resolved
35+
36+
echo "🎉 Done! Your project is cleaned up and ready for a fresh start."
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
#!/bin/bash
2+
##===----------------------------------------------------------------------===##
3+
##
4+
## This source file is part of the SwiftAWSLambdaRuntime open source project
5+
##
6+
## Copyright (c) 2017-2024 Apple Inc. and the SwiftAWSLambdaRuntime project authors
7+
## Licensed under Apache License v2.0
8+
##
9+
## See LICENSE.txt for license information
10+
## See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors
11+
##
12+
## SPDX-License-Identifier: Apache-2.0
13+
##
14+
##===----------------------------------------------------------------------===##
15+
16+
# Stop the script execution if an error occurs
17+
set -e -o pipefail
18+
19+
check_prerequisites() {
20+
# check if docker is installed
21+
which docker > /dev/null || (echo "Docker is not installed. Please install Docker and try again." && exit 1)
22+
23+
# check if aws cli is installed
24+
which aws > /dev/null || (echo "AWS CLI is not installed. Please install AWS CLI and try again." && exit 1)
25+
26+
# check if user has an access key and secret access key
27+
echo "This script creates and deploys a Lambda function on your AWS Account.
28+
29+
You must have an AWS account and know an AWS access key, secret access key, and an optional session token.
30+
These values are read from '~/.aws/credentials'.
31+
"
32+
33+
read -r -p "Are you ready to create your first Lambda function in Swift? [y/n] " continue
34+
if [[ ! $continue =~ ^[Yy]$ ]]; then
35+
echo "OK, try again later when you feel ready"
36+
exit 1
37+
fi
38+
}
39+
40+
create_lambda_execution_role() {
41+
role_name=$1
42+
43+
# Allow the Lambda service to assume the IAM role
44+
cat <<EOF > trust-policy.json
45+
{
46+
"Version": "2012-10-17",
47+
"Statement": [
48+
{
49+
"Effect": "Allow",
50+
"Principal": {
51+
"Service": "lambda.amazonaws.com"
52+
},
53+
"Action": "sts:AssumeRole"
54+
}
55+
]
56+
}
57+
EOF
58+
59+
# Create the IAM role
60+
echo "🔐 Create the IAM role for the Lambda function"
61+
aws iam create-role \
62+
--role-name "${role_name}" \
63+
--assume-role-policy-document file://trust-policy.json > /dev/null 2>&1
64+
65+
# Attach basic permissions to the role
66+
# The AWSLambdaBasicExecutionRole policy grants permissions to write logs to CloudWatch Logs
67+
echo "🔒 Attach basic permissions to the role"
68+
aws iam attach-role-policy \
69+
--role-name "${role_name}" \
70+
--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole > /dev/null 2>&1
71+
72+
echo "⏰ Waiting 10 secs for IAM role to propagate..."
73+
sleep 10
74+
}
75+
76+
create_swift_project() {
77+
echo "⚡️ Create your Swift Lambda project"
78+
swift package init --type executable --name MyLambda > /dev/null
79+
80+
echo "📦 Add the AWS Lambda Swift runtime to your project"
81+
# The following commands are commented out until the `lambad-init` plugin will be release
82+
# swift package add-dependency https://github.com/swift-server/swift-aws-lambda-runtime.git --branch main
83+
# swift package add-dependency https://github.com/swift-server/swift-aws-lambda-events.git --branch main
84+
# swift package add-target-dependency AWSLambdaRuntime MyLambda --package swift-aws-lambda-runtime
85+
# swift package add-target-dependency AWSLambdaEvents MyLambda --package swift-aws-lambda-events
86+
cat <<EOF > Package.swift
87+
// swift-tools-version:6.0
88+
89+
import PackageDescription
90+
91+
let package = Package(
92+
name: "swift-aws-lambda-runtime-example",
93+
platforms: [.macOS(.v15)],
94+
products: [
95+
.executable(name: "MyLambda", targets: ["MyLambda"])
96+
],
97+
dependencies: [
98+
.package(url: "https://github.com/swift-server/swift-aws-lambda-runtime.git", branch: "main")
99+
],
100+
targets: [
101+
.executableTarget(
102+
name: "MyLambda",
103+
dependencies: [
104+
.product(name: "AWSLambdaRuntime", package: "swift-aws-lambda-runtime")
105+
],
106+
path: "."
107+
)
108+
]
109+
)
110+
EOF
111+
112+
echo "📝 Write the Swift code"
113+
# The following command is commented out until the `lambad-init` plugin will be release
114+
# swift package lambda-init --allow-writing-to-package-directory
115+
cat <<EOF > Sources/main.swift
116+
import AWSLambdaRuntime
117+
118+
let runtime = LambdaRuntime {
119+
(event: String, context: LambdaContext) in
120+
"Hello \(event)"
121+
}
122+
123+
try await runtime.run()
124+
EOF
125+
126+
echo "📦 Compile and package the function for deployment (this might take a while)"
127+
swift package archive --allow-network-connections docker > /dev/null 2>&1
128+
}
129+
130+
deploy_lambda_function() {
131+
echo "🚀 Deploy to AWS Lambda"
132+
133+
# retrieve your AWS Account ID
134+
echo "🔑 Retrieve your AWS Account ID"
135+
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
136+
export AWS_ACCOUNT_ID
137+
138+
# Check if the role already exists
139+
echo "🔍 Check if a Lambda execution IAM role already exists"
140+
aws iam get-role --role-name lambda_basic_execution > /dev/null 2>&1 || create_lambda_execution_role lambda_basic_execution
141+
142+
# Create the Lambda function
143+
echo "🚀 Create the Lambda function"
144+
aws lambda create-function \
145+
--function-name MyLambda \
146+
--zip-file fileb://.build/plugins/AWSLambdaPackager/outputs/AWSLambdaPackager/MyLambda/MyLambda.zip \
147+
--runtime provided.al2 \
148+
--handler provided \
149+
--architectures "$(uname -m)" \
150+
--role arn:aws:iam::"${AWS_ACCOUNT_ID}":role/lambda_basic_execution > /dev/null 2>&1
151+
152+
echo "⏰ Waiting 10 secs for the Lambda function to be ready..."
153+
sleep 10
154+
}
155+
156+
invoke_lambda_function() {
157+
# Invoke the Lambda function
158+
echo "🔗 Invoke the Lambda function"
159+
aws lambda invoke \
160+
--function-name MyLambda \
161+
--cli-binary-format raw-in-base64-out \
162+
--payload '"Lambda Swift"' \
163+
output.txt > /dev/null 2>&1
164+
165+
echo "👀 Your Lambda function returned:"
166+
cat output.txt && rm output.txt
167+
}
168+
169+
main() {
170+
#
171+
# Check prerequisites
172+
#
173+
check_prerequisites
174+
175+
#
176+
# Create the Swift project
177+
#
178+
create_swift_project
179+
180+
#
181+
# Now the function is ready to be deployed to AWS Lambda
182+
#
183+
deploy_lambda_function
184+
185+
#
186+
# Invoke the Lambda function
187+
#
188+
invoke_lambda_function
189+
190+
echo ""
191+
echo "🎉 Done! Your first Lambda function in Swift is now deployed on AWS Lambda. 🚀"
192+
}
193+
194+
main "$@"

0 commit comments

Comments
 (0)