AWS Cloud Map を使用して、ECS サービスのクロスアカウントサービス検出を設定する方法を教えてください。

所要時間3分
0

AWS Cloud Map を使用して、Amazon Elastic Container Service (Amazon ECS) サービスのクロスアカウントサービス検出を設定したい。

簡単な説明

AWS Cloud Map でプライベート名前空間を作成すると、Amazon Route 53 ホストゾーンも作成されます。Route 53 ホストゾーンは Amazon Virtual Private Cloud (Amazon VPC) に関連付けられているため、DNS レコードは検出可能です。そのため、他の AWS アカウントや Amazon VPC は DNS 経由で Amazon ECS サービスを検出することはできません。

前提条件:

  • 2 つの Amazon VPC が、必要なサブネット、セキュリティグループ、重複しない CIDR を持つ同じまたは異なるアカウントにある。
  • 両方の Amazon VPC が AmazonProvidedDNS を使用し、enableDnsHostnames 属性と enableDnsSupport 属性がオンになっている。
  • Amazon ECS クラスターが 1 つである。
  • 最新バージョンの AWS コマンドラインインターフェイス (AWS CLI) がインストールされ、適切な権限で設定されている。

注: AWS CLI の実行中にエラーが発生した場合は、最新バージョンの AWS CLI を実行していることを確認してください

解決方法

重要: 以下のステップでは、ターゲット Amazon VPC、ソース Amazon VPC、および Amazon ECS クラスターの例を使用しています。AWS CLI で、サンプルの値を適した値に置き換えます。

  • Amazon ECS クラスターのサンプルクラスターは AWS アカウント 1 にあります。
  • サンプルのターゲット Amazon VPC である example-target-vpc は Amazon ECS タスクをホストし、AWS アカウント 1 にあります。
  • サンプルのソース Amazon VPC である example-source-vpc は DNS クエリを実行し、AWS アカウント 2 にあります。

名前空間と AWS Cloud Map サービスを作成する

  1. アカウント 1 の認証情報を使用して AWS CLI を設定します。

  2. アカウント 1 にプライベート AWS Cloud Map サービス検出の名前空間を作成します。

$ aws servicediscovery create-private-dns-namespace --name example-namespace  --vpc example-target-vpc

**注:**前述のコマンドは example-namespace という名前の名前空間を作成し、JSON の出力として OperationID を返します。

3.    OperationID を使用して、名前空間と名前空間 ID のステータスを確認します。

$ aws servicediscovery get-operation --operation-id <example-OperationId> --query 'Operation.{Status: Status, NamespaceID: Targets.NAMESPACE}'

4.    名前空間に関連付けられているホストゾーン ID を見つけます。

$ aws servicediscovery get-namespace --id <example-NamespaceID> --query 'Namespace.Properties.DnsProperties.{HoztedZoneId: HostedZoneId}'
  1. 名前空間 ID を使用して AWS Cloud Map サービスを作成します。
$ aws servicediscovery create-service \
    --name myservice \
    --namespace-id  <example-NamespaceID> \
    --dns-config "NamespaceId=<example-NamespaceID>,RoutingPolicy=MULTIVALUE,DnsRecords=[{Type=A,TTL=60}]"

注: 上記のコマンドは、example-myservice という名前の AWS Cloud Map サービスを作成し、出力としてサービス ARN を返します。

awsvpc ネットワークモードを使用するタスク定義を登録する

AWS Fargate と互換性があり、awsvpc ネットワークモードを使用するタスク定義を登録します。

1.    次の内容のタスク定義を含む、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"
}

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

$ aws ecs register-task-definition --cli-input-json file://fargate-task.json

Amazon ECS サービスを作成する

  1. ecs-service-discovery.json という名前のファイルを作成し、作成中の Amazon ECS サービスの内容を含めます。
  • launchTypeFARGATE を指定します。
  • platformVersion に最新バージョンを指定します。
  • securityGroupsサブネットパラメータが example-target-vpc に属していることを確認します。セキュリティグループとサブネット ID は Amazon VPC コンソールから取得できます。

注: タスク定義では awsvpc ネットワークモードを使用するため、awsvpcConfiguration が必要です。

JSON ファイルの例:

{
    "cluster": "example-cluster",
    "serviceName": "ecs-service-discovery",
    "taskDefinition": "tutorial-task-def",
    "serviceRegistries": [
       {
          "registryArn": "<Cloudmap service ARN>"
       }
    ],
    "launchType": "FARGATE",
    "platformVersion": "example-latest-version",
    "networkConfiguration": {
       "awsvpcConfiguration": {
          "assignPublicIp": "ENABLED",
          "securityGroups": [ "example-target-vpc-sg" ],
          "subnets": [ "example-target-vpc-subnet" ]
       }
    },
    "desiredCount": 1
}

2.    ecs-service-discovery.json ファイルを使用して Amazon ECS サービスを作成します。

$ aws ecs create-service --cli-input-json file://ecs-service-discovery.json

3.    サービスタスクが AWS Cloud Map サービスのインスタンスとして登録されているかどうかを確認します。

$ aws servicediscovery list-instances --service-id <example-cloud-map-service-id>

注: これで、Amazon ECS サービスが example-target-vpc 内で検出できるようになりました。

ソースの Amazon VPC を Route 53 ホストゾーンに関連付ける

1.    Amazon VPC が異なるアカウントにある場合は、アカウント 2 に Amazon VPC 関連付け承認リクエストを送信します。

$ aws route53 create-vpc-association-authorization --hosted-zone-id <example-HoztedZoneId>  --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

2.    アカウント 2 の認証情報を使用して awscli を設定し、アカウント 2 の example-source-vpc をアカウント 1 のホストゾーンに関連付けます。

$ aws route53 associate-vpc-with-hosted-zone --hosted-zone-id <example-HoztedZoneId> --vpc VPCRegion=<example_VPC_region>,VPCId=<example-source-vpc>

3.    example-source-vpc がホストゾーンに追加されているかを確認します。

aws route53 get-hosted-zone --id <example-HoztedZoneId> --query 'VPCs'

4.    Amazon ECS サービスが example-source-vpc の DNS を介して検出可能であることを確認します。example-source-vpc を使用して、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスから DNS をクエリします。

$ dig +short example-service.example-namespace

注: 前述の** example-service.example-namespace** コマンドは DNS 名です。これを、お使いの AWS Cloud Map サービスと名前空間に置き換えてください。

Amazon VPC ピアリングをセットアップする

1.    Amazon VPC ピアリングを使用して、example-target-vpcexample-source-vpc に接続します。

2.    ルートテーブルを更新します

3.    セキュリティグループを更新します

注: ルートテーブルとセキュリティグループを使用して Amazon VPC ピアリングを設定すると、example-source-vpc 内のリソースは example-target-vpc の Amazon ECS タスクに接続できます。

Amazon VPC ピアリングのセットアップで問題が発生した場合は、以下の AWS ナレッジセンターの記事を参照してください。

AWS公式
AWS公式更新しました 1年前