

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# カスタム属性で AWS Cloud Map サービス検出を使用する方法について説明します。
<a name="tutorial-microservices"></a>

次のチュートリアルでは、 AWS Cloud Map API を使用して検出可能なカスタム属性で AWS Cloud Map サービス検出を使用する方法を示します。このチュートリアルでは、 を使用してクライアントアプリケーションを作成および実行する手順を説明します AWS CloudShell。アプリケーションは 2 つの Lambda 関数を使用してデータを DynamoDB テーブルに書き込み、テーブルから読み取ります。Lambda 関数と DynamoDB テーブルは、サービスインスタンス AWS Cloud Map として に登録されます。クライアントアプリケーションと Lambda 関数のコードは AWS Cloud Map 、カスタム属性を使用して、ジョブの実行に必要なリソースを検出します。

このチュートリアルの AWS CLIベースのバージョンについては、「」を参照してください[を使用してカスタム属性で AWS Cloud Map サービス検出を使用する方法について説明します。 AWS CLI](tutorial-microservices-cli.md)。

**重要**  
ワークショップ中に AWS リソースを作成し、アカウント AWS でコストが発生します。コストを最小限に抑えるために、ワークショップが終了したらすぐにリソースをクリーンアップすることをお勧めします。

## 前提条件
<a name="tutorial-customattributes-prerequisites"></a>

開始する前に、「[を使用するように をセットアップする AWS Cloud Map](setting-up-cloud-map.md)」のステップを完了します。

## ステップ 1: AWS Cloud Map 名前空間を作成する
<a name="tutorial-customattributes-step1"></a>

このステップでは、 AWS Cloud Map 名前空間を作成します。名前空間は、アプリケーションのサービスをグループ化するために使用されるコンストラクトです。名前空間を作成するときは、リソースの検出方法を指定します。このステップで作成した名前空間で作成されたリソースは、カスタム属性を使用した AWS Cloud Map API コールで検出できます。

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) で AWS Cloud Map コンソールを開きます。

1. [**名前空間の作成**] を選択します。

1. **名前空間名**には、 を指定します`cloudmap-tutorial`。

1. (オプション) **名前空間の説明**には、名前空間を使用する対象の説明を指定します。

1. **インスタンス検出では**、 **API コール**を選択します。

1. 残りのデフォルト値のままにして、**名前空間の作成**を選択します。

## ステップ 2: DynamoDB テーブルを作成する
<a name="tutorial-customattributes-step2"></a>

このステップでは、DynamoDB テーブルを作成します。テーブルは、次のステップで作成するサンプルアプリケーションのデータを保存および取得するために使用されます。

DynamoDB の作成方法については、「DynamoDB デベロッパーガイド[DynamoDB 」の「ステップ 1: DynamoDB でテーブルを作成する](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-1.html)」を参照してください。次の表を使用して、指定するオプションを決定します。 *DynamoDB * 


| オプション | 値 | 
| --- | --- | 
| テーブル名 | クラウドマップ | 
| パーティションキー | id | 

残りの設定のデフォルト値を保持し、テーブルを作成します。

## ステップ 3: AWS Cloud Map データサービスを作成し、DynamoDB テーブルをインスタンスとして登録する
<a name="tutorial-customattributes-step3"></a>

このステップでは、 AWS Cloud Map サービスを作成し、最後のステップで作成した DynamoDB テーブルをサービスインスタンスとして登録します。

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) で AWS Cloud Map コンソールを開きます。

1. 名前空間のリストから、`cloudmap-tutorial`名前空間を選択し、**詳細の表示**を選択します。

1. **「サービス**」セクションで**「サービスの作成**」を選択し、次の操作を行います。

   1. **[サービス名]** に `data-service` と入力します。

   1. 残りのデフォルト値のままにして、**サービスの作成**を選択します。

1. **サービス**セクションで、`data-service`サービスを選択し、**詳細の表示**を選択します。

1. **「サービスインスタンス**」セクションで、**「サービスインスタンスの登録**」を選択します。

1. **サービスインスタンスの登録**ページで、次の操作を行います。

   1. **インスタンスタイプ**で、**別のリソースの識別情報**を選択します。

   1. **サービスインスタンス ID **には、 を指定します`data-instance`。

   1. Custom **attributes** セクションで、key = `tablename`、**value** = の**キー**と値のペアを指定します`cloudmap`。

## ステップ 4: AWS Lambda 実行ロールを作成する
<a name="tutorial-customattributes-step4"></a>

