Menerapkan ECS layanan Amazon menggunakan penerapan biru/hijau - Amazon Elastic Container Service

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Menerapkan ECS layanan Amazon menggunakan penerapan biru/hijau

Pelajari cara membuat ECS layanan Amazon yang berisi tugas Fargate yang menggunakan tipe penerapan biru/hijau dengan. AWS CLI

catatan

Dukungan untuk melakukan deployment biru/hijau telah ditambahkan untuk AWS CloudFormation. Untuk informasi selengkapnya, lihat Menjalankan penerapan ECS biru/hijau Amazon melalui CodeDeploy penggunaan AWS CloudFormation di Panduan Pengguna.AWS CloudFormation

Prasyarat

Tutorial ini mengasumsikan bahwa Anda telah menyelesaikan prasyarat berikut:

Langkah 1: Buat Application Load Balancer

ECSLayanan Amazon yang menggunakan tipe penyebaran biru/hijau memerlukan penggunaan Application Load Balancer atau Network Load Balancer. Tutorial ini menggunakan Application Load Balancer.

Untuk membuat Application Load Balancer
  1. Gunakan create-load-balancerperintah untuk membuat Application Load Balancer. Tentukan dua subnet yang bukan dari Availability Zone serta grup keamanan yang sama.

    aws elbv2 create-load-balancer \ --name bluegreen-alb \ --subnets subnet-abcd1234 subnet-abcd5678 \ --security-groups sg-abcd1234 \ --region us-east-1

    Outputnya mencakup Amazon Resource Name (ARN) dari load balancer, dengan format berikut:

    arn:aws:elasticloadbalancing:region:aws_account_id:loadbalancer/app/bluegreen-alb/e5ba62739c16e642
  2. Gunakan create-target-groupperintah untuk membuat grup target. Grup target ini akan merutekan lalu lintas ke tugas asli yang ditetapkan dalam layanan Anda.

    aws elbv2 create-target-group \ --name bluegreentarget1 \ --protocol HTTP \ --port 80 \ --target-type ip \ --vpc-id vpc-abcd1234 \ --region us-east-1

    Outputnya mencakup kelompok target, dengan format berikut: ARN

    arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4
  3. Menggunakan perintah create-listener untuk membuat listener penyeimbang beban dengan aturan default yang meneruskan permintaan ke grup target.

    aws elbv2 create-listener \ --load-balancer-arn arn:aws:elasticloadbalancing:region:aws_account_id:loadbalancer/app/bluegreen-alb/e5ba62739c16e642 \ --protocol HTTP \ --port 80 \ --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4 \ --region us-east-1

    Outputnya mencakup ARN pendengar, dengan format berikut:

    arn:aws:elasticloadbalancing:region:aws_account_id:listener/app/bluegreen-alb/e5ba62739c16e642/665750bec1b03bd4

Langkah 2: Buat ECS cluster Amazon

Gunakan perintah create-cluster untuk membuat sebuah klaster bernama tutorial-bluegreen-cluster untuk digunakan.

aws ecs create-cluster \ --cluster-name tutorial-bluegreen-cluster \ --region us-east-1

Outputnya mencakup cluster, dengan format berikut: ARN

arn:aws:ecs:region:aws_account_id:cluster/tutorial-bluegreen-cluster

Langkah 3: Daftarkan ketentuan tugas

Gunakan register-task-definitionperintah untuk mendaftarkan definisi tugas yang kompatibel dengan Fargate. Hal ini membutuhkan penggunaan mode jaringan awsvpc. Berikut ini adalah contoh ketentuan tugas yang digunakan untuk tutorial ini.

Pertama, buat file bernama fargate-task.json dengan isi berikut. Pastikan Anda menggunakan peran eksekusi tugas ARN untuk Anda. Untuk informasi selengkapnya, lihat IAMPeran eksekusi ECS tugas Amazon.

{ "family": "tutorial-task-def", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "sample-app", "image": "httpd:2.4", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true, "entryPoint": [ "sh", "-c" ], "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #00FFFF;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512", "executionRoleArn": "arn:aws:iam::aws_account_id:role/ecsTaskExecutionRole" }

