From 8deffb57b75ea7cf997f986f900ae69817dc0100 Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 20:46:38 +0000 Subject: [PATCH 01/10] Create deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/deploy-lambda.yaml diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml new file mode 100644 index 0000000..4c32a63 --- /dev/null +++ b/.github/workflows/deploy-lambda.yaml @@ -0,0 +1,24 @@ +name: Deploy Lambda to AWS + +on: + push: + branches: ["*-workshop"] + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + AWS_REGION: eu-west-1 + +jobs: + deploy: + runs-on: ubuntu-latest + env: + FUNCTION_NAME: ${{ github.ref_name }} + permissions: + id-token: write + contents: read + steps: + - name: Checkout repository + uses: actions/checkout@v6 From 4fcbda6a2016ec0f3fe745dca0d62e8513feab8f Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 20:55:06 +0000 Subject: [PATCH 02/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index 4c32a63..133a7a9 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -22,3 +22,14 @@ jobs: steps: - name: Checkout repository uses: actions/checkout@v6 + - name: Configure AWS Credentials + uses: aws-actions/configure-aws-credentials@v6 + with: + role-to-assume: ${{ secrets.AWS_ROLE_ARN }} + aws-region: ${{ env.AWS_REGION }} + - name: Setup Node.js + uses: actions/setup-node@v6 + with: + node-version: 24 + cache: npm + cache-dependency-path: lambda/package-lock.json From 578df051b50e4b4b9dbe6111387daaa3b93e8927 Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 20:55:58 +0000 Subject: [PATCH 03/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index 133a7a9..f67a87c 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -33,3 +33,12 @@ jobs: node-version: 24 cache: npm cache-dependency-path: lambda/package-lock.json + - name: Install dependencies + working-directory: ./lambda + run: npm ci + - name: Build TypeScript + working-directory: ./lambda + run: npm run build + - name: Package Lambda function + working-directory: ./lambda + run: npm run package From 2ef97c6ff072b9263de99868e40d016cfc968995 Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 20:57:27 +0000 Subject: [PATCH 04/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 33 ++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index f67a87c..8549ad6 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -42,3 +42,36 @@ jobs: - name: Package Lambda function working-directory: ./lambda run: npm run package + - name: Check if Lambda function exists + id: check_lambda + run: | + if aws lambda get-function --function-name ${{ env.FUNCTION_NAME }} >/dev/null 2>&1; then + echo "exists=true" >> $GITHUB_OUTPUT + echo "โœ… Lambda function ${{ env.FUNCTION_NAME }} exists" + else + echo "exists=false" >> $GITHUB_OUTPUT + echo "โžก๏ธ Lambda function ${{ env.FUNCTION_NAME }} needs to be created" + fi + - name: Create Lambda function + if: steps.check_lambda.outputs.exists == 'false' + working-directory: ./lambda + run: | + aws lambda create-function \ + --function-name ${{ env.FUNCTION_NAME }} \ + --runtime nodejs20.x \ + --role ${{ secrets.LAMBDA_EXECUTION_ROLE_ARN }} \ + --handler build/index.handler \ + --zip-file fileb://function.zip \ + --description "Workshop Lambda deployed by ${{ github.actor }}" \ + --environment Variables={GITHUB_ACTOR=${{ github.actor }}} \ + --tags Workshop=GitHubActions,User=${{ github.actor }} + echo "๐ŸŽ‰ Lambda function ${{ env.FUNCTION_NAME }} created!" + + - name: Update Lambda function code + if: steps.check_lambda.outputs.exists == 'true' + working-directory: ./lambda + run: | + aws lambda update-function-code \ + --function-name ${{ env.FUNCTION_NAME }} \ + --zip-file fileb://function.zip + echo "๐Ÿ”„ Lambda function ${{ env.FUNCTION_NAME }} updated!" From 568524f844a68de90d1a22341c850a4c9953cd34 Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 21:21:32 +0000 Subject: [PATCH 05/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index 8549ad6..29c2292 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -75,3 +75,34 @@ jobs: --function-name ${{ env.FUNCTION_NAME }} \ --zip-file fileb://function.zip echo "๐Ÿ”„ Lambda function ${{ env.FUNCTION_NAME }} updated!" + + - name: Get Lambda function URL + id: lambda_info + run: | + # Check if function has a URL config + if aws lambda get-function-url-config --function-name ${{ env.FUNCTION_NAME }} >/dev/null 2>&1; then + FUNCTION_URL=$(aws lambda get-function-url-config --function-name ${{ env.FUNCTION_NAME }} --query 'FunctionUrl' --output text) + echo "url=$FUNCTION_URL" >> $GITHUB_OUTPUT + else + echo "url=" >> $GITHUB_OUTPUT + fi + + - name: Create Function URL (if not exists) + if: steps.lambda_info.outputs.url == '' + run: | + FUNCTION_URL=$(aws lambda create-function-url-config \ + --function-name ${{ env.FUNCTION_NAME }} \ + --auth-type NONE \ + --query 'FunctionUrl' \ + --output text) + + # Add permission for public access + aws lambda add-permission \ + --function-name ${{ env.FUNCTION_NAME }} \ + --action lambda:InvokeFunctionUrl \ + --principal '*' \ + --statement-id function-url-public-access \ + --function-url-auth-type NONE + + echo "๐Ÿ”— Function URL created: $FUNCTION_URL" + echo "url=$FUNCTION_URL" >> $GITHUB_OUTPUT From 1c7937b2675f129f30c150efcb4d66a2fcb5668a Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 21:23:16 +0000 Subject: [PATCH 06/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index 29c2292..fff8aa7 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -106,3 +106,24 @@ jobs: echo "๐Ÿ”— Function URL created: $FUNCTION_URL" echo "url=$FUNCTION_URL" >> $GITHUB_OUTPUT + + - name: Test Lambda function + run: | + echo "๐Ÿงช Testing Lambda function..." + FUNCTION_URL=$(aws lambda get-function-url-config --function-name ${{ env.FUNCTION_NAME }} --query 'FunctionUrl' --output text) + + # Wait a moment for function to be ready + sleep 5 + + # Test the function + RESPONSE=$(curl -s -X POST "$FUNCTION_URL" -d '{}' -H "Content-Type: application/json") + echo "๐Ÿ“‹ Lambda response:" + echo "$RESPONSE" | jq '.' + + # Extract status from response + STATUS=$(echo "$RESPONSE" | jq -r '.statusCode // "unknown"') + if [ "$STATUS" = "200" ]; then + echo "โœ… Lambda function is working correctly!" + else + echo "โš ๏ธ Lambda function returned status: $STATUS" + fi From f8ea2e9cc8d183bf100940325e96766df0e11b0d Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 21:36:45 +0000 Subject: [PATCH 07/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 54 ++++------------------------ 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index fff8aa7..f3339a6 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -76,54 +76,14 @@ jobs: --zip-file fileb://function.zip echo "๐Ÿ”„ Lambda function ${{ env.FUNCTION_NAME }} updated!" - - name: Get Lambda function URL - id: lambda_info - run: | - # Check if function has a URL config - if aws lambda get-function-url-config --function-name ${{ env.FUNCTION_NAME }} >/dev/null 2>&1; then - FUNCTION_URL=$(aws lambda get-function-url-config --function-name ${{ env.FUNCTION_NAME }} --query 'FunctionUrl' --output text) - echo "url=$FUNCTION_URL" >> $GITHUB_OUTPUT - else - echo "url=" >> $GITHUB_OUTPUT - fi - - - name: Create Function URL (if not exists) - if: steps.lambda_info.outputs.url == '' - run: | - FUNCTION_URL=$(aws lambda create-function-url-config \ - --function-name ${{ env.FUNCTION_NAME }} \ - --auth-type NONE \ - --query 'FunctionUrl' \ - --output text) - - # Add permission for public access - aws lambda add-permission \ - --function-name ${{ env.FUNCTION_NAME }} \ - --action lambda:InvokeFunctionUrl \ - --principal '*' \ - --statement-id function-url-public-access \ - --function-url-auth-type NONE - - echo "๐Ÿ”— Function URL created: $FUNCTION_URL" - echo "url=$FUNCTION_URL" >> $GITHUB_OUTPUT - - name: Test Lambda function run: | echo "๐Ÿงช Testing Lambda function..." - FUNCTION_URL=$(aws lambda get-function-url-config --function-name ${{ env.FUNCTION_NAME }} --query 'FunctionUrl' --output text) - - # Wait a moment for function to be ready - sleep 5 - - # Test the function - RESPONSE=$(curl -s -X POST "$FUNCTION_URL" -d '{}' -H "Content-Type: application/json") + aws lambda invoke \ + --function-name ${{ env.FUNCTION_NAME }} \ + --payload '{}' \ + --log-type Tail \ + response.json + echo "๐Ÿ“‹ Lambda response:" - echo "$RESPONSE" | jq '.' - - # Extract status from response - STATUS=$(echo "$RESPONSE" | jq -r '.statusCode // "unknown"') - if [ "$STATUS" = "200" ]; then - echo "โœ… Lambda function is working correctly!" - else - echo "โš ๏ธ Lambda function returned status: $STATUS" - fi + cat response.json From fe494a8ee0e059e266a4dbbe4e9f8121f8ff2750 Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 21:46:15 +0000 Subject: [PATCH 08/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 42 ++++++---------------------- 1 file changed, 8 insertions(+), 34 deletions(-) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index f3339a6..996c793 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -42,40 +42,14 @@ jobs: - name: Package Lambda function working-directory: ./lambda run: npm run package - - name: Check if Lambda function exists - id: check_lambda - run: | - if aws lambda get-function --function-name ${{ env.FUNCTION_NAME }} >/dev/null 2>&1; then - echo "exists=true" >> $GITHUB_OUTPUT - echo "โœ… Lambda function ${{ env.FUNCTION_NAME }} exists" - else - echo "exists=false" >> $GITHUB_OUTPUT - echo "โžก๏ธ Lambda function ${{ env.FUNCTION_NAME }} needs to be created" - fi - - name: Create Lambda function - if: steps.check_lambda.outputs.exists == 'false' - working-directory: ./lambda - run: | - aws lambda create-function \ - --function-name ${{ env.FUNCTION_NAME }} \ - --runtime nodejs20.x \ - --role ${{ secrets.LAMBDA_EXECUTION_ROLE_ARN }} \ - --handler build/index.handler \ - --zip-file fileb://function.zip \ - --description "Workshop Lambda deployed by ${{ github.actor }}" \ - --environment Variables={GITHUB_ACTOR=${{ github.actor }}} \ - --tags Workshop=GitHubActions,User=${{ github.actor }} - echo "๐ŸŽ‰ Lambda function ${{ env.FUNCTION_NAME }} created!" - - - name: Update Lambda function code - if: steps.check_lambda.outputs.exists == 'true' - working-directory: ./lambda - run: | - aws lambda update-function-code \ - --function-name ${{ env.FUNCTION_NAME }} \ - --zip-file fileb://function.zip - echo "๐Ÿ”„ Lambda function ${{ env.FUNCTION_NAME }} updated!" - + - name: Deploy to Lambda + uses: aws-actions/aws-lambda-deploy@v1 + with: + function-name: ${{ env.FUNCTION_NAME }} + code-artifacts-dir: ./lambda + handler: index.handler + runtime: nodejs20.x + description: "Workshop Lambda deployed by ${{ github.actor }}" - name: Test Lambda function run: | echo "๐Ÿงช Testing Lambda function..." From dac4016eabfb1d5e725807fc32274433cb654668 Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 21:54:37 +0000 Subject: [PATCH 09/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index 996c793..d40b956 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -46,10 +46,10 @@ jobs: uses: aws-actions/aws-lambda-deploy@v1 with: function-name: ${{ env.FUNCTION_NAME }} + function-description: "Workshop Lambda deployed by ${{ github.actor }}" code-artifacts-dir: ./lambda handler: index.handler runtime: nodejs20.x - description: "Workshop Lambda deployed by ${{ github.actor }}" - name: Test Lambda function run: | echo "๐Ÿงช Testing Lambda function..." From c81631acfa716f36f7340ee96e8193dd0af12dcd Mon Sep 17 00:00:00 2001 From: Gary Rutland Date: Wed, 25 Feb 2026 22:00:48 +0000 Subject: [PATCH 10/10] Update deploy-lambda.yaml --- .github/workflows/deploy-lambda.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy-lambda.yaml b/.github/workflows/deploy-lambda.yaml index d40b956..021491c 100644 --- a/.github/workflows/deploy-lambda.yaml +++ b/.github/workflows/deploy-lambda.yaml @@ -49,7 +49,7 @@ jobs: function-description: "Workshop Lambda deployed by ${{ github.actor }}" code-artifacts-dir: ./lambda handler: index.handler - runtime: nodejs20.x + runtime: nodejs24.x - name: Test Lambda function run: | echo "๐Ÿงช Testing Lambda function..."