Amazon Elastic Container Service
開発者ガイド (API バージョン 2014-11-13)

チュートリアル: サービス検出 を使用したサービスの作成

サービス検出 は、Amazon ECS コンソールのサービス作成ウィザードに統合されています。詳細については、「サービスの作成」を参照してください。

次のチュートリアルでは、AWS CLI で サービス検出 を使用する Fargate タスクを含む ECS サービスを作成する方法を説明します。

注記

Fargate タスクは、次のリージョンのみでサポートされています。

リージョン名 リージョン
米国東部(バージニア北部) us-east-1
米国東部 (オハイオ) us-east-2
米国西部 (北カリフォルニア) us-west-1
米国西部 (オレゴン) us-west-2
アジアパシフィック (ムンバイ) ap-south-1
欧州 (アイルランド) eu-west-1
欧州 (ロンドン) eu-west-2
欧州 (フランクフルト) eu-central-1
アジアパシフィック (東京) ap-northeast-1
カナダ (中部) ca-central-1
アジアパシフィック (ソウル) ap-northeast-2
アジアパシフィック (シンガポール) ap-southeast-1
アジアパシフィック (シドニー) ap-southeast-2

前提条件

このチュートリアルでは、以下の前提条件が完了済みであることを前提としています。

ステップ 1: サービス検出 リソースを作成する

サービス検出 名前空間および サービス検出 サービスを作成するには、次の手順に従います。

サービス検出 リソースを作成するには

  1. 既存のいずれかの VPC 内に tutorial という名前の サービス検出 プライベート名前空間を作成します。

    aws servicediscovery create-private-dns-namespace --name tutorial --vpc vpc-abcd1234 --region us-east-1

    出力:

    {
        "OperationId": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e"
    }
  2. 以前の出力の OperationId を使用して、プライベート名前空間が正常に作成されたことを確認します。名前空間 ID をコピーします。これは後述のコマンドで使用されます。

    aws servicediscovery get-operation --operation-id h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e

    出力:

    {
        "Operation": {
            "Id": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e",
            "Type": "CREATE_NAMESPACE",
            "Status": "SUCCESS",
            "CreateDate": 1519777852.502,
            "UpdateDate": 1519777856.086,
            "Targets": {
                "NAMESPACE": "ns-uejictsjen2i4eeg"
            }
        }
    }
  3. 前の出力で取得した NAMESPACE ID を使用して、myapplication という名前のサービス検出サービスを作成します。サービス検出 サービス ID をコピーします。これは後述のコマンドで使用されます。

    aws servicediscovery create-service --name myapplication --dns-config 'NamespaceId="ns-uejictsjen2i4eeg",DnsRecords=[{Type="A",TTL="300"}]' --health-check-custom-config FailureThreshold=1 --region us-east-1

    出力:

    {
        "Service": {
            "Id": "srv-utcrh6wavdkggqtk",
            "Arn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk",
            "Name": "myapplication",
            "DnsConfig": {
                "NamespaceId": "ns-uejictsjen2i4eeg",
                "DnsRecords": [
                    {
                        "Type": "A",
                        "TTL": 300
                    }
                ]
            },
            "HealthCheckCustomConfig": {
                "FailureThreshold": 1
            },
            "CreatorRequestId": "e49a8797-b735-481b-a657-b74d1d6734eb"
        }
    }

ステップ 2: Amazon ECS リソースを作成する

Amazon ECS クラスター、タスク定義、サービスを作成するには、次の手順に従います。