このステップでは、次のステップで AWS Lambda 関数が使用する IAM ロールを作成します。ロールはこのチュートリアルでのみ使用され`cloudmap-tutorial-role`、後で削除できるため、IAM ロールに名前を付け、アクセス許可の境界を省略できます。

**Lambda のサービスロールを作成するには (IAM コンソール)**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) で IAM コンソールを開きます。

1. IAM コンソールのナビゲーションペインで、**[ロール]**、**[ロールを作成]** を選択します。

1. **信頼できるエンティティタイプ** で、**AWS のサービス** を選択します。

1. **サービスまたはユースケース**では、**Lambda** を選択し、**Lambda **ユースケースを選択します。

1. [**次へ**] を選択します。

1. `PowerUserAccess` ポリシーを検索し、ポリシーの横にあるボックスを選択し、**次へ**を選択します。

1. [**次へ**] を選択します。

1. **ロール名**には、 を指定します`cloudmap-tutorial-role`。

1. ロールを確認したら、**[ロールを作成]** を選択します。

## ステップ 5: データを書き込む Lambda 関数を作成する
<a name="tutorial-customattributes-step5"></a>

このステップでは、 AWS Cloud Map API を使用して作成した AWS Cloud Map サービスをクエリすることで、DynamoDB テーブルにデータを書き込む Lambda 関数を最初から作成します。

Lambda 関数の作成の詳細については、「 *AWS Lambda デベロッパーガイド*」の[「コンソールを使用して Lambda 関数を作成する](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)」を参照してください。次の表を使用して、指定または選択するオプションを決定します。


| オプション | 値 | 
| --- | --- | 
| 関数名 | 書き込み関数 | 
| 実行時間 | Python 3.12 | 
| アーキテクチャ | x86\_64 | 
| アクセス許可 | 既存のロールを使用する | 
| 既存のロール | cloudmap-tutorial-role | 

関数を作成したら、次の Python コードを反映するようにサンプルコードを更新し、関数をデプロイします。DynamoDB テーブル用に作成した AWS Cloud Map サービスインスタンスに関連付けられた`datatable`カスタム属性を指定することに注意してください。関数は 1～100 の乱数であるキーを生成し、呼び出されたときに関数に渡される値に関連付けます。

```
import json
import boto3
import random

def lambda_handler(event, context):
       
    serviceclient = boto3.client('servicediscovery')
    
    response = serviceclient.discover_instances(
        NamespaceName='cloudmap-tutorial',
        ServiceName='data-service')
       
    tablename = response["Instances"][0]["Attributes"]["tablename"]
       
    dynamodbclient = boto3.resource('dynamodb')
       
    table = dynamodbclient.Table(tablename)
       
    response = table.put_item(
        Item={ 'id': str(random.randint(1,100)), 'todo': event })
       
    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }
```

関数をデプロイした後、タイムアウトエラーを回避するには、関数のタイムアウトを 5 秒に更新します。詳細については、*AWS Lambda デベロッパーガイド*の「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。

## ステップ 6: AWS Cloud Map アプリケーションサービスを作成し、Lambda 書き込み関数をインスタンスとして登録する
<a name="tutorial-customattributes-step6"></a>

このステップでは、 AWS Cloud Map サービスを作成し、Lambda 書き込み関数をサービスインスタンスとして登録します。

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) で AWS Cloud Map コンソールを開きます。

1. 左側のナビゲーションで、**名前空間**を選択します。

1. 名前空間のリストから、`cloudmap-tutorial`名前空間を選択し、**詳細の表示**を選択します。

1. **「サービス**」セクションで**「サービスの作成**」を選択し、次の操作を行います。

   1. **[サービス名]** に `app-service` と入力します。

   1. 残りのデフォルト値のままにし、**サービスの作成**を選択します。

1. **サービス**セクションで、`app-service`サービスを選択し、**詳細の表示**を選択します。

1. **「サービスインスタンス**」セクションで、**「サービスインスタンスの登録**」を選択します。

1. **サービスインスタンスの登録**ページで、次の操作を行います。

   1. **インスタンスタイプ**で、**別のリソースの識別情報**を選択します。

   1. **サービスインスタンス ID **には、 を指定します`write-instance`。

   1. **カスタム属性**セクションで、次のキーと値のペアを指定します。
      + **key** = `action`、**value** = `write`
      + **key** = `functionname`、**value** = `writefunction`

## ステップ 7: データを読み取る Lambda 関数を作成する
<a name="tutorial-customattributes-step7"></a>

このステップでは、作成した DynamoDB テーブルにデータを書き込む Lambda 関数を最初から作成します。

