Skip to content

Commit 00d178e

Browse files
RUBY-3149 Test on AWS Lambda (#2800)
1 parent 11dc883 commit 00d178e

14 files changed

+874
-1
lines changed

Diff for: .evergreen/atlas

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../.mod/drivers-evergreen-tools/.evergreen/atlas

Diff for: .evergreen/config.yml

+90
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,8 @@ task_groups:
482482
script: |
483483
${PREPARE_SHELL}
484484
485+
echo "Setting up Atlas cluster"
486+
485487
DRIVERS_ATLAS_PUBLIC_API_KEY="${DRIVERS_ATLAS_PUBLIC_API_KEY}" \
486488
DRIVERS_ATLAS_PRIVATE_API_KEY="${DRIVERS_ATLAS_PRIVATE_API_KEY}" \
487489
DRIVERS_ATLAS_GROUP_ID="${DRIVERS_ATLAS_GROUP_ID}" \
@@ -492,6 +494,8 @@ task_groups:
492494
task_id="${task_id}" \
493495
execution="${execution}" \
494496
$DRIVERS_TOOLS/.evergreen/atlas/setup-atlas-cluster.sh
497+
498+
echo "MONGODB_URI=${MONGODB_URI}"
495499
- command: expansions.update
496500
params:
497501
file: src/atlas-expansion.yml
@@ -513,6 +517,52 @@ task_groups:
513517
tasks:
514518
- test-full-atlas-task
515519

520+
- name: test_aws_lambda_task_group
521+
setup_group_can_fail_task: true
522+
setup_group_timeout_secs: 1800 # 30 minutes
523+
setup_group:
524+
- func: fetch source
525+
- func: create expansions
526+
- command: shell.exec
527+
params:
528+
shell: "bash"
529+
working_dir: "src"
530+
script: |
531+
${PREPARE_SHELL}
532+
533+
echo "Setting up Atlas cluster"
534+
535+
DRIVERS_ATLAS_PUBLIC_API_KEY="${DRIVERS_ATLAS_PUBLIC_API_KEY}" \
536+
DRIVERS_ATLAS_PRIVATE_API_KEY="${DRIVERS_ATLAS_PRIVATE_API_KEY}" \
537+
DRIVERS_ATLAS_GROUP_ID="${DRIVERS_ATLAS_GROUP_ID}" \
538+
DRIVERS_ATLAS_LAMBDA_USER="${DRIVERS_ATLAS_LAMBDA_USER}" \
539+
DRIVERS_ATLAS_LAMBDA_PASSWORD="${DRIVERS_ATLAS_LAMBDA_PASSWORD}" \
540+
LAMBDA_STACK_NAME="dbx-ruby-lambda" \
541+
MONGODB_VERSION="7.0" \
542+
task_id="${task_id}" \
543+
execution="${execution}" \
544+
$DRIVERS_TOOLS/.evergreen/atlas/setup-atlas-cluster.sh
545+
- command: expansions.update
546+
params:
547+
file: src/atlas-expansion.yml
548+
teardown_group:
549+
- command: shell.exec
550+
params:
551+
shell: "bash"
552+
working_dir: "src"
553+
script: |
554+
${PREPARE_SHELL}
555+
556+
DRIVERS_ATLAS_PUBLIC_API_KEY="${DRIVERS_ATLAS_PUBLIC_API_KEY}" \
557+
DRIVERS_ATLAS_PRIVATE_API_KEY="${DRIVERS_ATLAS_PRIVATE_API_KEY}" \
558+
DRIVERS_ATLAS_GROUP_ID="${DRIVERS_ATLAS_GROUP_ID}" \
559+
LAMBDA_STACK_NAME="dbx-ruby-lambda" \
560+
task_id="${task_id}" \
561+
execution="${execution}" \
562+
$DRIVERS_TOOLS/.evergreen/atlas/teardown-atlas-cluster.sh
563+
tasks:
564+
- test-aws-lambda-deployed
565+
516566
- name: testgcpkms_task_group
517567
setup_group_can_fail_task: true
518568
setup_group_timeout_secs: 1800 # 30 minutes
@@ -702,6 +752,38 @@ tasks:
702752
export AZUREKMS_VMNAME=${AZUREKMS_VMNAME}
703753
export AZUREKMS_PRIVATEKEYPATH="/tmp/testazurekms_private_key_file"
704754
AZUREKMS_CMD="TEST_FLE_AZURE_AUTO=1 RVM_RUBY=ruby-3.1 FLE=helper TOPOLOGY=standalone MONGODB_VERSION=6.0 MONGO_RUBY_DRIVER_AZURE_TENANT_ID="${MONGO_RUBY_DRIVER_AZURE_TENANT_ID}" MONGO_RUBY_DRIVER_AZURE_CLIENT_ID="${MONGO_RUBY_DRIVER_AZURE_CLIENT_ID}" MONGO_RUBY_DRIVER_AZURE_CLIENT_SECRET="${MONGO_RUBY_DRIVER_AZURE_CLIENT_SECRET}" MONGO_RUBY_DRIVER_AZURE_IDENTITY_PLATFORM_ENDPOINT="${MONGO_RUBY_DRIVER_AZURE_IDENTITY_PLATFORM_ENDPOINT}" MONGO_RUBY_DRIVER_AZURE_KEY_VAULT_ENDPOINT="${testazurekms_keyvaultendpoint}" MONGO_RUBY_DRIVER_AZURE_KEY_NAME="${testazurekms_keyname}" ./.evergreen/run-tests-azure.sh" .evergreen/csfle/azurekms/run-command.sh
755+
756+
- name: "test-aws-lambda-deployed"
757+
commands:
758+
- command: ec2.assume_role
759+
params:
760+
role_arn: ${LAMBDA_AWS_ROLE_ARN}
761+
duration_seconds: 3600
762+
- command: shell.exec
763+
type: test
764+
params:
765+
working_dir: "src"
766+
shell: "bash"
767+
script: |
768+
${PREPARE_SHELL}
769+
export MONGODB_URI=${MONGODB_URI}
770+
.evergreen/run-tests-deployed-lambda.sh
771+
env:
772+
TEST_LAMBDA_DIRECTORY: ${PROJECT_DIRECTORY}/spec/faas/ruby-sam-app
773+
AWS_REGION: us-east-1
774+
PROJECT_DIRECTORY: ${PROJECT_DIRECTORY}
775+
DRIVERS_TOOLS: ${DRIVERS_TOOLS}
776+
DRIVERS_ATLAS_PUBLIC_API_KEY: ${DRIVERS_ATLAS_PUBLIC_API_KEY}
777+
DRIVERS_ATLAS_PRIVATE_API_KEY: ${DRIVERS_ATLAS_PRIVATE_API_KEY}
778+
DRIVERS_ATLAS_LAMBDA_USER: ${DRIVERS_ATLAS_LAMBDA_USER}
779+
DRIVERS_ATLAS_LAMBDA_PASSWORD: ${DRIVERS_ATLAS_LAMBDA_PASSWORD}
780+
DRIVERS_ATLAS_GROUP_ID: ${DRIVERS_ATLAS_GROUP_ID}
781+
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
782+
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
783+
AWS_SESSION_TOKEN: ${AWS_SESSION_TOKEN}
784+
LAMBDA_STACK_NAME: "dbx-ruby-lambda"
785+
RVM_RUBY: ruby-3.2
786+
MONGODB_URI: ${MONGODB_URI}
705787
axes:
706788

707789
- id: preload
@@ -1689,3 +1771,11 @@ buildvariants:
16891771
display_name: "Atlas serverless ${ruby} single mongos"
16901772
tasks:
16911773
- name: test-serverless
1774+
1775+
- matrix_name: "aws-lambda"
1776+
matrix_spec:
1777+
ruby: "ruby-3.2"
1778+
os: ubuntu2204
1779+
display_name: "AWS Lambda"
1780+
tasks:
1781+
- name: test_aws_lambda_task_group

Diff for: .evergreen/config/common.yml.erb

+82
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,8 @@ task_groups:
479479
script: |
480480
${PREPARE_SHELL}
481481

482+
echo "Setting up Atlas cluster"
483+
482484
DRIVERS_ATLAS_PUBLIC_API_KEY="${DRIVERS_ATLAS_PUBLIC_API_KEY}" \
483485
DRIVERS_ATLAS_PRIVATE_API_KEY="${DRIVERS_ATLAS_PRIVATE_API_KEY}" \
484486
DRIVERS_ATLAS_GROUP_ID="${DRIVERS_ATLAS_GROUP_ID}" \
@@ -489,6 +491,8 @@ task_groups:
489491
task_id="${task_id}" \
490492
execution="${execution}" \
491493
$DRIVERS_TOOLS/.evergreen/atlas/setup-atlas-cluster.sh
494+
495+
echo "MONGODB_URI=${MONGODB_URI}"
492496
- command: expansions.update
493497
params:
494498
file: src/atlas-expansion.yml
@@ -510,6 +514,52 @@ task_groups:
510514
tasks:
511515
- test-full-atlas-task
512516

517+
- name: test_aws_lambda_task_group
518+
setup_group_can_fail_task: true
519+
setup_group_timeout_secs: 1800 # 30 minutes
520+
setup_group:
521+
- func: fetch source
522+
- func: create expansions
523+
- command: shell.exec
524+
params:
525+
shell: "bash"
526+
working_dir: "src"
527+
script: |
528+
${PREPARE_SHELL}
529+
530+
echo "Setting up Atlas cluster"
531+
532+
DRIVERS_ATLAS_PUBLIC_API_KEY="${DRIVERS_ATLAS_PUBLIC_API_KEY}" \
533+
DRIVERS_ATLAS_PRIVATE_API_KEY="${DRIVERS_ATLAS_PRIVATE_API_KEY}" \
534+
DRIVERS_ATLAS_GROUP_ID="${DRIVERS_ATLAS_GROUP_ID}" \
535+
DRIVERS_ATLAS_LAMBDA_USER="${DRIVERS_ATLAS_LAMBDA_USER}" \
536+
DRIVERS_ATLAS_LAMBDA_PASSWORD="${DRIVERS_ATLAS_LAMBDA_PASSWORD}" \
537+
LAMBDA_STACK_NAME="dbx-ruby-lambda" \
538+
MONGODB_VERSION="7.0" \
539+
task_id="${task_id}" \
540+
execution="${execution}" \
541+
$DRIVERS_TOOLS/.evergreen/atlas/setup-atlas-cluster.sh
542+
- command: expansions.update
543+
params:
544+
file: src/atlas-expansion.yml
545+
teardown_group:
546+
- command: shell.exec
547+
params:
548+
shell: "bash"
549+
working_dir: "src"
550+
script: |
551+
${PREPARE_SHELL}
552+
553+
DRIVERS_ATLAS_PUBLIC_API_KEY="${DRIVERS_ATLAS_PUBLIC_API_KEY}" \
554+
DRIVERS_ATLAS_PRIVATE_API_KEY="${DRIVERS_ATLAS_PRIVATE_API_KEY}" \
555+
DRIVERS_ATLAS_GROUP_ID="${DRIVERS_ATLAS_GROUP_ID}" \
556+
LAMBDA_STACK_NAME="dbx-ruby-lambda" \
557+
task_id="${task_id}" \
558+
execution="${execution}" \
559+
$DRIVERS_TOOLS/.evergreen/atlas/teardown-atlas-cluster.sh
560+
tasks:
561+
- test-aws-lambda-deployed
562+
513563
- name: testgcpkms_task_group
514564
setup_group_can_fail_task: true
515565
setup_group_timeout_secs: 1800 # 30 minutes
@@ -699,3 +749,35 @@ tasks:
699749
export AZUREKMS_VMNAME=${AZUREKMS_VMNAME}
700750
export AZUREKMS_PRIVATEKEYPATH="/tmp/testazurekms_private_key_file"
701751
AZUREKMS_CMD="TEST_FLE_AZURE_AUTO=1 RVM_RUBY=ruby-3.1 FLE=helper TOPOLOGY=standalone MONGODB_VERSION=6.0 MONGO_RUBY_DRIVER_AZURE_TENANT_ID="${MONGO_RUBY_DRIVER_AZURE_TENANT_ID}" MONGO_RUBY_DRIVER_AZURE_CLIENT_ID="${MONGO_RUBY_DRIVER_AZURE_CLIENT_ID}" MONGO_RUBY_DRIVER_AZURE_CLIENT_SECRET="${MONGO_RUBY_DRIVER_AZURE_CLIENT_SECRET}" MONGO_RUBY_DRIVER_AZURE_IDENTITY_PLATFORM_ENDPOINT="${MONGO_RUBY_DRIVER_AZURE_IDENTITY_PLATFORM_ENDPOINT}" MONGO_RUBY_DRIVER_AZURE_KEY_VAULT_ENDPOINT="${testazurekms_keyvaultendpoint}" MONGO_RUBY_DRIVER_AZURE_KEY_NAME="${testazurekms_keyname}" ./.evergreen/run-tests-azure.sh" .evergreen/csfle/azurekms/run-command.sh
752+
753+
- name: "test-aws-lambda-deployed"
754+
commands:
755+
- command: ec2.assume_role
756+
params:
757+
role_arn: ${LAMBDA_AWS_ROLE_ARN}
758+
duration_seconds: 3600
759+
- command: shell.exec
760+
type: test
761+
params:
762+
working_dir: "src"
763+
shell: "bash"
764+
script: |
765+
${PREPARE_SHELL}
766+
export MONGODB_URI=${MONGODB_URI}
767+
.evergreen/run-tests-deployed-lambda.sh
768+
env:
769+
TEST_LAMBDA_DIRECTORY: ${PROJECT_DIRECTORY}/spec/faas/ruby-sam-app
770+
AWS_REGION: us-east-1
771+
PROJECT_DIRECTORY: ${PROJECT_DIRECTORY}
772+
DRIVERS_TOOLS: ${DRIVERS_TOOLS}
773+
DRIVERS_ATLAS_PUBLIC_API_KEY: ${DRIVERS_ATLAS_PUBLIC_API_KEY}
774+
DRIVERS_ATLAS_PRIVATE_API_KEY: ${DRIVERS_ATLAS_PRIVATE_API_KEY}
775+
DRIVERS_ATLAS_LAMBDA_USER: ${DRIVERS_ATLAS_LAMBDA_USER}
776+
DRIVERS_ATLAS_LAMBDA_PASSWORD: ${DRIVERS_ATLAS_LAMBDA_PASSWORD}
777+
DRIVERS_ATLAS_GROUP_ID: ${DRIVERS_ATLAS_GROUP_ID}
778+
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
779+
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
780+
AWS_SESSION_TOKEN: ${AWS_SESSION_TOKEN}
781+
LAMBDA_STACK_NAME: "dbx-ruby-lambda"
782+
RVM_RUBY: ruby-3.2
783+
MONGODB_URI: ${MONGODB_URI}

Diff for: .evergreen/config/standard.yml.erb

+8
Original file line numberDiff line numberDiff line change
@@ -520,3 +520,11 @@ buildvariants:
520520
display_name: "Atlas serverless ${ruby} single mongos"
521521
tasks:
522522
- name: test-serverless
523+
524+
- matrix_name: "aws-lambda"
525+
matrix_spec:
526+
ruby: <%= latest_ruby %>
527+
os: ubuntu2204
528+
display_name: "AWS Lambda"
529+
tasks:
530+
- name: test_aws_lambda_task_group

Diff for: .evergreen/run-deployed-lambda-aws-tests.sh

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#!/bin/bash
2+
set -o errexit # Exit the script with error if any of the commands fail
3+
4+
# Explanation of required environment variables:
5+
#
6+
# TEST_LAMBDA_DIRECTORY: The root of the project's Lambda sam project.
7+
# DRIVERS_ATLAS_PUBLIC_API_KEY: The public Atlas key for the drivers org.
8+
# DRIVERS_ATLAS_PRIVATE_API_KEY: The private Atlas key for the drivers org.
9+
# DRIVERS_ATLAS_LAMBDA_USER: The user for the lambda cluster.
10+
# DRIVERS_ATLAS_LAMBDA_PASSWORD: The password for the user.
11+
# DRIVERS_ATLAS_GROUP_ID: The id of the individual projects under the drivers org, per language.
12+
# LAMBDA_STACK_NAME: The name of the stack on lambda "dbx-<language>-lambda"
13+
# AWS_REGION: The region for the function - generally us-east-1
14+
15+
VARLIST=(
16+
TEST_LAMBDA_DIRECTORY
17+
DRIVERS_ATLAS_PUBLIC_API_KEY
18+
DRIVERS_ATLAS_PRIVATE_API_KEY
19+
DRIVERS_ATLAS_LAMBDA_USER
20+
DRIVERS_ATLAS_LAMBDA_PASSWORD
21+
DRIVERS_ATLAS_GROUP_ID
22+
LAMBDA_STACK_NAME
23+
AWS_REGION
24+
)
25+
26+
# Ensure that all variables required to run the test are set, otherwise throw
27+
# an error.
28+
for VARNAME in ${VARLIST[*]}; do
29+
[[ -z "${!VARNAME}" ]] && echo "ERROR: $VARNAME not set" && exit 1;
30+
done
31+
32+
# Set up the common variables
33+
. `dirname "$0"`/atlas/setup-variables.sh
34+
35+
# Restarts the cluster's primary node.
36+
restart_cluster_primary ()
37+
{
38+
echo "Testing Atlas primary restart..."
39+
curl \
40+
--digest -u ${DRIVERS_ATLAS_PUBLIC_API_KEY}:${DRIVERS_ATLAS_PRIVATE_API_KEY} \
41+
-X POST \
42+
"${ATLAS_BASE_URL}/groups/${DRIVERS_ATLAS_GROUP_ID}/clusters/${FUNCTION_NAME}/restartPrimaries"
43+
}
44+
45+
# Deploys a lambda function to the set stack name.
46+
deploy_lambda_function ()
47+
{
48+
echo "Deploying Lambda function..."
49+
sam deploy \
50+
--stack-name "${FUNCTION_NAME}" \
51+
--capabilities CAPABILITY_IAM \
52+
--resolve-s3 \
53+
--parameter-overrides "MongoDbUri=${MONGODB_URI}" \
54+
--region ${AWS_REGION}
55+
}
56+
57+
# Get the ARN for the Lambda function we created and export it.
58+
get_lambda_function_arn ()
59+
{
60+
echo "Getting Lambda function ARN..."
61+
LAMBDA_FUNCTION_ARN=$(sam list stack-outputs \
62+
--stack-name ${FUNCTION_NAME} \
63+
--region ${AWS_REGION} \
64+
--output json | jq '.[] | select(.OutputKey == "MongoDBFunction") | .OutputValue' | tr -d '"'
65+
)
66+
echo "Lambda function ARN: $LAMBDA_FUNCTION_ARN"
67+
export LAMBDA_FUNCTION_ARN=$LAMBDA_FUNCTION_ARN
68+
}
69+
70+
delete_lambda_function ()
71+
{
72+
echo "Deleting Lambda Function..."
73+
sam delete --stack-name ${FUNCTION_NAME} --no-prompts --region us-east-1
74+
}
75+
76+
cleanup ()
77+
{
78+
delete_lambda_function
79+
}
80+
81+
trap cleanup EXIT SIGHUP
82+
83+
cd "${TEST_LAMBDA_DIRECTORY}"
84+
85+
sam build --use-container
86+
87+
deploy_lambda_function
88+
89+
get_lambda_function_arn
90+
91+
92+
check_lambda_output () {
93+
if grep -q FunctionError output.json
94+
then
95+
echo "Exiting due to FunctionError!"
96+
exit 1
97+
fi
98+
cat output.json | jq -r '.LogResult' | base64 --decode
99+
}
100+
101+
aws lambda invoke --function-name ${LAMBDA_FUNCTION_ARN} --log-type Tail lambda-invoke-standard.json > output.json
102+
cat lambda-invoke-standard.json
103+
check_lambda_output
104+
105+
echo "Sleeping 1 minute to build up some streaming protocol heartbeats..."
106+
sleep 60
107+
aws lambda invoke --function-name ${LAMBDA_FUNCTION_ARN} --log-type Tail lambda-invoke-frozen.json > output.json
108+
cat lambda-invoke-frozen.json
109+
check_lambda_output
110+
111+
restart_cluster_primary
112+
113+
echo "Sleeping 1 minute to build up some streaming protocol heartbeats..."
114+
sleep 60
115+
aws lambda invoke --function-name ${LAMBDA_FUNCTION_ARN} --log-type Tail lambda-invoke-outage.json > output.json
116+
cat lambda-invoke-outage.json
117+
check_lambda_output

Diff for: .evergreen/run-tests-deployed-lambda.sh

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#!/bin/bash
2+
3+
set -ex
4+
5+
. `dirname "$0"`/../spec/shared/shlib/distro.sh
6+
. `dirname "$0"`/../spec/shared/shlib/set_env.sh
7+
. `dirname "$0"`/functions.sh
8+
9+
set_env_vars
10+
set_env_python
11+
set_env_ruby
12+
13+
export MONGODB_URI=${MONGODB_URI}
14+
export TEST_LAMBDA_DIRECTORY=`dirname "$0"`/../spec/faas/ruby-sam-app
15+
16+
. `dirname "$0"`/run-deployed-lambda-aws-tests.sh

Diff for: .gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,6 @@ profile/benchmarking/data
3030
secrets-export.sh
3131
secrets-expansion.yml
3232
atlas-expansion.yml
33+
# AWS SAM-generated files
34+
spec/faas/ruby-sam-app/.aws-sam
35+
spec/faas/ruby-sam-app/events/event.json

Diff for: .rubocop.yml

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ AllCops:
88
NewCops: enable
99
Exclude:
1010
- 'spec/shared/**/*'
11+
- 'spec/faas/**/*'
1112
- 'vendor/**/*'
1213

1314
Bundler:

0 commit comments

Comments
 (0)