Configuration d'Amazon ECS Service Connect avec AWS CLI - Amazon Elastic Container Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Configuration d'Amazon ECS Service Connect avec AWS CLI

Vous pouvez créer un ECS service Amazon pour une tâche Fargate qui utilise Service Connect avec l'. AWS CLI

Prérequis

Les prérequis sont les suivants :

  • Vérifiez que la région prend en charge Service Connect. Pour de plus amples informations, veuillez consulter Regions with Service Connect.

  • Vérifiez que la version la plus récente de l' AWS CLI est installée et configurée. Pour plus d'informations, veuillez consulter Installation ou mise à jour vers la version la plus récente de l' AWS CLI.

  • Votre AWS utilisateur dispose des autorisations requises spécifiées dans l'exemple Amazon ECS _ FullAccess IAM de politique.

  • Vous avez un sous-réseauVPC, une table de routage et un groupe de sécurité prêts à être utilisés. Pour de plus amples informations, veuillez consulter Créer un Virtual Private Cloud.

  • Vous avez un rôle d'exécution de tâches portant le nom ecsTaskExecutionRole et la politique gérée par AmazonECSTaskExecutionRolePolicy est associée au rôle. Ce rôle permet à Fargate d'écrire les journaux de NGINX l'application et les journaux du proxy Service Connect dans Amazon Logs. CloudWatch Pour de plus amples informations, veuillez consulter Création du rôle d'exécution de tâche.

Étape 1 : créer le cluster

Pour créer votre espace de noms et votre ECS cluster Amazon, effectuez les étapes suivantes.

Pour créer le ECS cluster et l'espace de AWS Cloud Map noms Amazon
  1. Créez un ECS cluster Amazon nommé tutorial à utiliser. Le paramètre --service-connect-defaults définit l'espace de noms par défaut du cluster. Dans l'exemple de sortie, un AWS Cloud Map espace de noms portant ce nom service-connect n'existe pas dans ce compte et Région AWS dans la. L'espace de noms est donc créé par Amazon. ECS L'espace de noms est créé dans AWS Cloud Map dans le compte, et il est visible avec tous les autres espaces de noms. Utilisez donc un nom descriptif.

    aws ecs create-cluster --cluster-name tutorial --service-connect-defaults namespace=service-connect

    Sortie :

    {
        "cluster": {
            "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
            "clusterName": "tutorial",
            "serviceConnectDefaults": {
                "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE"
            },
            "status": "PROVISIONING",
            "registeredContainerInstancesCount": 0,
            "runningTasksCount": 0,
            "pendingTasksCount": 0,
            "activeServicesCount": 0,
            "statistics": [],
            "tags": [],
            "settings": [
                {
                    "name": "containerInsights",
                    "value": "disabled"
                }
            ],
            "capacityProviders": [],
            "defaultCapacityProviderStrategy": [],
            "attachments": [
                {
                    "id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
                    "type": "sc",
                    "status": "ATTACHING",
                    "details": []
                }
            ],
            "attachmentsStatus": "UPDATE_IN_PROGRESS"
        }
    }
    }
  2. Vérifiez que le cluster est créé :

    aws ecs describe-clusters --clusters tutorial

    Sortie :

    {
        "clusters": [
            {
                "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
                "clusterName": "tutorial",
                "serviceConnectDefaults": {
                    "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE"
                },
                "status": "ACTIVE",
                "registeredContainerInstancesCount": 0,
                "runningTasksCount": 0,
                "pendingTasksCount": 0,
                "activeServicesCount": 0,
                "statistics": [],
                "tags": [],
                "settings": [],
                "capacityProviders": [],
                "defaultCapacityProviderStrategy": []
            }
        ],
        "failures": []
    }
                    
  3. (Facultatif) Vérifiez que l'espace de noms est créé dans AWS Cloud Map. Vous pouvez utiliser la configuration AWS Management Console ou la AWS CLI configuration normale telle qu'elle a été créée dans AWS Cloud Map.

    Par exemple, utilisez l' AWS CLI :

    aws servicediscovery --region us-west-2 get-namespace --id ns-EXAMPLE

    Sortie :

    {
        "Namespace": {
            "Id": "ns-EXAMPLE",
            "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE",
            "Name": "service-connect",
            "Type": "HTTP",
            "Properties": {
                "DnsProperties": {
                    "SOA": {}
                },
                "HttpProperties": {
                    "HttpName": "service-connect"
                }
            },
            "CreateDate": 1661749852.422,
            "CreatorRequestId": "service-connect"
        }
    }
                    