Lambda 関数の作成の詳細については、「 *AWS Lambda デベロッパーガイド*」の[「コンソールを使用して Lambda 関数を作成する](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#getting-started-create-function)」を参照してください。次の表を使用して、指定または選択するオプションを決定します。


| オプション | 値 | 
| --- | --- | 
| 関数名 | 読み取り関数 | 
| 実行時間 | Python 3.12 | 
| アーキテクチャ | x86\_64 | 
| アクセス許可 | 既存のロールを使用する | 
| 既存のロール | cloudmap-tutorial-role | 

関数を作成したら、次の Python コードを反映するようにサンプルコードを更新し、関数をデプロイします。関数はテーブル amd をスキャンして、すべての項目を返します。

```
import json
import boto3

def lambda_handler(event, context):
    serviceclient = boto3.client('servicediscovery')

    response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='data-service')
       
    tablename = response["Instances"][0]["Attributes"]["tablename"]
       
    dynamodbclient = boto3.resource('dynamodb')
       
    table = dynamodbclient.Table(tablename)
       
    response = table.scan(Select='ALL_ATTRIBUTES')

    return {
        'statusCode': 200,
        'body': json.dumps(response)
    }
```

関数をデプロイした後、タイムアウトエラーを回避するには、関数のタイムアウトを 5 秒に更新します。詳細については、*AWS Lambda デベロッパーガイド*の「[Lambda 関数のタイムアウトを設定する](https://docs.aws.amazon.com/lambda/latest/dg/configuration-timeout.html)」を参照してください。

## ステップ 8: Lambda 読み取り関数を AWS Cloud Map サービスインスタンスとして登録する
<a name="tutorial-customattributes-step8"></a>

このステップでは、以前に作成したサービスに Lambda 読み取り関数を`app-service`サービスインスタンスとして登録します。

1. [https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) で AWS Cloud Map コンソールを開きます。

1. 左側のナビゲーションで、**名前空間**を選択します。

1. 名前空間のリストから、`cloudmap-tutorial`名前空間を選択し、**詳細の表示**を選択します。

1. **サービス**セクションで、`app-service`サービスを選択し、**詳細の表示**を選択します。

1. **「サービスインスタンス**」セクションで、**「サービスインスタンスの登録**」を選択します。

1. **サービスインスタンスの登録**ページで、次の操作を行います。

   1. **インスタンスタイプ**で、**別のリソースの識別情報**を選択します。

   1. **サービスインスタンス ID **には、 を指定します`read-instance`。

   1. **カスタム属性**セクションで、次のキーと値のペアを指定します。
      + **key** = `action`、**value** = `read`
      + **key** = `functionname`、**value** = `readfunction`

## ステップ 9: で読み取り/書き込みクライアントを作成して実行する AWS CloudShell
<a name="tutorial-customattributes-step10"></a>

コード AWS CloudShell を使用して で設定したサービスを検出し、これらのサービスを呼び出すクライアントアプリケーションを作成 AWS Cloud Map および実行できます。

1. [https://console.aws.amazon.com/cloudshell/](https://console.aws.amazon.com/cloudshell/) で AWS CloudShell コンソールを開きます。

1. 次のコマンドを使用して、 という名前のファイルを作成します`writefunction.py`。

   ```
   vim writeclient.py
   ```

1. `writeclient.py` ファイルで、 `i` ボタンを押して挿入モードを入力します。次に、次のコードをコピーして貼り付けます。このコードは、`app-service`サービス`name=writeservice`内のカスタム属性を検索してデータを書き込む Lambda 関数を検出します。DynamoDB テーブルへのデータの書き込みを担当する Lambda 関数の名前が返されます。次に、Lambda 関数が呼び出され、値としてテーブルに書き込まれるサンプルペイロードが渡されます。

   ```
   import boto3
   
   serviceclient = boto3.client('servicediscovery')
   
   response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'write' })
   
   functionname = response["Instances"][0]["Attributes"]["functionname"]
   
   lambdaclient = boto3.client('lambda')
   
   resp = lambdaclient.invoke(FunctionName=functionname, Payload='"This is a test data"')
   
   print(resp["Payload"].read())
   ```

1. エスケープキーを押し、 と入力し`:wq`、Enter キーを押してファイルを保存し、終了します。

1. Python コードを実行するには、次のコマンドを使用します。

   ```
   python3 writeclient.py
   ```

   出力は、次のような`200`レスポンスである必要があります。

   ```
   b'{"statusCode": 200, "body": "{\\"ResponseMetadata\\": {\\"RequestId\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Wed, 06 Mar 2024 22:46:09 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"2\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"Q0M038IT0BPBVBJK8OCKK6I6M7VV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"2745614147\\"}, \\"RetryAttempts\\": 0}}"}'
   ```

1. 前のステップで書き込みが成功したことを確認するには、読み取りクライアントを作成します。

   1. 次のコマンドを使用して、 というファイルを作成します`readfunction.py`。

      ```
      vim readclient.py
      ```

   1. `readclient.py` ファイルで、 `i` ボタンを押して挿入モードに入ります。次に、次のコードをコピーして貼り付けます。このコードはテーブルをスキャンし、前のステップでテーブルに書き込んだ値を返します。

      ```
      import boto3
      
      serviceclient = boto3.client('servicediscovery')
      
      response = serviceclient.discover_instances(NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'read' })
      
      functionname = response["Instances"][0]["Attributes"]["functionname"]
      
      lambdaclient = boto3.client('lambda')
      
      resp = lambdaclient.invoke(FunctionName=functionname, InvocationType='RequestResponse')
      
      print(resp["Payload"].read())
      ```

   1. エスケープキーを押し、 と入力し`:wq`、Enter キーを押してファイルを保存し、終了します。

   1. Python コードを実行するには、次のコマンドを使用します。

      ```
      python3 readclient.py
      ```

      出力は次のようになります。 を実行してテーブルに書き込まれた値`writefunction.py`と、Lambda 書き込み関数で生成されたランダムキーを一覧表示します。

      ```
        b'{"statusCode": 200, "body": "{\\"Items\\": [{\\"id\\": \\"45\\", \\"todo\\": \\"This is a test data\\"}], \\"Count\\": 1, \\"ScannedCount\\": 1, \\"ResponseMetadata\\": {\\"RequestId\\": \\"9JF8J6SFQCKR6IDT5JG5NOM3CNVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"HTTPStatusCode\\": 200, \\"HTTPHeaders\\": {\\"server\\": \\"Server\\", \\"date\\": \\"Thu, 25 Jul 2024 20:43:33 GMT\\", \\"content-type\\": \\"application/x-amz-json-1.0\\", \\"content-length\\": \\"91\\", \\"connection\\": \\"keep-alive\\", \\"x-amzn-requestid\\": \\"9JF8J6SFQCKR6IDT5JG5NOM3CNVV4KQNSO5AEMVJF66Q9ASUAAJG\\", \\"x-amz-crc32\\": \\"1163081893\\"}, \\"RetryAttempts\\": 0}}"}'
      ```

## ステップ 10: リソースをクリーンアップする
<a name="tutorial-customattributes-step11"></a>

チュートリアルを完了したら、追加料金が発生しないようにリソースを削除します。 AWS Cloud Map では、リソースを逆の順序でクリーンアップし、最初にサービスインスタンス、次にサービス、最後に名前空間をクリーンアップする必要があります。次の手順では、チュートリアルで使用される AWS Cloud Map リソースをクリーンアップする手順を説明します。

**AWS Cloud Map リソースを削除するには**

1. にサインイン AWS マネジメントコンソール し、[https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) で AWS Cloud Map コンソールを開きます。

1. 名前空間のリストから、`cloudmap-tutorial`名前空間を選択し、**詳細の表示**を選択します。

1. 名前空間の詳細ページで、サービスのリストから`data-service`サービスを選択し、**詳細の表示**を選択します。

1. **サービスインスタンス**セクションで、`data-instance`インスタンスを選択し、**登録解除**を選択します。

1. ページの上部にあるパンくずリストを使用して、**cloudmap-tutorial.com** を選択して名前空間の詳細ページに戻ります。

1. 名前空間の詳細ページで、サービスのリストから**データサービス**を選択し、**削除**を選択します。

1. `app-service` サービス、 および `write-instance``read-instance`サービスインスタンスに対してステップ 3～6 を繰り返します。

1. 左側のナビゲーションで、**名前空間**を選択します。

1. `cloudmap-tutorial` 名前空間を選択し、**削除**を選択します。

次の表に、チュートリアルで使用されている他のリソースを削除するために実行できる手順を示します。


| [リソース]  | Steps | 
| --- | --- | 
| DynamoDB テーブル | [ステップ 6: (オプション) Amazon DynamoDB デベロッパーガイドの「DynamoDB テーブルを削除してリソースをクリーンアップする](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/getting-started-step-6.html)DynamoDB」 | 
| Lambda 関数と関連する IAM 実行ロール | *AWS Lambda デベロッパーガイド*の[「クリーンアップ](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#gettingstarted-cleanup)」 | 