Amazon ECS リソースを作成するには

  1. tutorial という名前の Amazon ECS クラスターを作成して使用します。

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

    出力:

    {
        "cluster": {
            "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/tutorial",
            "clusterName": "tutorial",
            "status": "ACTIVE",
            "registeredContainerInstancesCount": 0,
            "runningTasksCount": 0,
            "pendingTasksCount": 0,
            "activeServicesCount": 0,
            "statistics": []
        }
    }
  2. Fargate と互換性のあるタスク定義を登録します。これには、awsvpc ネットワークモードを使用する必要があります。このチュートリアルで使用するタスク定義の例を以下に示します。

    最初に、次のタスク定義の内容で、fargate-task.json というファイルを作成します。

    { "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: #333;} </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" }

    次に、作成した fargate-task.json ファイルを使用して、タスク定義を登録します。

    aws ecs register-task-definition --cli-input-json file://fargate-task.json --region us-east-1
  3. 作成する ECS サービスの内容で、ecs-service-discovery.json という名前のファイルを作成します。この例では、前のステップで作成したタスク定義を使用します。このタスク定義の例では awsvpc ネットワークモードを使用しているため、awsvpcConfiguration が必要となります。

    { "cluster": "tutorial", "serviceName": "ecs-service-discovery", "taskDefinition": "tutorial-task-def", "serviceRegistries": [ { "registryArn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk" } ], "launchType": "FARGATE", "platformVersion": "LATEST", "networkConfiguration": { "awsvpcConfiguration": { "assignPublicIp": "ENABLED", "securityGroups": [ "sg-abcd1234" ], "subnets": [ "subnet-abcd1234" ] } }, "desiredCount": 1 }

    Fargate 起動タイプおよび LATEST プラットフォームバージョンを指定して、サービス検出 をサポートする ECS サービスを作成します。

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

    出力:

    {
        "service": {
            "serviceArn": "arn:aws:ecs:region:aws_account_id:service/ecs-service-discovery",
            "serviceName": "ecs-service-discovery",
            "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/tutorial",
            "loadBalancers": [],
            "serviceRegistries": [
                {
                    "registryArn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk"
                }
            ],
            "status": "ACTIVE",
            "desiredCount": 1,
            "runningCount": 0,
            "pendingCount": 0,
            "launchType": "FARGATE",
            "platformVersion": "LATEST",
            "taskDefinition": "arn:aws:ecs:region:aws_account_id:task-definition/tutorial-task-def:1",
            "deploymentConfiguration": {
                "maximumPercent": 200,
                "minimumHealthyPercent": 100
            },
            "deployments": [
                {
                    "id": "ecs-svc/9223370516993140842",
                    "status": "PRIMARY",
                    "taskDefinition": "arn:aws:ecs:region:aws_account_id:task-definition/tutorial-task-def:1",
                    "desiredCount": 1,
                    "pendingCount": 0,
                    "runningCount": 0,
                    "createdAt": 1519861634.965,
                    "updatedAt": 1519861634.965,
                    "launchType": "FARGATE",
                    "platformVersion": "1.1.0",
                    "networkConfiguration": {
                        "awsvpcConfiguration": {
                            "subnets": [
                                "subnet-abcd1234"
                            ],
                            "securityGroups": [
                                "sg-abcd1234"
                            ],
                            "assignPublicIp": "ENABLED"
                        }
                    }
                }
            ],
            "roleArn": "arn:aws:iam::aws_account_id:role/ECSServiceLinkedRole",
            "events": [],
            "createdAt": 1519861634.965,
            "placementConstraints": [],
            "placementStrategy": [],
            "networkConfiguration": {
                "awsvpcConfiguration": {
                    "subnets": [
                        "subnet-abcd1234"
                    ],
                    "securityGroups": [
                        "sg-abcd1234"
                    ],
                    "assignPublicIp": "ENABLED"
                }
            }
        }
    }

ステップ 3: サービス検出 を確認する

サービス検出 情報をクエリして、すべてが正常に作成されたことを確認します。サービス検出 を設定したら、AWS Cloud Map API オペレーションまたは次に示すように VPC 内で dig を使用して、それにクエリを実行できます。

サービスの検出設定を確認するには

  1. サービス検出 サービス ID を使用して、サービス検出 インスタンスを一覧表示します。

    aws servicediscovery list-instances --service-id srv-utcrh6wavdkggqtk --region us-east-1

    出力:

    {
        "Instances": [
            {
                "Id": "16becc26-8558-4af1-9fbd-f81be062a266",
                "Attributes": {
                    "AWS_INSTANCE_IPV4": "172.31.87.2"
                    "AWS_INSTANCE_PORT": "80", 
                    "AVAILABILITY_ZONE": "us-east-1a", 
                    "REGION": "us-east-1", 
                    "ECS_SERVICE_NAME": "ecs-service-discovery", 
                    "ECS_CLUSTER_NAME": "tutorial", 
                    "ECS_TASK_DEFINITION_FAMILY": "tutorial-task-def"
                }
            }
        ]
    }
  2. サービス検出 名前空間およびサービスを使用して、サービス検出 インスタンスに関する詳細のクエリを実行する追加のパラメータを使用します。

    aws servicediscovery discover-instances --namespace-name tutorial --service-name myapplication --query-parameters ECS_CLUSTER_NAME=tutorial --region us-east-1

    出力:

    {
        "Instances": [
            {
                "InstanceId": "16becc26-8558-4af1-9fbd-f81be062a266", 
                "NamespaceName": "tutorial", 
                "ServiceName": "ecs-service-discovery", 
                "HealthStatus": "HEALTHY", 
                "Attributes": {
                    "AWS_INSTANCE_IPV4": "172.31.87.2"
                    "AWS_INSTANCE_PORT": "80", 
                    "AVAILABILITY_ZONE": "us-east-1a", 
                    "REGION": "us-east-1", 
                    "ECS_SERVICE_NAME": "ecs-service-discovery", 
                    "ECS_CLUSTER_NAME": "tutorial", 
                    "ECS_TASK_DEFINITION_FAMILY": "tutorial-task-def"
                }
            }
        ]
    }
  3. Route 53 ホストゾーンに作成された サービス検出 サービス用の DNS レコードは、次の AWS CLI コマンドでクエリを実行できます。

    名前空間 ID を使用して、名前空間に関する情報を取得します。これには Route 53 ホストゾーン ID が含まれます。

    aws servicediscovery get-namespace --id ns-uejictsjen2i4eeg --region us-east-1

    出力:

    {
        "Namespace": {
            "Id": "ns-uejictsjen2i4eeg",
            "Arn": "arn:aws:servicediscovery:region:aws_account_id:namespace/ns-uejictsjen2i4eeg",
            "Name": "tutorial",
            "Type": "DNS_PRIVATE",
            "Properties": {
                "DnsProperties": {
                    "HostedZoneId": "Z35JQ4ZFDRYPLV"
                }
            },
            "CreateDate": 1519777852.502,
            "CreatorRequestId": "9049a1d5-25e4-4115-8625-96dbda9a6093"
        }
    }
  4. Route 53 ホストゾーン ID を使用して、ホストゾーンのリソースレコードセットを取得します。

    aws route53 list-resource-record-sets --hosted-zone-id Z35JQ4ZFDRYPLV --region us-east-1

    出力:

    {
        "ResourceRecordSets": [
            {
                "Name": "tutorial.",
                "Type": "NS",
                "TTL": 172800,
                "ResourceRecords": [
                    {
                        "Value": "ns-1536.awsdns-00.co.uk."
                    },
                    {
                        "Value": "ns-0.awsdns-00.com."
                    },
                    {
                        "Value": "ns-1024.awsdns-00.org."
                    },
                    {
                        "Value": "ns-512.awsdns-00.net."
                    }
                ]
            },
            {
                "Name": "tutorial.",
                "Type": "SOA",
                "TTL": 900,
                "ResourceRecords": [
                    {
                        "Value": "ns-1536.awsdns-00.co.uk. awsdns-hostmaster.amazon.com. 1 7200 900 1209600 86400"
                    }
                ]
            },
            {
                "Name": "myapplication.tutorial.",
                "Type": "A",
                "SetIdentifier": "16becc26-8558-4af1-9fbd-f81be062a266",
                "MultiValueAnswer": true,
                "TTL": 300,
                "ResourceRecords": [
                    {
                        "Value": "172.31.87.2"
                    }
                ]
            }
        ]
    }
  5. DNS でクエリを実行するには、次のコマンドで VPC 内でインスタンスから dig を使用することもできます。

    dig +short myapplication.tutorial

    出力:

    172.31.87.2

