Skip to content

Terraform Deploy

Terraform Deploy #7

name: Terraform Plan
on:
workflow_dispatch:
inputs:
confirm_plan:
description: 'Type "plan" to confirm generating a plan'
required: true
type: string
permissions:
contents: read
pull-requests: write
actions: write
jobs:
terraform:
name: 'Terraform Plan'
runs-on: ubuntu-latest
if: github.event.inputs.confirm_plan == 'plan'
defaults:
run:
working-directory: ./terraform
steps:
- name: Checkout
uses: actions/checkout@v4
- 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: ${{ secrets.AWS_REGION }}
- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: SonarQube Scan
uses: SonarSource/sonarqube-scan-action@v1
continue-on-error: true
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
with:
projectBaseDir: ./terraform
args: >
-Dsonar.projectKey=${{ vars.PROJECT_NAME }}
-Dsonar.projectName=${{ vars.PROJECT_NAME }}
-Dsonar.organization=${{ vars.SONAR_ORGANIZATION }}
-Dsonar.sources=.
- name: Checkov Security Scan
uses: bridgecrewio/checkov-action@v2
with:
directory: ./terraform
framework: terraform
soft_fail: true
- name: Run Trivy vulnerability scanner
uses: aquasecurity/trivy-action@master
continue-on-error: true
with:
image-ref: '${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ vars.REPOSITORY_NAME }}:${{ vars.IMAGE_TAG }}'
format: 'table'
exit-code: '0'
severity: 'CRITICAL,HIGH'
- name: Setup Terraform
uses: hashicorp/setup-terraform@v2
with:
terraform_version: 1.5.0
- name: Terraform Init
run: >
terraform init \
-backend-config="bucket=${{ secrets.TERRAFORM_STATE_BUCKET }}" \
-backend-config="key=${{ secrets.TERRAFORM_STATE_KEY }}" \
-backend-config="region=${{ secrets.AWS_REGION }}" \
-backend-config="encrypt=true"
- name: Terraform Validate
run: terraform validate
- name: Terraform Plan
run: |
terraform plan \
-var="domain_name=${{ vars.DOMAIN_NAME }}" \
-var="project_name=${{ vars.PROJECT_NAME }}" \
-var="record_name=${{ vars.RECORD_NAME }}" \
-var="task_role_arn=${{ secrets.TASK_ROLE_ARN }}" \
-var="execution_role_arn=${{ secrets.EXECUTION_ROLE_ARN }}" \
-var="container_image=${{ secrets.CONTAINER_IMAGE }}" \
-input=false \
-out=tfplan
- name: Upload Plan Artifact
uses: actions/upload-artifact@v2
with:
name: terraform-plan
path: terraform/tfplan
retention-days: 1
- name: Verify Plan file
run: ls -la terraform