Skip to content

feat(multi region setup): deploy lambda perf into multiple region #804

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 9 commits into
base: main
Choose a base branch
from
Open
41 changes: 29 additions & 12 deletions .github/workflows/aws-container-upload.yml
Original file line number Diff line number Diff line change
@@ -7,13 +7,6 @@ on:
type: string
description: MFA Code
required: true
region:
description: 'region on which you want to deploy'
type: choice
options:
- eu-west-1
- us-east-1
required: true
architecture:
description: 'architecture'
type: choice
@@ -37,7 +30,27 @@ jobs:
echo "runner=self-hosted" >> $GITHUB_OUTPUT
fi
cat $GITHUB_OUTPUT
- name: AWS Authentication
env:
AWS_REGION: "us-east-1"
AWS_MFA_ARN: ${{ secrets.RESTRICTED_AWS_MFA_ARN }}
AWS_ACCESS_KEY_ID: ${{ secrets.RESTRICTED_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.RESTRICTED_AWS_SECRET_ACCESS_KEY }}
# We set the duration-seconds to 30min because we upload this as an artifact because we don't want someone to be able to use it
run: |
creds_json=$(aws sts get-session-token --serial-number ${AWS_MFA_ARN} --token-code ${{ inputs.mfaCode }} --duration-seconds 1800)
mkdir /tmp/creds
echo $creds_json > /tmp/creds/creds_json
- name: 'Upload Artifact'
uses: actions/upload-artifact@v3
with:
name: creds_json
path: /tmp/creds/
retention-days: 1
build-upload:
strategy:
matrix:
region: [ "us-east-1", "eu-west-1" ]
needs: setup
runs-on: ${{ needs.setup.outputs.runner }}
steps:
@@ -48,19 +61,23 @@ jobs:
rm -rf /usr/share/dotnet
rm -rf /opt/ghc
rm -rf "$AGENT_TOOLSDIRECTORY"
- name: Download tmp credentials
uses: actions/download-artifact@v3
with:
name: creds_json
path: /tmp/creds/
- name: build and deploy
env:
ARCHITECTURE: ${{ inputs.architecture }}
AWS_REGION: ${{ inputs.region }}
AWS_REGION: ${{ matrix.region }}
ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
AWS_ACCESS_KEY_ID: ${{ secrets.RESTRICTED_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.RESTRICTED_AWS_SECRET_ACCESS_KEY }}
AWS_MFA_ARN: ${{ secrets.RESTRICTED_AWS_MFA_ARN }}
run: |
creds_json=$(aws sts get-session-token --serial-number ${AWS_MFA_ARN} --token-code ${{ inputs.mfaCode }})
export AWS_ACCESS_KEY_ID=$(echo "$creds_json" | jq .Credentials.AccessKeyId |tr -d '"')
export AWS_SECRET_ACCESS_KEY=$(echo "$creds_json" | jq .Credentials.SecretAccessKey| tr -d '"')
export AWS_SESSION_TOKEN=$(echo "$creds_json" | jq .Credentials.SessionToken|tr -d '"')
export AWS_ACCESS_KEY_ID=$(cat /tmp/creds/creds_json | jq .Credentials.AccessKeyId |tr -d '"')
export AWS_SECRET_ACCESS_KEY=$(cat /tmp/creds/creds_json | jq .Credentials.SecretAccessKey| tr -d '"')
export AWS_SESSION_TOKEN=$(cat /tmp/creds/creds_json | jq .Credentials.SessionToken|tr -d '"')

cd container-uploader
yarn install
45 changes: 29 additions & 16 deletions .github/workflows/aws-deploy.yml
Original file line number Diff line number Diff line change
@@ -7,13 +7,6 @@ on:
type: string
description: MFA Code
required: true
region:
description: 'region on which you want to deploy'
type: choice
options:
- eu-west-1
- us-east-1
required: true
lambdaPerfEnv:
description: 'environment on which you want to deploy'
type: choice
@@ -23,19 +16,39 @@ on:
required: true