Kemudian daftarkan ketentuan tugas menggunakan file fargate-task.json yang Anda buat.

aws ecs register-task-definition \ --cli-input-json file://fargate-task.json \ --region us-east-1

Langkah 4: Buat ECS layanan Amazon

Gunakan perintah create-service untuk membuat layanan.

Pertama, buat file bernama service-bluegreen.json dengan konten berikut.

{ "cluster": "tutorial-bluegreen-cluster", "serviceName": "service-bluegreen", "taskDefinition": "tutorial-task-def", "loadBalancers": [ { "targetGroupArn": "arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4", "containerName": "sample-app", "containerPort": 80 } ], "launchType": "FARGATE", "schedulingStrategy": "REPLICA", "deploymentController": { "type": "CODE_DEPLOY" }, "platformVersion": "LATEST", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-abcd1234" ], "subnets": [ "subnet-abcd1234", "subnet-abcd5678" ] } }, "desiredCount": 1 }

Kemudian buat layanan Anda menggunakan file service-bluegreen.json yang Anda buat.

aws ecs create-service \ --cli-input-json file://service-bluegreen.json \ --region us-east-1

Outputnya mencakup layanan, dengan format berikut: ARN

arn:aws:ecs:region:aws_account_id:service/service-bluegreen

Dapatkan DNS nama penyeimbang beban menggunakan perintah berikut.

aws elbv2 describe-load-balancers --name bluegreen-alb --query 'LoadBalancers[*].DNSName'

Masukkan DNS nama di browser web Anda dan Anda akan melihat halaman web yang menampilkan aplikasi sampel dengan latar belakang biru.

Langkah 5: Buat sumber daya AWS CodeDeploy

Gunakan langkah-langkah berikut untuk membuat CodeDeploy aplikasi Anda, grup target Application Load Balancer untuk grup CodeDeploy penyebaran, dan grup penyebaran. CodeDeploy

Untuk membuat CodeDeploy sumber daya
  1. Gunakan perintah create-application untuk membuat aplikasi. CodeDeploy Tentukan platform komputasi ECS.

    aws deploy create-application \ --application-name tutorial-bluegreen-app \ --compute-platform ECS \ --region us-east-1

    Output termasuk ID aplikasi, dengan format berikut:

    {
        "applicationId": "b8e9c1ef-3048-424e-9174-885d7dc9dc11"
    }
  2. Gunakan create-target-groupperintah untuk membuat grup target Application Load Balancer kedua, yang akan digunakan saat membuat grup CodeDeploy penyebaran Anda.

    aws elbv2 create-target-group \ --name bluegreentarget2 \ --protocol HTTP \ --port 80 \ --target-type ip \ --vpc-id "vpc-0b6dd82c67d8012a1" \ --region us-east-1

    Output termasuk ARN untuk kelompok target, dengan format berikut:

    arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget2/708d384187a3cfdc
  3. Gunakan create-deployment-groupperintah untuk membuat grup CodeDeploy penyebaran.

    Pertama, buat file bernama tutorial-deployment-group.json dengan konten berikut. Contoh ini menggunakan sumber daya yang Anda buat. UntukserviceRoleArn, tentukan ARN ECS CodeDeploy IAM peran Amazon Anda. Untuk informasi selengkapnya, lihat ECS CodeDeploy IAMPeran Amazon.

    { "applicationName": "tutorial-bluegreen-app", "autoRollbackConfiguration": { "enabled": true, "events": [ "DEPLOYMENT_FAILURE" ] }, "blueGreenDeploymentConfiguration": { "deploymentReadyOption": { "actionOnTimeout": "CONTINUE_DEPLOYMENT", "waitTimeInMinutes": 0 }, "terminateBlueInstancesOnDeploymentSuccess": { "action": "TERMINATE", "terminationWaitTimeInMinutes": 5 } }, "deploymentGroupName": "tutorial-bluegreen-dg", "deploymentStyle": { "deploymentOption": "WITH_TRAFFIC_CONTROL", "deploymentType": "BLUE_GREEN" }, "loadBalancerInfo": { "targetGroupPairInfoList": [ { "targetGroups": [ { "name": "bluegreentarget1" }, { "name": "bluegreentarget2" } ], "prodTrafficRoute": { "listenerArns": [ "arn:aws:elasticloadbalancing:region:aws_account_id:listener/app/bluegreen-alb/e5ba62739c16e642/665750bec1b03bd4" ] } } ] }, "serviceRoleArn": "arn:aws:iam::aws_account_id:role/ecsCodeDeployRole", "ecsServices": [ { "serviceName": "service-bluegreen", "clusterName": "tutorial-bluegreen-cluster" } ] }

    Kemudian buat grup CodeDeploy penyebaran.

    aws deploy create-deployment-group \ --cli-input-json file://tutorial-deployment-group.json \ --region us-east-1

    Output termasuk ID grup deployment, dengan format berikut:

    {
        "deploymentGroupId": "6fd9bdc6-dc51-4af5-ba5a-0a4a72431c88"
    }

Langkah 6: Buat dan pantau CodeDeploy penyebaran

Sebelum membuat CodeDeploy penerapan, perbarui definisi command tugas fargate-task.json sebagai berikut untuk mengubah warna latar belakang aplikasi sampel menjadi hijau.

{ ... "containerDefinitions": [ { ... "command": [ "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #097969;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' > /usr/local/apache2/htdocs/index.html && httpd-foreground\"" ] } ], ... }

Daftarkan definisi tugas yang diperbarui menggunakan perintah berikut.

aws ecs register-task-definition \ --cli-input-json file://fargate-task.json \ --region us-east-1

Sekarang, gunakan langkah-langkah berikut untuk membuat dan mengunggah file spesifikasi aplikasi (AppSpec file) dan CodeDeploy penyebaran.

Untuk membuat dan memantau CodeDeploy penyebaran
  1. Buat dan unggah AppSpec file menggunakan langkah-langkah berikut.

    1. Buat file bernama appspec.yaml dengan isi grup CodeDeploy penyebaran. Contoh ini menggunakan definisi tugas yang diperbarui.

      version: 0.0 Resources: - TargetService: Type: AWS::ECS::Service Properties: TaskDefinition: "arn:aws:ecs:region:aws_account_id:task-definition/tutorial-task-def:2" LoadBalancerInfo: ContainerName: "sample-app" ContainerPort: 80 PlatformVersion: "LATEST"
    2. Gunakan perintah s3 mb untuk membuat bucket Amazon S3 untuk AppSpec file tersebut.

      aws s3 mb s3://tutorial-bluegreen-bucket
    3. Gunakan perintah s3 cp untuk mengunggah AppSpec file ke bucket Amazon S3.

      aws s3 cp ./appspec.yaml s3://tutorial-bluegreen-bucket/appspec.yaml
  2. Buat CodeDeploy penyebaran menggunakan langkah-langkah berikut.

    1. Buat file bernama create-deployment.json dengan isi CodeDeploy penyebaran. Contoh ini menggunakan sumber daya yang Anda buat sebelumnya dalam tutorial.

      { "applicationName": "tutorial-bluegreen-app", "deploymentGroupName": "tutorial-bluegreen-dg", "revision": { "revisionType": "S3", "s3Location": { "bucket": "tutorial-bluegreen-bucket", "key": "appspec.yaml", "bundleType": "YAML" } } }
    2. Gunakan perintah create-deployment untuk membuat deployment.

      aws deploy create-deployment \ --cli-input-json file://create-deployment.json \ --region us-east-1

      Output termasuk ID deployment, dengan format berikut:

      {
          "deploymentId": "d-RPCR1U3TW"
      }
  3. Gunakan get-deployment-targetperintah untuk mendapatkan rincian penyebaran, menentukan deploymentId dari output sebelumnya.

    aws deploy get-deployment-target \ --deployment-id "d-IMJU3A8TW" \ --target-id tutorial-bluegreen-cluster:service-bluegreen \ --region us-east-1

    Awalnya, status penyebaran adalahInProgress. Lalu lintas diarahkan ke set tugas asli, yang memiliki taskSetLabel dariBLUE, statusPRIMARY, dan a trafficWeight100.0. Set tugas pengganti memiliki taskSetLabel dariGREEN, statusACTIVE, dan a trafficWeight dari0.0. Browser web tempat Anda memasukkan DNS nama masih menampilkan aplikasi sampel dengan latar belakang biru.

    {
    "deploymentTarget": {
    "deploymentTargetType": "ECSTarget",
    "ecsTarget": {
        "deploymentId": "d-RPCR1U3TW",
        "targetId": "tutorial-bluegreen-cluster:service-bluegreen",
        "targetArn": "arn:aws:ecs:region:aws_account_id:service/service-bluegreen",
        "lastUpdatedAt": "2023-08-10T12:07:24.797000-05:00",
        "lifecycleEvents": [
            {
                "lifecycleEventName": "BeforeInstall",
                "startTime": "2023-08-10T12:06:22.493000-05:00",
                "endTime": "2023-08-10T12:06:22.790000-05:00",
                "status": "Succeeded"
            },
            {
                "lifecycleEventName": "Install",
                "startTime": "2023-08-10T12:06:22.936000-05:00",
                "status": "InProgress"
            },
            {
                "lifecycleEventName": "AfterInstall",
                "status": "Pending"
            },
            {
                "lifecycleEventName": "BeforeAllowTraffic",
                "status": "Pending"
            },
            {
                "lifecycleEventName": "AllowTraffic",
                "status": "Pending"
            },
            {
                "lifecycleEventName": "AfterAllowTraffic",
                "status": "Pending"
            }
        ],
        "status": "InProgress",
        "taskSetsInfo": [
            {
                "identifer": "ecs-svc/9223370493423413672",
                "desiredCount": 1,
                "pendingCount": 0,
                "runningCount": 1,
                "status": "ACTIVE",
                "trafficWeight": 0.0,
                "targetGroup": {
                    "name": "bluegreentarget2"
                },
                "taskSetLabel": "Green"
            },
            {
                "identifer": "ecs-svc/9223370493425779968",
                "desiredCount": 1,
                "pendingCount": 0,
                "runningCount": 1,
                "status": "PRIMARY",
                "trafficWeight": 100.0,
                "targetGroup": {
                    "name": "bluegreentarget1"
                },
                "taskSetLabel": "Blue"
            }
        ]
    }
    }
    }

    Lanjutkan untuk mengambil rincian penyebaran menggunakan perintah sampai status penyebaranSucceeded, seperti yang ditunjukkan pada output berikut. Lalu lintas sekarang dialihkan ke set tugas pengganti, yang sekarang memiliki status PRIMARY dan a trafficWeight dari. 100.0 Segarkan browser web tempat Anda memasukkan DNS nama penyeimbang beban, dan sekarang Anda akan melihat aplikasi sampel dengan latar belakang hijau.

    {
    "deploymentTarget": {
    "deploymentTargetType": "ECSTarget",
    "ecsTarget": {
        "deploymentId": "d-RPCR1U3TW",
        "targetId": "tutorial-bluegreen-cluster:service-bluegreen",
        "targetArn": "arn:aws:ecs:region:aws_account_id:service/service-bluegreen",
        "lastUpdatedAt": "2023-08-10T12:07:24.797000-05:00",
        "lifecycleEvents": [
            {
                "lifecycleEventName": "BeforeInstall",
                "startTime": "2023-08-10T12:06:22.493000-05:00",
                "endTime": "2023-08-10T12:06:22.790000-05:00",
                "status": "Succeeded"
            },
            {
                "lifecycleEventName": "Install",
                "startTime": "2023-08-10T12:06:22.936000-05:00",
                "endTime": "2023-08-10T12:08:25.939000-05:00",
                "status": "Succeeded"
            },
            {
                "lifecycleEventName": "AfterInstall",
                "startTime": "2023-08-10T12:08:26.089000-05:00",
                "endTime":  "2023-08-10T12:08:26.403000-05:00",
                "status": "Succeeded"
            },
            {
                "lifecycleEventName": "BeforeAllowTraffic",
                "startTime": "2023-08-10T12:08:26.926000-05:00",
                "endTime":  "2023-08-10T12:08:27.256000-05:00",
                "status": "Succeeded"
            },
            {
                "lifecycleEventName": "AllowTraffic",
                "startTime": "2023-08-10T12:08:27.416000-05:00",
                "endTime": "2023-08-10T12:08:28.195000-05:00",
                "status": "Succeeded"
            },
            {
                "lifecycleEventName": "AfterAllowTraffic",
                "startTime": "2023-08-10T12:08:28.715000-05:00",
                "endTime":  "2023-08-10T12:08:28.994000-05:00",
                "status": "Succeeded"
            }
        ],
        "status": "Succeeded",
        "taskSetsInfo": [
            {
                "identifer": "ecs-svc/9223370493425779968",
                "desiredCount": 1,
                "pendingCount": 0,
                "runningCount": 1,
                "status": "ACTIVE",
                "trafficWeight": 0.0,
                "targetGroup": {
                    "name": "bluegreentarget1"
                },
                "taskSetLabel": "Blue"
            },
            {
                "identifer": "ecs-svc/9223370493423413672",
                "desiredCount": 1,
                "pendingCount": 0,
                "runningCount": 1,
                "status": "PRIMARY",
                "trafficWeight": 100.0,
                "targetGroup": {
                    "name": "bluegreentarget2"
                },
                "taskSetLabel": "Green"
            }
        ]
    }
    }
    }

Langkah 7: Bersihkan

Bila Anda telah menyelesaikan tutorial ini, bersihkan sumber daya yang terkait dengannya untuk menghindari biaya untuk sumber daya yang tidak Anda gunakan.

Membersihkan sumber daya tutorial
  1. Gunakan delete-deployment-groupperintah untuk menghapus grup CodeDeploy penyebaran.

    aws deploy delete-deployment-group \ --application-name tutorial-bluegreen-app \ --deployment-group-name tutorial-bluegreen-dg \ --region us-east-1
  2. Gunakan perintah hapus-aplikasi untuk menghapus aplikasi. CodeDeploy

    aws deploy delete-application \ --application-name tutorial-bluegreen-app \ --region us-east-1
  3. Gunakan perintah delete-service untuk menghapus layanan AmazonECS. Menggunakan bendera --force mengizinkan Anda untuk menghapus layanan bahkan jika itu tidak menurunkan skala ke tugas nol.

    aws ecs delete-service \ --service arn:aws:ecs:region:aws_account_id:service/service-bluegreen \ --force \ --region us-east-1
  4. Gunakan perintah delete-cluster untuk menghapus cluster AmazonECS.

    aws ecs delete-cluster \ --cluster tutorial-bluegreen-cluster \ --region us-east-1
  5. Gunakan perintah s3 rm untuk menghapus AppSpec file dari bucket Amazon S3.

    aws s3 rm s3://tutorial-bluegreen-bucket/appspec.yaml
  6. Gunakan perintah s3 rb untuk menghapus bucket Amazon S3.

    aws s3 rb s3://tutorial-bluegreen-bucket
  7. Gunakan delete-load-balancerperintah untuk menghapus Application Load Balancer.

    aws elbv2 delete-load-balancer \ --load-balancer-arn arn:aws:elasticloadbalancing:region:aws_account_id:loadbalancer/app/bluegreen-alb/e5ba62739c16e642 \ --region us-east-1
  8. Gunakan delete-target-groupperintah untuk menghapus dua kelompok target Application Load Balancer.

    aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget1/209a844cd01825a4 \ --region us-east-1
    aws elbv2 delete-target-group \ --target-group-arn arn:aws:elasticloadbalancing:region:aws_account_id:targetgroup/bluegreentarget2/708d384187a3cfdc \ --region us-east-1