チュートリアル:サービスディスカバリを使用して、サービスの作成
サービスディスカバリは、Amazon ECS コンソールのサービス作成ウィザードに統合されています。詳細については、「Amazon ECS サービスを作成する」を参照してください。
次のチュートリアルでは、AWS CLI でサービスディスカバリを使用する Fargate タスクを含む ECS サービスを作成する方法を説明します。
サービスディスカバリをサポートするリージョンのリストは、サービス検出を参照してください。
Fargate をサポートするリージョンの情報については、「AWS Fargate で使用する Amazon ECS でサポートされているリージョン」 を参照してください。
前提条件
このチュートリアルでは、以下の前提条件が完了済みであることを前提としています。
-
AWS CLI の最新バージョンがインストールされ、設定されていること。詳細については、[AWS Command Line Interface のインストール]」を参照してください。
-
「Amazon ECS を使用するようにセットアップする」のステップを完了していること。
-
AWS ユーザーに Amazon ECS 初回実行ウィザードのアクセス許可 IAMポリシー例で指定されている必要なアクセス権限があること。
-
VPC およびセキュリティグループが使用できるように作成されていること。詳細については、「仮想プライベートクラウドを作成する」を参照してください。
ステップ 1: サービスディスカバリ リソースを作成する
サービスディスカバリ名前空間およびサービスディスカバリ サービスを作成するには、次のステップを使用します。
サービスディスカバリ リソースを作成するには
-
既存のいずれかの VPC 内に
tutorial
という名前の プライベート サービスディスカバリ名前空間を作成します。aws servicediscovery create-private-dns-namespace --name
tutorial
--vpcvpc-abcd1234
--regionus-east-1
出力:
{ "OperationId": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e" }
-
以前の出力の
OperationId
を使用して、プライベート名前空間が正常に作成されたことを確認します。名前空間 ID をコピーします。これは後述のコマンドで使用されます。aws servicediscovery get-operation --operation-id
h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e
--regionus-east-1
出力:
{ "Operation": { "Id": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e", "Type": "CREATE_NAMESPACE", "Status": "SUCCESS", "CreateDate": 1519777852.502, "UpdateDate": 1519777856.086, "Targets": { "NAMESPACE": "ns-uejictsjen2i4eeg" } } }
-
前の出力で取得した
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
--regionus-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 リソースを作成するには
-
tutorial
という名前のAmazon ECS クラスターを作成して使用します。aws ecs create-cluster --cluster-name
tutorial
--regionus-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": [] } } -
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
--regionus-east-1
-
作成する 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
--regionus-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
を使用して、それにクエリを実行できます。
サービスの検出設定を確認するには
-
サービスディスカバリサービス ID を使用して、サービスディスカバリ インスタンスを一覧表示します。
aws servicediscovery list-instances --service-id
srv-utcrh6wavdkggqtk
--regionus-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" } } ] }
-
サービスディスカバリ 名前空間およびサービスを使用して、サービスディスカバリ インスタンスに関する詳細のクエリを実行する追加のパラメータを使用します。
aws servicediscovery discover-instances --namespace-name
tutorial
--service-namemyapplication
--query-parameters ECS_CLUSTER_NAME=tutorial
--regionus-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" } } ] }
-
AWS CLIサービスの検出サービス用にRoute 53 ホストゾーンに作成されたDNS レコードは、次の コマンドでクエリを実行できます。
名前空間 ID を使用して、名前空間に関する情報を取得しますが、これには Route 53 ホストゾーン ID が含まれます。
aws servicediscovery get-namespace --id
ns-uejictsjen2i4eeg
--regionus-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" } } -
Route 53が ホストゾーン ID を使用して、ホストゾーンのリソースレコードセットを取得します。
aws route53 list-resource-record-sets --hosted-zone-id
Z35JQ4ZFDRYPLV
--regionus-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" } ] } ] }
-
DNS でクエリを実行するには、次のコマンドで VPC 内でインスタンスから
dig
を使用することもできます。dig +short
myapplication.tutorial
出力:
172.31.87.2
ステップ 4: クリーンアップする
このチュートリアルが終了したら、未使用のリソースに対する料金が発生しないように、それに関連付けられたリソースをクリーンアップする必要があります。
サービス検出インスタンスと Amazon ECS リソースをクリーンアップするには
-
サービスディスカバリ サービスインスタンスの登録を解除します:
aws servicediscovery deregister-instance --service-id
srv-utcrh6wavdkggqtk
--instance-id16becc26-8558-4af1-9fbd-f81be062a266
--regionus-east-1
出力:
{ "OperationId": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv" }
-
以前の出力の
OperationId
を使用して、サービスディスカバリ インスタンスが正常に登録解除されたことを確認します。aws servicediscovery get-operation --operation-id
xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv
--regionus-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" } } }
-
サービスディスカバリ サービスを削除します:
aws servicediscovery delete-service --id
srv-utcrh6wavdkggqtk
--regionus-east-1
-
サービスディスカバリ 名前空間を削除します:
aws servicediscovery delete-namespace --id
ns-uejictsjen2i4eeg
--regionus-east-1
出力:
{ "OperationId": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj" }
-
以前の出力の
OperationId
を使用して、サービスディスカバリ 名前空間が正常に削除されたことを確認します。aws servicediscovery get-operation --operation-id
c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj
--regionus-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" } } }
-
Amazon ECS サービスを更新して必要数を
0
にします。これによりサービスを削除できるようになります。aws ecs update-service --cluster
tutorial
--serviceecs-service-discovery
--desired-count 0 --force-new-deployment --regionus-east-1
-
Amazon ECS サービスを削除します:
aws ecs delete-service --cluster
tutorial
--serviceecs-service-discovery
--regionus-east-1
-
Amazon ECS クラスターを削除します:
aws ecs delete-cluster --cluster
tutorial
--regionus-east-1