AWS Cloud Mapを試してみる

##はじめに
2018/11/28にAWS Cloud Mapが発表になりましたので試してみます。
>
AWS Cloud Mapを利用するとクラウドをマッピングすることができます。Amazon S3のバケットやAmazon DynamoDBのテーブル、Amazon SQSのキュー
Amazon EC2やAmazon ECS、Amazon EKSやAWS Lambda上で構成されたカスタムクラウドサービスの様な任意のリソースに対しても分かりやすい名前を定義できます。AWS SDKと認証されたAPIクエリを使って分かりやすい名前にてリソースの場所やメタデータを検出することができます。
デプロイメントステージやバージョンの様なカスタム属性によって、リソースをさらにフィルターし、検出することができます


https://aws.amazon.com/jp/blogs/architecture/new-application-integration-with-aws-cloud-map-for-service-discovery/

https://aws.amazon.com/jp/blogs/news/new-application-integration-with-aws-cloud-map-for-service-discovery/

AWS Cloud Mapを使用するメリットですが、大きく分けて２つあります。
１つ目は、システム全体で１つのネームスペースを使用することが可能になる点です。今までは、本番や開発といった環境ごとにdev-frontend.exmaple.comやprd-frontend.exmaple.comというように接続先の名称を環境ごとに定義していましたが、Cloud Mapでは属性値に環境情報やバージョン情報を付与することで、一意の名称で接続先をコントロールすることができます。

Cloud Map以前
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/5558b82d-e24a-0308-8aad-74362e2a976c.png)

Cloud Map以後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/4761d003-0a8b-2ab6-5c11-ac6372de447e.png)

２つ目は、今までのAWSのサービスディスカバリとしては、ECSにおいてALBを使用したサーバサイドサービスディスカバリや、Route53を利用したサービスディスカバリが可能でしたが、コンテナに対するサービスディスカバリのみに対応している状況でした。Cloud Mapを使用することにより、EC2やS3,SQSといったAWSサービスのサービスディスカバリができるようになります。

Cloud Map以前
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/874338d8-1d67-6783-4a32-99e737eaaeca.png)

Cloud Map以後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/a69edcbf-9a77-d754-4987-ef83e3df49d4.png)

実際のインスタンスディスカバリの方法は、３種類あります
API call
API call and DNS query in VCP
API call and Public DNS query

##１つ目の環境属性を設定するユースケースを試してみます
###Namespaceの作成
Create namespaceをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/53edbeed-e686-9270-90bb-42a9e7450038.png)

今回は、API Callsで作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/4dcee0e2-f36b-b9f2-dc47-4194da995314.png)

###サービスの作成
Create serviceをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6995e491-20a7-de3b-85cf-91f3d9360b8d.png)

frontendサービスを作成します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/1483bf05-2a34-4346-4229-7052cbb98ca6.png)

インスタンスを登録します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f0640eb8-e65b-9f7f-e908-4ab88d767c90.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/5c1778ee-1cd2-ad7e-cd53-5125b7929bd6.png)

本番用
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/b613e223-8628-c1a0-609a-72f24747af19.png)

開発用
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/ee0c28b7-182a-4718-9404-64e8694ab2a1.png)

###サービスディスカバリ実施
フィルタリングなしでサービスディスカバリすると２つのインスタンスが返ってきます

```json
aws servicediscovery discover-instances --namespace-name exmaple.com --service-name frontend
{
    "Instances": [
        {
            "InstanceId": "ec2",
            "HealthStatus": "UNKNOWN",
            "ServiceName": "frontend",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "192.0.2.44",
                "Env": "Dev"
            },
            "NamespaceName": "exmaple.com"
        },
        {
            "InstanceId": "ec2-2",
            "HealthStatus": "UNKNOWN",
            "ServiceName": "frontend",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "192.0.2.4",
                "Env": "Prd"
            },
            "NamespaceName": "exmaple.com"
        }
    ]
}
```

query-parametersでEnv＝Prdとすることで本番用のインスタンスがディスカバリ可能です

```json
aws servicediscovery discover-instances --namespace-name exmaple.com --service-name frontend --query-parameters Env=Prd
{
    "Instances": [
        {
            "HealthStatus": "UNKNOWN",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "192.0.2.4",
                "Env": "Prd"
            },
            "InstanceId": "ec2-2",
            "NamespaceName": "exmaple.com",
            "ServiceName": "frontend"
        }
    ]
}
```

query-parametersでEnv＝Devとすることで本番用のインスタンスがディスカバリ可能です

```json
$ aws servicediscovery discover-instances --namespace-name exmaple.com --service-name frontend --query-parameters Env=Dev
{
    "Instances": [
        {
            "HealthStatus": "UNKNOWN",
            "NamespaceName": "exmaple.com",
            "InstanceId": "ec2",
            "ServiceName": "frontend",
            "Attributes": {
                "AWS_INSTANCE_IPV4": "192.0.2.44",
                "Env": "Dev"
            }
        }
    ]
}
```

###２つ目のユースケースであるS3に対するサービスディスカバリ
logsサービスを作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/47cc6c37-93b9-9820-e4f1-b6bcdc43f824.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/917952be-f115-6286-326e-3912e958dd4d.png)


S3サービスのサービスディスカバリを実施します

```json
aws servicediscovery discover-instances --namespace-name exmaple.com --service-name logs
{
    "Instances": [
        {
            "NamespaceName": "exmaple.com",
            "ServiceName": "logs",
            "Attributes": {
                "ARN": "arn:aws:s3:us-east-1:********:archive"
            },
            "InstanceId": "archive",
            "HealthStatus": "UNKNOWN"
        }
    ]
}
```

ARNが取得できました。EC2と同様に環境を示す属性や、ReadOnlyなどの書き込み属性などについても設定することができます

##お約束
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。