jobs:
deploy:
setup:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: AWS Authentication
env:
AWS_REGION: "us-east-1"
AWS_MFA_ARN: ${{ secrets.RESTRICTED_AWS_MFA_ARN }}
AWS_REGION: ${{ inputs.region }}
AWS_ACCESS_KEY_ID: ${{ secrets.RESTRICTED_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.RESTRICTED_AWS_SECRET_ACCESS_KEY }}
# We set the duration-seconds to 30min because we upload this as an artifact and we don't want someone to be able to use it
run: |
creds_json=$(aws sts get-session-token --serial-number ${AWS_MFA_ARN} --token-code ${{ inputs.mfaCode }})
echo $creds_json > /tmp/creds_json
creds_json=$(aws sts get-session-token --serial-number ${AWS_MFA_ARN} --token-code ${{ inputs.mfaCode }} --duration-seconds 1800)
mkdir /tmp/creds
echo $creds_json > /tmp/creds/creds_json
- name: 'Upload Artifact'
uses: actions/upload-artifact@v3
with:
name: creds_json
path: /tmp/creds/
retention-days: 1
deploy:
runs-on: ubuntu-latest
needs: setup
strategy:
matrix:
region: [ "us-east-1", "eu-west-1" ]
steps:
- uses: actions/checkout@v3
- name: Download tmp credentials
uses: actions/download-artifact@v3
with:
name: creds_json
path: /tmp/creds/
- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
- name: Install Zig toolchain
@@ -59,14 +72,14 @@ jobs:
run: sudo yarn global add serverless@^3.27.0 --prefix /usr/local
- name: deploy
env:
AWS_REGION: ${{ inputs.region }}
AWS_REGION: ${{ matrix.region }}
AWS_ACCOUNT_ID: ${{ secrets.AWS_ACCOUNT_ID }}
GH_AUTH_TOKEN: ${{ secrets.GH_AUTH_TOKEN }}
LAMBDA_PERF_ENV: ${{ inputs.lambdaPerfEnv }}
run: |
export AWS_ACCESS_KEY_ID=$(cat /tmp/creds_json | jq .Credentials.AccessKeyId |tr -d '"')
export AWS_SECRET_ACCESS_KEY=$(cat /tmp/creds_json | jq .Credentials.SecretAccessKey| tr -d '"')
export AWS_SESSION_TOKEN=$(cat /tmp/creds_json | jq .Credentials.SessionToken|tr -d '"')
export AWS_ACCESS_KEY_ID=$(cat /tmp/creds/creds_json | jq .Credentials.AccessKeyId |tr -d '"')
export AWS_SECRET_ACCESS_KEY=$(cat /tmp/creds/creds_json | jq .Credentials.SecretAccessKey| tr -d '"')
export AWS_SESSION_TOKEN=$(cat /tmp/creds/creds_json | jq .Credentials.SessionToken|tr -d '"')
sls deploy --force


41 changes: 29 additions & 12 deletions .github/workflows/aws-s3-uploader.yml
Original file line number Diff line number Diff line change
@@ -7,13 +7,6 @@ on:
type: string
description: MFA Code
required: true
region:
description: 'region on which you want to deploy'
type: choice
options:
- eu-west-1
- us-east-1
required: true
architecture:
description: 'architecture'
type: choice
@@ -37,11 +30,36 @@ jobs:
echo "runner=self-hosted" >> $GITHUB_OUTPUT
fi
cat $GITHUB_OUTPUT
- name: AWS Authentication
env:
AWS_REGION: "us-east-1"
AWS_MFA_ARN: ${{ secrets.RESTRICTED_AWS_MFA_ARN }}
AWS_ACCESS_KEY_ID: ${{ secrets.RESTRICTED_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.RESTRICTED_AWS_SECRET_ACCESS_KEY }}
# We set the duration-seconds to 30min because we upload this as an artifact and we don't want someone to be able to use it
run: |
creds_json=$(aws sts get-session-token --serial-number ${AWS_MFA_ARN} --token-code ${{ inputs.mfaCode }} --duration-seconds 1800)
mkdir /tmp/creds
echo $creds_json > /tmp/creds/creds_json
- name: 'Upload Artifact'
uses: actions/upload-artifact@v3
with:
name: creds_json
path: /tmp/creds/
retention-days: 1
build-upload:
needs: setup
runs-on: ${{ needs.setup.outputs.runner }}
strategy:
matrix:
region: [ "us-east-1", "eu-west-1" ]
steps:
- uses: actions/checkout@v3
- name: Download tmp credentials
uses: actions/download-artifact@v3
with:
name: creds_json
path: /tmp/creds/
- name: Delete huge unnecessary folders
run: |
rm -rf /opt/hostedtoolcache
@@ -51,15 +69,14 @@ jobs:
- name: build and deploy
env:
ARCHITECTURE: ${{ inputs.architecture }}
AWS_REGION: ${{ inputs.region }}
AWS_REGION: ${{ matrix.region }}
AWS_ACCESS_KEY_ID: ${{ secrets.RESTRICTED_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.RESTRICTED_AWS_SECRET_ACCESS_KEY }}
AWS_MFA_ARN: ${{ secrets.RESTRICTED_AWS_MFA_ARN }}
run: |
creds_json=$(aws sts get-session-token --serial-number ${AWS_MFA_ARN} --token-code ${{ inputs.mfaCode }})
export AWS_ACCESS_KEY_ID=$(echo "$creds_json" | jq .Credentials.AccessKeyId |tr -d '"')
export AWS_SECRET_ACCESS_KEY=$(echo "$creds_json" | jq .Credentials.SecretAccessKey| tr -d '"')
export AWS_SESSION_TOKEN=$(echo "$creds_json" | jq .Credentials.SessionToken|tr -d '"')
export AWS_ACCESS_KEY_ID=$(cat /tmp/creds/creds_json | jq .Credentials.AccessKeyId |tr -d '"')
export AWS_SECRET_ACCESS_KEY=$(cat /tmp/creds/creds_json | jq .Credentials.SecretAccessKey| tr -d '"')
export AWS_SESSION_TOKEN=$(cat /tmp/creds/creds_json | jq .Credentials.SessionToken|tr -d '"')