ステップ 4: クリーンアップ

このチュートリアルが終了したら、未使用のリソースに対する料金が発生しないように、それに関連付けられたリソースをクリーンアップする必要があります。

サービス検出インスタンスと Amazon ECS リソースをクリーンアップするには

  1. サービス検出 サービスインスタンスの登録を解除します。

    aws servicediscovery deregister-instance --service-id srv-utcrh6wavdkggqtk --instance-id 16becc26-8558-4af1-9fbd-f81be062a266 --region us-east-1

    出力:

    {
        "OperationId": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv"
    }
  2. 以前の出力の OperationId を使用して、サービス検出 サービスインスタンスが正常に登録解除されたことを確認します。

    aws servicediscovery get-operation --operation-id xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv --region us-east-1

    出力:

    {
        "Operation": {
            "Id": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv",
            "Type": "DEREGISTER_INSTANCE",
            "Status": "SUCCESS",
            "CreateDate": 1525984073.707,
            "UpdateDate": 1525984076.426,
            "Targets": {
                "INSTANCE": "16becc26-8558-4af1-9fbd-f81be062a266",
                "ROUTE_53_CHANGE_ID": "C5NSRG1J4I1FH",
                "SERVICE": "srv-utcrh6wavdkggqtk"
            }
        }
    }
  3. サービス検出 サービスを削除します。

    aws servicediscovery delete-service --id srv-utcrh6wavdkggqtk --region us-east-1
  4. サービス検出 名前空間を削除します。

    aws servicediscovery delete-namespace --id ns-uejictsjen2i4eeg --region us-east-1

    出力:

    {
        "OperationId": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj"
    }
  5. 以前の出力の OperationId を使用して、サービス検出 名前空間が正常に削除されたことを確認します。

    aws servicediscovery get-operation --operation-id c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj --region us-east-1

    出力:

    {
        "Operation": {
            "Id": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj",
            "Type": "DELETE_NAMESPACE",
            "Status": "SUCCESS",
            "CreateDate": 1525984602.211,
            "UpdateDate": 1525984602.558,
            "Targets": {
                "NAMESPACE": "ns-rymlehshst7hhukh",
                "ROUTE_53_CHANGE_ID": "CJP2A2M86XW3O"
            }
        }
    }
  6. Amazon ECS サービスを更新して必要数を 0 にします。これによりサービスを削除できるようになります。

    aws ecs update-service --cluster tutorial --service ecs-service-discovery --desired-count 0 --force-new-deployment --region us-east-1
  7. Amazon ECS サービスを削除します。

    aws ecs delete-service --cluster tutorial --service ecs-service-discovery --region us-east-1
  8. Amazon ECS クラスターを削除します。

    aws ecs delete-cluster --cluster tutorial --region us-east-1