Blog AWS Indonesia

Blue/Green Deployment dengan Amazon ECS Menggunakan Amazon CodeCatalyst

Amazon CodeCatalyst adalah layanan pengembangan software modern yang memberdayakan tim untuk deliver software di AWS dengan mudah dan cepat. Amazon CodeCatalyst menyediakan satu tempat di mana Anda dapat melakukan plan, build, test serta mendeploy aplikasi container Anda dengan continuous integration/continuous delivery (CI/CD).

Dalam posting ini, kita akan membahas bagaimana Anda dapat mengkonfigurasi Blue/Green deployment dan canary untuk workload container Anda di dalam Amazon CodeCatalyst.

Prasyarat

Untuk mengikuti panduan ini, Anda memerlukan:

  • Akun AWS. Jika Anda belum memiliki akun AWS, Anda dapat membuat akun AWS baru.
  • Layanan Amazon Elastic Container Service (Amazon ECS) menggunakan tipe Blue/Green deployment. Jika Anda belum memilikinya, ikuti tutorial Amazon ECS dan selesaikan langkah 1-5.
  • Repository Amazon Elastic Container Registry (Amazon ECR) bernama codecatalyst-ecs-image-repo. Ikuti Amazon ECR user guide untuk membuat repository.
  • Sebuah Space Amazon CodeCatalyst, dengan project Amazon CodeCatalyst kosong bernama codecatalyst-ecs-project dan environment Amazon CodeCatalyst bernama codecatalyst-ecs-environment. Ikuti tutorial Amazon CodeCatalyst untuk menyiapkan ini.
  • Ikuti Amazon CodeCatalyst user guide untuk menghubungkan akun Anda ke environment tersebut.

Panduan

Sekarang setelah Anda telah menyiapkan cluster Amazon ECS dan mengkonfigurasi Amazon CodeCatalyst untuk melakukan deployment, Anda dapat mengkonfigurasi Blue/Green deployment untuk workload Anda. Berikut ini adalah langkah-langkah garis besarnya:

  • Kumpulkan detail environment Amazon ECS yang telah Anda buat pada langkah prasyarat.
  • Tambahkan source file untuk aplikasi contanainer ke Amazon CodeCatalyst.
  • Buat Amazon CodeCatalyst Workflow.
  • Validasi pengaturan.

Langkah 1: Kumpulkan detail dari Amazon ECS dan Amazon CodeCatalyst role

Pada langkah ini, Anda akan mengumpulkan informasi dari prasyarat yang akan digunakan untuk konfigurasi Blue/Green deployment Amazon CodeCatalyst pada keseluruhan posting ini.

Jika Anda mengikuti tutorial pada langkah Prasyarat, berikut adalah perintah AWS CLI untuk mengekstrak nilai yang akan digunakan pada posting ini. Anda dapat menjalankan ini pada mesin lokal Anda atau melalui AWS CloudShell di region yang sama dimana Anda membuat Amazon ECS cluster.

ECSCLUSTER='tutorial-bluegreen-cluster'
ECSSERVICE='service-bluegreen'
ECSCLUSTERARN=$(aws ecs describe-clusters --clusters $ECSCLUSTER --query 'clusters[*].clusterArn' --output text)
ECSSERVICENAME=$(aws ecs describe-services --services $ECSSERVICE --cluster $ECSCLUSTER  --query 'services[*].serviceName' --output text)
TASKDEFARN=$(aws ecs describe-services --services $ECSSERVICE --cluster $ECSCLUSTER  --query 'services[*].taskDefinition' --output text)
TASKROLE=$(aws ecs describe-task-definition --task-definition tutorial-task-def --query 'taskDefinition.executionRoleArn' --output text)
ACCOUNT=$(aws sts get-caller-identity --query "Account" --output text)
echo Account_ID value: $ACCOUNT
echo EcsRegionName value: $AWS_DEFAULT_REGION
echo EcsClusterArn value: $ECSCLUSTERARN
echo EcsServiceName value: $ECSSERVICENAME
echo TaskDefinitionArn value: $TASKDEFARN
echo TaskExecutionRoleArn value: $TASKROLE

Catat nilai dari Account_ID, EcsRegionName, EcsClusterArn, EcsServiceName, TaskDefinitionArn dan TaskExecutionRoleArn. Anda akan membutuhkan nilai ini di langkah berikutnya.

Langkah 2: Tambahkan Amazon IAM Role ke Amazon CodeCatalyst