cd s3-uploader
yarn install
2 changes: 1 addition & 1 deletion container-uploader/app.mjs
Original file line number Diff line number Diff line change
@@ -53,7 +53,7 @@ const getFromS3 = async (
const codeFilename = `code_${architecture}.zip`;

const getObjectParams = {
Bucket: `lambda-perf-${region}`,
Bucket: `snapoleon-lambda-perf-${region}`,
Key: `${path}/${codeFilename}`,
};
const command = new GetObjectCommand(getObjectParams);
1 change: 1 addition & 0 deletions data/2023-12-02-eu-west-3.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions data/2023-12-02-us-east-1.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions data/last-eu-west-3.json

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions data/last-us-east-1.json

Large diffs are not rendered by default.

132 changes: 69 additions & 63 deletions docs/index.html
Original file line number Diff line number Diff line change
@@ -2,95 +2,101 @@
<html lang="en">

<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Lambda Cold Starts benchmark">
<meta name="author" content="maxday">
<meta name="google-site-verification" content="hiFRDth4TrOFHqrvMoorH687i5XQ5Ad0y1X_AbaHUOs" />
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="Lambda Cold Starts benchmark">
<meta name="author" content="maxday">
<meta name="google-site-verification" content="hiFRDth4TrOFHqrvMoorH687i5XQ5Ad0y1X_AbaHUOs"/>

<meta property="og:url" content="https://maxday.github.io/lambda-perf/">
<meta property="og:type" content="website">
<meta property="og:title" content="Lambda Cold Starts benchmark | maxday">
<meta property="og:description" content="Visualize 10 Cold Starts for each runtime, updated daily">
<meta property="og:image" content="https://maxday.github.io/lambda-perf/og.png">
<meta name=twitter:card content="summary_large_image">
<meta property="twitter:domain" content="maxday.github.io/lambda-perf">
<meta property="twitter:url" content="https://maxday.github.io/lambda-perf/">
<meta name=twitter:title content="Lambda Cold Starts benchmark | maxday">
<meta name=twitter:description content="Visualize 10 Cold Starts for each runtime, updated daily">
<meta name=twitter:image content="https://maxday.github.io/lambda-perf/og.png">
<meta property="og:url" content="https://maxday.github.io/lambda-perf/">
<meta property="og:type" content="website">
<meta property="og:title" content="Lambda Cold Starts benchmark | maxday">
<meta property="og:description" content="Visualize 10 Cold Starts for each runtime, updated daily">
<meta property="og:image" content="https://maxday.github.io/lambda-perf/og.png">
<meta name=twitter:card content="summary_large_image">
<meta property="twitter:domain" content="maxday.github.io/lambda-perf">
<meta property="twitter:url" content="https://maxday.github.io/lambda-perf/">
<meta name=twitter:title content="Lambda Cold Starts benchmark | maxday">
<meta name=twitter:description content="Visualize 10 Cold Starts for each runtime, updated daily">
<meta name=twitter:image content="https://maxday.github.io/lambda-perf/og.png">

<link rel="icon" href="./img/favicon.ico">
<title>Lambda Cold Starts analysis</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/custom.css" rel="stylesheet">
<script src="script.js"></script>
<script defer data-domain="maxday.github.io/lambda-perf" src="https://plausible.io/js/script.js"></script>
<link rel="icon" href="./img/favicon.ico">
<title>Lambda Cold Starts analysis</title>
<link href="css/bootstrap.min.css" rel="stylesheet">
<link href="css/custom.css" rel="stylesheet">
<script src="script.js"></script>
<script defer data-domain="maxday.github.io/lambda-perf" src="https://plausible.io/js/script.js"></script>
</head>

<body>
<main class="container">
<h1 class="mt-5">Lambda Cold Starts benchmark <br />by <a href="https://maxday.dev">maxday</a></h1>
<main class="container">
<h1 class="mt-5">Lambda Cold Starts benchmark <br/>by <a href="https://maxday.dev">maxday</a></h1>
<p class="lead">Visualize 10 Cold Starts for each runtime, updated daily.
<br /><a href="https://www.youtube.com/watch?v=Idys2BAmqIU">[How to deploy a Rust Lambda function?]</a>
<br /><a href="https://github.com/maxday/lambda-perf">[How does it work?]</a>
<br/><a href="https://www.youtube.com/watch?v=Idys2BAmqIU">[How to deploy a Rust Lambda function?]</a>
<br/><a href="https://github.com/maxday/lambda-perf">[How does it work?]</a>
</p>
<p class="align-left">
<button type="button" id="replayAnimationBtn" class="btn btn-secondary">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-clockwise"
viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"></path>
<path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z">
</path>
</svg>
</button>
<button type="button" id="replayAnimationBtn" class="btn btn-secondary">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
class="bi bi-arrow-clockwise"
viewBox="0 0 16 16">
<path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"></path>
<path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z">
</path>
</svg>
</button>
</p>
<p class="align-right">
<span>
<input type="button" id="zip" class="packageTypeBtn badge bg-primary bg-success" value="zip" /> |
<input type="button" id="image" class="packageTypeBtn badge bg-primary" value="image" />
<input type="button" id="zip" class="packageTypeBtn badge bg-primary bg-success" value="zip"/> |
<input type="button" id="image" class="packageTypeBtn badge bg-primary" value="image"/>
</span>
<br />
<span>
<input type="button" id="x86_64" class="architectureBtn badge bg-primary bg-success" value="x86_64" /> |
<input type="button" id="arm64" class="architectureBtn badge bg-primary" value="arm64" />
<br/>
<span>
<input type="button" id="x86_64" class="architectureBtn badge bg-primary bg-success" value="x86_64"/> |
<input type="button" id="arm64" class="architectureBtn badge bg-primary" value="arm64"/>
</span>
<br />
<span>
<input type="button" id="128" class="memorySizeBtn badge bg-primary bg-success" value="128MB" /> |
<input type="button" id="256" class="memorySizeBtn badge bg-primary" value="256MB" /> |
<input type="button" id="512" class="memorySizeBtn badge bg-primary" value="512MB" /> |
<input type="button" id="1024" class="memorySizeBtn badge bg-primary" value="1024MB" />
<br/>
<span>
<input type="button" id="128" class="memorySizeBtn badge bg-primary bg-success" value="128MB"/> |
<input type="button" id="256" class="memorySizeBtn badge bg-primary" value="256MB"/> |
<input type="button" id="512" class="memorySizeBtn badge bg-primary" value="512MB"/> |
<input type="button" id="1024" class="memorySizeBtn badge bg-primary" value="1024MB"/>
</span>
<br/>
<span>
<input type="button" id="us-east-1" class="regionBtn badge bg-primary bg-success" value="us-east-1"/> |
<input type="button" id="us-west-1" class="regionBtn badge bg-primary" value="us-west-1"/> |
<input type="button" id="eu-west-1" class="regionBtn badge bg-primary" value="eu-west-1"/> |
<input type="button" id="eu-central-1" class="regionBtn badge bg-primary" value="eu-central-1"/>
</span>
<br />
<span class="badge bg-primary">us-east1</span>
<br />
<span class="badge bg-success">Last update: <span id="lastUpdate">loading</span></span>
<br />
<span class="legend">
<br/>
<span class="badge bg-success">Last update: <span id="lastUpdate">loading</span></span>
<br/>
<span class="legend">
❄ Avg Cold Start duration · 💾 Avg Memory Used · ⚡ Avg duration
</span>
</p>
<hr />
<hr/>
<div id="sampleRuntimeElement" class="runtime">
<span class="badge bg-success"><span class="runtimeName">runtime name</span></span>
<div class="coldstarts" class="fixedHeight"></div>
❄ <span class="itemData averageColdStartDuration"></span></span>
💾 <span class="itemData averageMemoryUsed"></span></span>
⚡ <span class="itemData averageDuration"></span></span>
<hr />
<span class="badge bg-success"><span class="runtimeName">runtime name</span></span>
<div class="coldstarts" class="fixedHeight"></div>
❄ <span class="itemData averageColdStartDuration"></span></span>
💾 <span class="itemData averageMemoryUsed"></span></span>
⚡ <span class="itemData averageDuration"></span></span>
<hr/>
</div>
<div id="runtimes"></div>
</main>
<footer class="footer">
</main>
<footer class="footer">
<div class="container">
<span class="text-muted">Made with ♥ in Montreal 🇨🇦 by <a href="https://maxday.dev">maxday</a>
</span>
</div>
<div class="disclaimer">This site is not associated, affiliated, endorsed, or sponsored by any companies nor have
they been reviewed tested or certified by any company.
they been reviewed tested or certified by any company.
</div>
</footer>
</footer>
</body>

</html>
Loading