-
Notifications
You must be signed in to change notification settings - Fork 2
107 lines (97 loc) · 4.61 KB
/
cd-deploy.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
name: CD-Deploy
on:
push:
branches:
- 'develop'
env:
MLFLOW_TRACKING_PASSWORD: ${{ secrets.MLFLOW_TRACKING_PASSWORD }}
MLFLOW_TRACKING_URI: ${{ secrets.MLFLOW_TRACKING_URI }}
MLFLOW_TRACKING_USERNAME: ${{ secrets.MLFLOW_TRACKING_USERNAME }}
MODEL_NAME: 'fake-news-detect'
AWS_DEFAULT_REGION: 'us-east-1'
jobs:
build-push-deploy:
runs-on: ubuntu-latest
steps:
- name: Check out repo
uses: actions/checkout@v3
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_DEFAULT_REGION }}
- uses: hashicorp/setup-terraform@v2
with:
terraform_wrapper: false
# Define the infrastructure
- name: TF plan
id: tf-plan
working-directory: 'infrastructure'
run: |
echo "$SSH_PRIVATE_KEY" > modules/ec2/webserver_key.pem
chmod 400 modules/ec2/webserver_key.pem
terraform init -backend-config="key=mlops-final-prod.tfstate" -reconfigure && terraform plan -var-file=vars/prod.tfvars
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
- name: TF Apply
id: tf-apply
working-directory: 'infrastructure'
if: ${{ steps.tf-plan.outcome }} == 'success'
run: |
terraform apply -auto-approve -var-file=vars/prod.tfvars
echo "::set-output name=ecr_repo::$(terraform output ecr_repo | xargs)"
echo "::set-output name=model_bucket::$(terraform output model_bucket | xargs)"
echo "::set-output name=lambda_function::$(terraform output lambda_function | xargs)"
echo "::set-output name=lambda_rest_api_url::$(terraform output lambda_rest_api_url | xargs)"
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
# Build-Push
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image-step
working-directory: 'web_service'
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ steps.tf-apply.outputs.ecr_repo }}
IMAGE_TAG: "latest"
run: |
docker build -t ${ECR_REGISTRY}/${ECR_REPOSITORY}:${IMAGE_TAG} . \
--build-arg MLFLOW_TRACKING_URI=${MLFLOW_TRACKING_URI} \
--build-arg MLFLOW_TRACKING_USERNAME=${MLFLOW_TRACKING_USERNAME} \
--build-arg MLFLOW_TRACKING_PASSWORD=${MLFLOW_TRACKING_PASSWORD} \
--build-arg AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} \
--build-arg AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} \
--build-arg MODEL_NAME=${MODEL_NAME}
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image_uri::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
# Deploy
- name: Update function container
id: deploy-step
env:
LAMBDA_FUNCTION: ${{ steps.tf-apply.outputs.lambda_function }}
IMAGE_URI: ${{ steps.build-image-step.outputs.image_uri }}
URL: ${{ steps.tf-apply.outputs.lambda_rest_api_url }}
run: |
STATE=$(aws lambda get-function --function-name $LAMBDA_FUNCTION --region ${AWS_DEFAULT_REGION} --query 'Configuration.LastUpdateStatus' --output text)
while [[ "$STATE" == "InProgress" ]]
do
echo "sleep 5sec ...."
sleep 5s
STATE=$(aws lambda get-function --function-name $LAMBDA_FUNCTION --region ${AWS_DEFAULT_REGION} --query 'Configuration.LastUpdateStatus' --output text)
echo $STATE
done
aws lambda update-function-code --function-name $LAMBDA_FUNCTION --image-uri $IMAGE_URI
STATE=$(aws lambda get-function --function-name $LAMBDA_FUNCTION --region ${AWS_DEFAULT_REGION} --query 'Configuration.LastUpdateStatus' --output text)
while [[ "$STATE" == "InProgress" ]]
do
echo "sleep 5sec ...."
sleep 5s
STATE=$(aws lambda get-function --function-name $LAMBDA_FUNCTION --region ${AWS_DEFAULT_REGION} --query 'Configuration.LastUpdateStatus' --output text)
echo $STATE
done
echo "Successfully updated Lambda Function. Test by sending a POST request to at $URL"