feat: Implement comprehensive AWS Lambda deployment workflow with ver… #7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Deploy to AWS Lambda | |
on: | |
push: | |
branches: | |
- main | |
env: | |
LAMBDA_FUNCTION_NAME: time-warden | |
ALIAS_NAME: production | |
jobs: | |
deploy: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v3 | |
- name: Setup Node.js | |
uses: actions/setup-node@v3 | |
with: | |
node-version: '16' | |
cache: 'npm' | |
- name: Install dependencies | |
run: npm ci | |
- name: Run Tests | |
run: npm run test || echo "No tests specified" | |
- name: Build TypeScript | |
run: npm run build | |
- name: Package Lambda | |
run: | | |
echo "Creating deployment package..." | |
cd dist | |
zip -r ../lambda.zip . | |
cd .. | |
zip -r lambda.zip node_modules/ | |
echo "Package size: $(ls -lh lambda.zip | awk '{print $5}')" | |
- name: Configure AWS Credentials | |
uses: aws-actions/configure-aws-credentials@v2 | |
with: | |
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} | |
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} | |
aws-region: ${{ secrets.AWS_REGION }} | |
- name: Get Current Published Version | |
id: get_current_version | |
run: | | |
CURRENT_VERSION=$(aws lambda get-function --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --query 'Configuration.Version' --output text) | |
echo "CURRENT_VERSION=$CURRENT_VERSION" >> $GITHUB_ENV | |
echo "Current published version: $CURRENT_VERSION" | |
- name: Deploy New Code | |
id: deploy_new_code | |
run: | | |
echo "Updating function code..." | |
aws lambda update-function-code --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --zip-file fileb://lambda.zip | |
- name: Publish New Version | |
id: publish_version | |
run: | | |
NEW_VERSION=$(aws lambda publish-version --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --query 'Version' --output text) | |
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV | |
echo "Published new version: $NEW_VERSION" | |
- name: Update Alias to New Version | |
id: update_alias | |
run: | | |
echo "Updating alias ${{ env.ALIAS_NAME }} to point to version $NEW_VERSION" | |
aws lambda update-alias --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --name ${{ env.ALIAS_NAME }} --function-version $NEW_VERSION | |
- name: Verify Deployment | |
run: | | |
echo "Waiting for function update to complete..." | |
sleep 10 | |
FUNCTION_INFO=$(aws lambda get-function --function-name ${{ env.LAMBDA_FUNCTION_NAME }}) | |
FUNCTION_STATE=$(echo $FUNCTION_INFO | jq -r '.Configuration.State') | |
LAST_UPDATE=$(echo $FUNCTION_INFO | jq -r '.Configuration.LastModified') | |
CODE_SIZE=$(echo $FUNCTION_INFO | jq -r '.Configuration.CodeSize') | |
echo "Function State: $FUNCTION_STATE" | |
echo "Last Updated: $LAST_UPDATE" | |
echo "Code Size: $CODE_SIZE bytes" | |
if [ "$FUNCTION_STATE" != "Active" ]; then | |
echo "Error: Function is not Active" | |
exit 1 | |
fi | |
- name: Rollback on Failure | |
if: failure() | |
run: | | |
echo "Deployment failed. Rolling back alias to previous version ${{ env.CURRENT_VERSION }}" | |
aws lambda update-alias --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --name ${{ env.ALIAS_NAME }} --function-version ${{ env.CURRENT_VERSION }} | |
ROLLBACK_STATE=$(aws lambda get-function --function-name ${{ env.LAMBDA_FUNCTION_NAME }} --query 'Configuration.State' --output text) | |
echo "Rollback state: $ROLLBACK_STATE" | |
if [ "$ROLLBACK_STATE" != "Active" ]; then | |
echo "Error: Rollback failed, manual intervention required" | |
exit 1 | |
fi | |
echo "Rollback completed successfully" |