0%
May 23, 2024

Github Actions for Serverless Functions

aws

serverless

Preface

Because we use npm serverless framework, there is almost no difference in workflow file but there is a huge distinction in serverless.yml.

Files Structure

Python Flask

action.yml
name: 'Deploy to Lambda'
description: 'Deploy to AWS as Lambda Function'

inputs: 
  stage:
    description: uat or prod
    required: true

runs:
  using: 'composite'
  steps:
    - name: Get Code
      uses: actions/checkout@v4
    - name: install nodejs
      uses: actions/setup-node@v4
      with:
        node-version: 18
    - name: Cache Dependencies
      id: cache
      uses: actions/cache@v3
      with:
        path: node_modules
        key: wonderbricks-python-excel-gen-${{ hashFiles('**/yarn.lock') }}
    - name: NPM Install by yarn
      if: steps.cache.outputs.cache-hit != 'true'
      shell: bash
      run: yarn
    - name: Start Serverless Deployment
      shell: bash
      run: yarn serverless deploy --config serverless-${{ inputs.stage }}.yml
deploy-uat.yml
name: Deploy Serverless Python File Generation Server
on:
  push:
    branches:
      - release/uat
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: deployment
    env: 
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      REGION: ap-southeast-2
    steps:
      - name: Get Code
        uses: actions/checkout@v4
      - name: Start Deployment
        uses: ./.github/actions/deploy-serverless
        with:
          stage: uat
deploy-prod.yml
name: Deploy Serverless Python File Generation Server
on:
  push:
    branches:
      - release/prod
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: deployment
    env: 
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      REGION: ap-southeast-2
    steps:
      - name: Get Code
        uses: actions/checkout@v4
      - name: Start Deployment
        uses: ./.github/actions/deploy-serverless
        with:
          stage: prod

Nodejs Express

action.yml
name: 'Deploy to Lambda'
description: 'Deploy to AWS as Lambda Function'

inputs: 
  stage:
    description: uatn or prod
    required: true

runs:
  using: 'composite'
  steps:
    - name: Get Code
      uses: actions/checkout@v4
    - name: install nodejs
      uses: actions/setup-node@v4
      with:
        node-version: 18
    - name: Cache Dependencies
      id: cache
      uses: actions/cache@v3
      with:
        path: node_modules
        key: wonderbricks-nodejs-modules-${{ hashFiles('**/yarn.lock') }}
    - name: NPM Install by yarn
      if: steps.cache.outputs.cache-hit != 'true'
      shell: bash
      run: yarn
    - name: Start Serverless Deployment
      shell: bash
      run: yarn serverless deploy --config serverless-${{ inputs.stage }}.yml
deploy-uat.yml
name: Deploy Serverless Node File Generation Server
on:
  push:
    branches:
      - release/uat
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: deployment
    env: 
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      REGION: ap-southeast-2
    steps:
      - name: Get Code
        uses: actions/checkout@v4
      - name: Start Deployment
        uses: ./.github/actions/deploy-serverless
        with:
          stage: uat
deploy-prod.yml
name: Deploy Serverless Node File Generation Server
on:
  push:
    branches:
      - release/prod
jobs:
  deploy:
    runs-on: ubuntu-latest
    environment: deployment
    env: 
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      REGION: ap-southeast-2
    steps:
      - name: Get Code
        uses: actions/checkout@v4
      - name: Start Deployment
        uses: ./.github/actions/deploy-serverless
        with:
          stage: prod