Étape 2 : Créer le service pour le serveur

La fonctionnalité Service Connect est destinée à interconnecter plusieurs applications sur AmazonECS. Au moins l'une de ces applications doit fournir un service Web auquel se connecter. Au cours de cette étape, vous allez créer :

  • La définition de tâche qui utilise l'image officielle non modifiée du NGINX conteneur et qui inclut la configuration de Service Connect.

  • La définition du ECS service Amazon qui configure Service Connect pour fournir la découverte de services et un proxy de maillage de services pour le trafic vers ce service. La configuration réutilise l'espace de noms par défaut de la configuration du cluster afin de réduire la quantité de configuration de service que vous effectuez pour chaque service.

  • Le ECS service Amazon. Il exécute une tâche à l'aide de la définition de tâche et insère un conteneur supplémentaire pour le proxy Service Connect. Le proxy écoute sur le port depuis le mappage de ports du conteneur dans la définition de la tâche. Dans une application cliente exécutée sur AmazonECS, le proxy intégré à la tâche client écoute les connexions sortantes vers le nom du port de définition de la tâche, le nom de découverte du service ou le nom d'alias du client de service, ainsi que le numéro de port provenant de l'alias client.

Pour créer le service Web avec Service Connect
  1. Enregistrez une définition de tâche compatible avec Fargate et qui utilise le mode réseau awsvpc. Procédez comme suit :

    1. Créez un fichier nommé service-connect-nginx.json avec le contenu de la définition de tâche suivante.

      Cette définition de tâche configure Service Connect en ajoutant les paramètres de name et de appProtocol au mappage des ports. Le nom du port permet de mieux identifier ce port dans la configuration du service lorsque plusieurs ports sont utilisés. Le nom du port est également utilisé par défaut comme nom détectable à utiliser par d'autres applications de l'espace de noms.

      La définition de tâche contient le IAM rôle de tâche, car ECS Exec est activé sur le service.

      Important

      Cette définition de tâche utilise un logConfiguration pour envoyer la sortie nginx depuis stdout et stderr vers Amazon Logs. CloudWatch Ce rôle d'exécution de tâches ne dispose pas des autorisations supplémentaires requises pour créer le groupe de CloudWatch journaux Logs. Créez le groupe de CloudWatch journaux dans Logs à l'aide du AWS Management Console ou AWS CLI. Si vous ne souhaitez pas envoyer les journaux nginx à Logs, vous pouvez CloudWatch supprimer le. logConfiguration

      Remplacez l' Compte AWS ID du rôle d'exécution de tâche par votre Compte AWS ID.

      { "family": "service-connect-nginx", "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole", "taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "webserver", "image": "public.ecr.aws/docker/library/nginx:latest", "cpu": 100, "portMappings": [ { "name": "nginx", "containerPort": 80, "protocol": "tcp", "appProtocol": "http" } ], "essential": true, "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/service-connect-nginx", "awslogs-region": "region", "awslogs-stream-prefix": "nginx" } } } ], "cpu": "256", "memory": "512" }
    2. Enregistrez la définition de tâche à l'aide du fichier service-connect-nginx.json :

      aws ecs register-task-definition --cli-input-json file://service-connect-nginx.json
  2. Création d'un service :

    1. Créez un fichier nommé service-connect-nginx-service.json avec le contenu du ECS service Amazon que vous créez. Cet exemple utilise la définition de tâche créée à l'étape précédente. Le paramètre awsvpcConfiguration est obligatoire, car l'exemple de définition de tâche utilise le mode réseau awsvpc.

      Lorsque vous créez le ECS service, spécifiez le type de lancement Fargate et LATEST la version de plateforme qui prend en charge Service Connect. Le securityGroups et subnets doit appartenir à un VPC répondant aux exigences requises pour utiliser AmazonECS. Vous pouvez obtenir le groupe de sécurité et le sous-réseau IDs à partir de la VPC console Amazon Console.

      Ce service configure Service Connect en ajoutant le paramètre serviceConnectConfiguration. L'espace de noms n'est pas obligatoire car un espace de noms par défaut est configuré pour le cluster. Les applications clientes exécutées ECS dans l'espace de noms se connectent à ce service en utilisant le port portName et le port duclientAliases. Par exemple, ce service est accessible via http://nginx:80/, car nginx fournit une page de bienvenue à l'emplacement racine /. Les applications externes qui ne s'exécutent pas dans Amazon ECS ou qui ne se trouvent pas dans le même espace de noms peuvent accéder à cette application via le proxy Service Connect en utilisant l'adresse IP de la tâche et le numéro de port figurant dans la définition de la tâche. Pour votre tls configuration, ajoutez le certificat correspondant arn à votre rôleawsPcaAuthorityArn, à votre kmsKey et roleArn à votre IAM rôle.

      Ce service utilise un logConfiguration pour envoyer la sortie du proxy Service Connect depuis stdout et stderr vers Amazon CloudWatch Logs. Ce rôle d'exécution de tâches ne dispose pas des autorisations supplémentaires requises pour créer le groupe de CloudWatch journaux Logs. Créez le groupe de CloudWatch journaux dans Logs à l'aide du AWS Management Console ou AWS CLI. Nous vous recommandons de créer ce groupe de journaux et de stocker les journaux du proxy dans CloudWatch Logs. Si vous ne souhaitez pas envoyer les journaux du proxy à CloudWatch Logs, vous pouvez supprimer lelogConfiguration.

      { "cluster": "tutorial", "deploymentConfiguration": { "maximumPercent": 200, "minimumHealthyPercent": 0 }, "deploymentController": { "type": "ECS" }, "desiredCount": 1, "enableECSManagedTags": true, "enableExecuteCommand": true, "launchType": "FARGATE", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-EXAMPLE" ], "subnets": [ "subnet-EXAMPLE", "subnet-EXAMPLE", "subnet-EXAMPLE" ] } }, "platformVersion": "LATEST", "propagateTags": "SERVICE", "serviceName": "service-connect-nginx-service", "serviceConnectConfiguration": { "enabled": true, "services": [ { "portName": "nginx", "clientAliases": [ { "port": 80 } ], "tls": { "issuerCertificateAuthority": { "awsPcaAuthorityArn": "certificateArn" }, "kmsKey": "kmsKey", "roleArn": "iamRoleArn" } } ], "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/service-connect-proxy", "awslogs-region": "region", "awslogs-stream-prefix": "service-connect-proxy" } } }, "taskDefinition": "service-connect-nginx" }
    2. Créez un service à l'aide du service-connect-nginx-service.json fichier :

      aws ecs create-service --cluster tutorial --cli-input-json file://service-connect-nginx-service.json

      Sortie :

      {
          "service": {
              "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/tutorial/service-connect-nginx-service",
              "serviceName": "service-connect-nginx-service",
              "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
              "loadBalancers": [],
              "serviceRegistries": [],
              "status": "ACTIVE",
              "desiredCount": 1,
              "runningCount": 0,
              "pendingCount": 0,
              "launchType": "FARGATE",
              "platformVersion": "LATEST",
              "platformFamily": "Linux",
              "taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1",
              "deploymentConfiguration": {
                  "deploymentCircuitBreaker": {
                      "enable": false,
                      "rollback": false
                  },
                  "maximumPercent": 200,
                  "minimumHealthyPercent": 0
              },
              "deployments": [
                  {
                      "id": "ecs-svc/3763308422771520962",
                      "status": "PRIMARY",
                      "taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1",
                      "desiredCount": 1,
                      "pendingCount": 0,
                      "runningCount": 0,
                      "failedTasks": 0,
                      "createdAt": 1661210032.602,
                      "updatedAt": 1661210032.602,
                      "launchType": "FARGATE",
                      "platformVersion": "1.4.0",
                      "platformFamily": "Linux",
                      "networkConfiguration": {
                          "awsvpcConfiguration": {
                              "assignPublicIp": "ENABLED",
                              "securityGroups": [
                                  "sg-EXAMPLE"
                              ],
                              "subnets": [
                                  "subnet-EXAMPLEf",
                                  "subnet-EXAMPLE",
                                  "subnet-EXAMPLE"
                              ]
                          }
                      },
                      "rolloutState": "IN_PROGRESS",
                      "rolloutStateReason": "ECS deployment ecs-svc/3763308422771520962 in progress.",
                      "failedLaunchTaskCount": 0,
                      "replacedTaskCount": 0,
                      "serviceConnectConfiguration": {
                          "enabled": true,
                          "namespace": "service-connect",
                          "services": [
                              {
                                  "portName": "nginx",
                                  "clientAliases": [
                                      {
                                          "port": 80
                                      }
                                  ]
                              }
                          ],
                          "logConfiguration": {
                              "logDriver": "awslogs",
                              "options": {
                                  "awslogs-group": "/ecs/service-connect-proxy",
                                  "awslogs-region": "us-west-2",
                                  "awslogs-stream-prefix": "service-connect-proxy"
                              },
                              "secretOptions": []
                          }
                      },
                      "serviceConnectResources": [
                          {
                              "discoveryName": "nginx",
                              "discoveryArn": "arn:aws:servicediscovery:us-west-2:123456789012:service/srv-EXAMPLE"
                          }
                      ]
                  }
              ],
              "roleArn": "arn:aws:iam::123456789012:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
              "version": 0,
              "events": [],
              "createdAt": 1661210032.602,
              "placementConstraints": [],
              "placementStrategy": [],
              "networkConfiguration": {
                  "awsvpcConfiguration": {
                      "assignPublicIp": "ENABLED",
                      "securityGroups": [
                          "sg-EXAMPLE"
                      ],
                      "subnets": [
                          "subnet-EXAMPLE",
                          "subnet-EXAMPLE",
                          "subnet-EXAMPLE"
                      ]
                  }
              },
              "schedulingStrategy": "REPLICA",
              "enableECSManagedTags": true,
              "propagateTags": "SERVICE",
              "enableExecuteCommand": true
          }
      }
                              

      La serviceConnectConfiguration que vous avez fournie apparaît dans le premier déploiement de la sortie. Lorsque vous apportez des modifications au ECS service de manière à modifier des tâches, un nouveau déploiement est créé par AmazonECS.

Étape 3 : Vérifier que vous pouvez vous connecter

Pour vérifier que Service Connect est configuré et fonctionne, procédez comme suit pour vous connecter au service Web à partir d'une application externe. Consultez ensuite les métriques supplémentaires dans CloudWatch le proxy Service Connect.

Pour vous connecter au service Web à partir d'une application externe
  • Connectez-vous à l'adresse IP de la tâche et au port du conteneur à l'aide de l'adresse IP de la tâche

    Utilisez le AWS CLI pour obtenir l'ID de la tâche, en utilisant leaws ecs list-tasks --cluster tutorial.

    Si vos sous-réseaux et votre groupe de sécurité autorisent le trafic depuis l'Internet public sur le port défini par la tâche, vous pouvez vous connecter à l'adresse IP publique depuis votre ordinateur. L'adresse IP publique n'est toutefois pas accessible depuis « describe-tasks ». Les étapes consistent donc à accéder à la ou à la EC2 AWS Management Console ou à l'Amazon pour AWS CLI obtenir les détails de l'interface de réseau Elastic.

    Dans cet exemple, une EC2 instance Amazon de la même VPC utilise l'adresse IP privée de la tâche. L'application est nginx, mais l'en-tête server: envoy indique que le proxy Service Connect est utilisé. Le proxy Service Connect écoute sur le port du conteneur depuis la définition de la tâche.

    $ curl -v 10.0.19.50:80/
    *   Trying 10.0.19.50:80...
    * Connected to 10.0.19.50 (10.0.19.50) port 80 (#0)
    > GET / HTTP/1.1
    > Host: 10.0.19.50
    > User-Agent: curl/7.79.1
    > Accept: */*
    >
    * Mark bundle as not supporting multiuse
    < HTTP/1.1 200 OK
    < server: envoy
    < date: Tue, 23 Aug 2022 03:53:06 GMT
    < content-type: text/html
    < content-length: 612
    < last-modified: Tue, 16 Apr 2019 13:08:19 GMT
    < etag: "5cb5d3c3-264"
    < accept-ranges: bytes
    < x-envoy-upstream-service-time: 0
    <
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html> 
                    
Pour consulter les métriques de Service Connect

Le proxy Service Connect crée des métriques d'application (HTTPHTTP2,RPC, g ou TCP connexion) dans CloudWatch des métriques. Lorsque vous utilisez la CloudWatch console, consultez les dimensions métriques supplémentaires de DiscoveryName, (DiscoveryName, ServiceName, ClusterName), et (TargetDiscoveryName, TargetDiscoveryName ServiceName, ClusterName) dans l'espace de ECS noms Amazon. Pour plus d'd'plus d'sur ces métriques, veuillez consulter la section Afficher les métriques disponibles dans le Guide de l'utilisateur Amazon CloudWatch Logs.