Pada langkah ini, Anda akan membuat sebuah role dengan nama CodeCatalystWorkflowDevelopmentRole-spacename untuk memberikan Amazon CodeCatalyst permission untuk melakukan build dan deploy aplikasi. Role ini hanya direkomendasikan untuk penggunaan akun development dan role ini menggunakan AWS managed policy bernama AdministratorAccess, yang memberikan full akses untuk membuat resource dan policy pada akun AWS ini.

  • Pada Amazon CodeCatalyst, masuk ke space Anda. Pilih tab Settings.
  • Pada halaman Navigasi, pilih AWS accounts. Akan muncul daftar koneksi akun. Pilih akun yang dimana Anda telah membuatkan role build dan deploy.
  • Pilih Manage roles from AWS management console.
  • Akan muncul halaman Add IAM role to Amazon CodeCatalyst space. Anda mungkin butuh untuk sign in untuk mengaksesnya.
  • Pilih Create CodeCatalyst development administrator role in IAM. Pilihan ini akan membuat service role yang memiliki permission policy dan trust policy untuk development role.
  • Catat nama role tersebut. Pilih Create development role.

Langkah 3: Buat repository Amazon CodeCatalyst

Pada langkah ini, Anda akan membuat sebuah repository pada CodeCatalyst. Repository ini akan menyimpan file-file tutorial, seperti file task definition.

  • Pada Amazon CodeCatalyst, masuk ke project Anda.
  • Pada bagian navigasi, pilih Code, kemudian pilih Source repositories.
  • Pilih Add repository, kemudian pilih Create repository.
  • Pada Repository name, masukkan: codecatalyst-advanced-deployment
  • Pilih Create.

Langkah 4: Membuat Dev Environment Amazon CodeCatalyst

Pada langkah ini, Anda akan membuat sebuah Amazon CodeCatalyst Dev environment untuk mulai bekerja pada contoh kode aplikasi dan konfigurasi yang ada di repository codecatalyst-advanced-deployment. Pelajari lebih lanjut tentang Amazon CodeCatalyst dev environment di Amazon CodeCatalyst user guide.

  • Pada Amazon CodeCatalyst, masuk ke project Anda.
  • Pada bagian navigasi, pilih Code, kemudian pilih Source repositories.
  • Pilih source repository yang ingin Anda buat untuk environment dev.
  • Pilih Create Dev Environment.
  • Pilih AWS Cloud9 dari drop-down menu.
  • Pada halaman Create Dev Environment and open with AWS Cloud9 (gambar 1), pilih Create untuk membuat Cloud9 development environment.
Membuat Dev Environment di Amazon Code Catalyst

Gambar 1: Membuat Dev Environment di Amazon Code Catalyst

AWS Cloud9 akan membuka browser tab baru. Tetap pada window AWS Cloud9 untuk melanjutkan ke Langkah 5.

Langkah 5: Menambahkan file ke repository Amazon CodeCatalyst

Pada langkah ini, Anda akan menambahkan file dari contoh aplikasi di GitHub ke repository Amazon CodeCatalyst. Anda akan menggunakan aplikasi ini untuk mengkonfigurasi dan tes blue/green deployment.

  • Pada menu bar di bagian atas AWS Cloud9 IDE, pilih Window, New Terminal atau gunakan terminal window yang sudah ada.
  • Download project GitHub sebagai zip file, ekstrak dan pindahkan ke folder project Anda dengan menjalankan perintah berikut:
cd codecatalyst-advanced-deployment
wget -O SampleApp.zip https://github.com/build-on-aws/automate-web-app-amazon-ecs-cdk-codecatalyst/zipball/main/
unzip SampleApp.zip
mv build-on-aws-automate-web-app-amazon-ecs-cdk-codecatalyst-*/SampleApp/* .
rm -rf build-on-aws-automate-web-app-amazon-ecs-cdk-codecatalyst-*
rm SampleApp.zip
  •  Update file task definition pada aplikasi contoh. Buka task.json pada direktori aktif. Temukan dan ganti <arn:aws:iam::<account_ID>:role/AppRole> dengan nilai yang didapat dari Langkah 1: <TaskExecutionRoleArn>.
  • Amazon CodeCatalyst dapat bekerja dengan AWS CodeDeploy untuk melakukan Blue/Green deployment pada Amazon ECS. Buat sebuah file Application Specification, yang akan digunakan oleh CodeDeploy untuk memanage deployment. Buat sebuah file bernama appsec.yaml didalam direktori codecatalyst-advanced-deployment. Update <TaskDefinitionArn> dengan nilai yang didapat dari Langkah 1.
version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "<TaskDefinitionArn>"
        LoadBalancerInfo:
          ContainerName: "MyContainer"
          ContainerPort: 80
        PlatformVersion: "LATEST"
  • Commit perubahan ke repository Amazon CodeCatalyst dengan mengikuti perintah berikut. Update <your_name> dan <your_email> dengan nama dan email Anda.
git config user.email "<your_email>"
git config user.name "<your_name>"
git add .
git commit -m "Initial commit"
git push

Langkah 6: Buat Workflow Amazon CodeCatalyst

Pada langkah ini, Anda akan membuat workflow Amazon CodeCatalyst yang akan menjalankan proses build pada source code ketika ada perubahan. Sebuah workflow adalah prosedur otomatis yang mendeskripsikan bagaimana proses build, test dan deploy dari kode Anda sebagai bagian dari continuous integration dan continuous delivery (CI/CD).

  • Pada bagian navigasi, pilih CI/CD kemudian pilih Workflows.
  • Pilih Create workflow. Pilih codecatalyst-advanced-deployment dari Source repository dropdown.
  • Pilih main pada branch. Pilih Create (Gambar 2). File workflow definition akan muncul di YAML editor Amazon CodeCatalyst.

    Halaman workflow di Amazon CodeCatalyst

    Gambar 2: Halaman workflow di Amazon CodeCatalyst

  • Update workflow tersebut dengan mengganti isi pada YAML editor dengan kode dibawah. Ganti <Account_ID> dengan ID akun AWS Anda. Ganti <EcsRegionName>, <EcsClusterArn>, <EcsServiceName> dengan nilai yang didapat dari Langkah 1. Ganti <CodeCatalyst-Dev-Admin-Role> dengan yang didapat dari Langkah 3.
Name: BuildAndDeployToECS
SchemaVersion: "1.0"

# Set automatic triggers on code push.
Triggers:
  - Type: Push
    Branches:
      - main

Actions:
  Build_application:
    Identifier: aws/build@v1
    Inputs:
      Sources:
        - WorkflowSource
      Variables:
        - Name: region
          Value: <EcsRegionName>
        - Name: registry
          Value: <Account_ID>.dkr.ecr.<EcsRegionName>.amazonaws.com
        - Name: image
          Value: codecatalyst-ecs-image-repo
    Outputs:
      AutoDiscoverReports:
        Enabled: false
      Variables:
        - IMAGE
    Compute:
      Type: EC2
    Environment:
      Connections:
        - Role: <CodeCatalystPreviewDevelopmentAdministrator role>
          Name: "<Account_ID>"
      Name: codecatalyst-ecs-environment
    Configuration:
      Steps:
        - Run: export account=`aws sts get-caller-identity --output text | awk '{ print $1 }'`
        - Run: aws ecr get-login-password --region ${region} | docker login --username AWS --password-stdin ${registry}
        - Run: docker build -t appimage .
        - Run: docker tag appimage ${registry}/${image}:${WorkflowSource.CommitId}
        - Run: docker push --all-tags ${registry}/${image}
        - Run: export IMAGE=${registry}/${image}:${WorkflowSource.CommitId}
  RenderAmazonECStaskdefinition:
    Identifier: aws/ecs-render-task-definition@v1
    Configuration:
      image: ${Build_application.IMAGE}
      container-name: MyContainer
      task-definition: task.json
    Outputs:
      Artifacts:
        - Name: TaskDefinition
          Files:
            - task-definition*
    DependsOn:
      - Build_application
    Inputs:
      Sources:
        - WorkflowSource
  DeploytoAmazonECS:
    Identifier: aws/ecs-deploy@v1
    Configuration:
      task-definition: /artifacts/DeploytoAmazonECS/TaskDefinition/${RenderAmazonECStaskdefinition.task-definition}
      service: <EcsServiceName>
      cluster: <EcsClusterArn>
      region: <EcsRegionName>
      codedeploy-appspec: appspec.yaml
      codedeploy-application: tutorial-bluegreen-app
      codedeploy-deployment-group: tutorial-bluegreen-dg
      codedeploy-deployment-description: "Blue-green deployment for sample app"
    Compute:
      Type: EC2
      Fleet: Linux.x86-64.Large
    Environment:
      Connections:
        - Role: <CodeCatalyst-Dev-Admin-Role>
        # Add account id within quotes. Eg: "12345678"
          Name: "<Account_ID>"
      Name: codecatalyst-ecs-environment
    DependsOn:
      - RenderAmazonECStaskdefinition
    Inputs:
      Artifacts:
        - TaskDefinition
      Sources:
        - WorkflowSource

Workflow diatas melakukan hal berikut:

  • Ketika terjadi perubahan kode yang di-push ke repository, Build action akan dijalankan. Build action akan melakukan build container image dan melakukan push image ke repository Amazon ECR yang dibuat pada Langkah 1.
  • Ketika stage Build selesai, task definition dari Amazon ECS diupdate dengan menunjuk pada image terbaru pada repository Amazon ECR.
  • DeploytoECS action akan melakukan deploy image ke Amazon ECS menggunakan pendekatan Blue/Green.

Untuk memastikan semua dikonfigurasi dengan benar, tekan tombol Validate. Itu akan menampilkan sebuah banner hijau diatas dengan tulisan The workflow definition is valid.

Pilih Commit untuk menambahkan workflow ke repository (Gambar 3).

Halaman Commit workflow di Amazon CodeCatalyst

Gambar 3: Halaman Commit workflow di Amazon CodeCatalyst

Workflow file diletakkan di root folder ~/.codecatalyst/workflows/ dari source repository Anda. File ini dapat berupa ekstensi .yml atau .yaml.

Mari mereview langkah kita, paste URL load balancer yang dibuat dilangkah Prasyarat pada browser. Anda harusnya melihat halaman yang mirip seperti (Gambar 4).

Aplikasi contoh (Blue version)

Gambar 4: Aplikasi contoh (Blue version)

Langkah 7: Validasi pengaturan

Untuk memvalidasi, Anda perlu membuat perubahan kecil pada contoh aplikasi.

  • Buka Amazon CodeCatalyst dev environment yang Anda buat pada Langkah 4.
  • Update salinan repository local Anda. Pada terminal jalankan perintah berikut.
git pull

Pada terminal, navigasi ke folder /templates. Buka index.html dan cari tulisan “Las Vegas”. Ganti dengan “New York”. Simpan file tersebut.

Commit perubahan pada repository dengan perintah berikut.

git add .
git commit -m "Updating the city to New York"
git push

Setelah perubahan di-commit, workflow harusnya berjalan secara otomatis. Anda dapat memonitor workflow yang berjalan pada Amazon CodeCatalyst console (Gambar 5).

Progres Blue/Green Deployment pada Amazon CodeCatalyst

Gambar 5: Progres Blue/Green Deployment pada Amazon CodeCatalyst

Anda juga dapat melihat status deployment pada halaman AWS CodeDeploy (Gambar 6)

  • Kembali ke halaman AWS console
  • Pada bagian search bar, ketikkan “CodeDeploy”.
  • Pada menu bagian kiri, pilih Deployments.
Blue/Green Deployment Progress pada AWS CodeDeploy

Gambar 6: Blue/Green Deployment Progress pada AWS CodeDeploy

Mari kita review update yang dilakukan, paste load balancer URL yang dibuat pada bagian prasyarat. Halaman harusnya akan terlihat seperti gambar 7.

Contoh aplikasi (Green version)

Gambar 7: Contoh aplikasi (Green version)

Pembersihan

Jika Anda mengikuti alur diposting ini, maka Anda harusnya menghapus resource-resource yang dideploy sehingga Anda tidak dikenai biaya.

  • Hapus layanan di Amazon ECS dan Amazon ECS cluster menggunakan console AWS.
  • Secara manual hapus dev environment, repository dan project Anda dari Amazon CodeCatalyst.
  • Hapus aplikasi di AWS CodeDeploy menggunakan console atau CLI.

Kesimpulan

Pada posting ini, kita telah mendemonstrasikan bagaimana Anda dapat mengkonfigurasi Blue/Green deployment untuk workload container menggunakan workflow Amazon CodeCatalyst. Pendekatan yang sama dapat dilakukan untuk melakukan Canary deployment. Pelajari lebih lanjut tentang konfigurasi AWS CodeDeploy lebih dalam untuk deployment container di AWS CodeDeploy user guide.

Artikel ini diterjemahkan dari artikel asli dengan judul “Blue/Green Deployments with Amazon ECS using Amazon CodeCatalyst” yang ditulis oleh William Cardoso, Piyush Mattoo dan Hareesh Iyer.

Rio Astamal

Rio Astamal

Rio Astamal is a Developer Advocate at AWS and a passionate web developer since 2003. In his spare time he loves writing small open source projects to solve problem in his daily activity.