翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
カスタム属性で AWS Cloud Map サービス検出を使用する方法について説明します。
次のチュートリアルでは、 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。
重要
ワークショップ中に AWS リソースを作成し、アカウント AWS でコストが発生します。コストを最小限に抑えるために、ワークショップが終了したらすぐにリソースをクリーンアップすることをお勧めします。
前提条件
開始する前に、「を使用するように をセットアップする AWS Cloud Map」のステップを完了します。
ステップ 1: AWS Cloud Map 名前空間を作成する
このステップでは、 AWS Cloud Map 名前空間を作成します。名前空間は、アプリケーションのサービスをグループ化するために使用されるコンストラクトです。名前空間を作成するときは、リソースの検出方法を指定します。このステップで作成した名前空間で作成されたリソースは、カスタム属性を使用した AWS Cloud Map API コールで検出できます。
にサインイン AWS Management Console し、https://console.aws.amazon.com/cloudmap/
で AWS Cloud Map コンソールを開きます。 -
[名前空間の作成] を選択します。
-
名前空間名には、 を指定します
cloudmap-tutorial
。 -
(オプション) 名前空間の説明に、名前空間を使用する対象の説明を指定します。
-
インスタンス検出では、 API コールを選択します。
-
残りのデフォルト値のままにして、名前空間の作成を選択します。
ステップ 2: DynamoDB テーブルを作成する
このステップでは、DynamoDB テーブルを作成します。テーブルは、次のステップで作成するサンプルアプリケーションのデータを保存および取得するために使用されます。
DynamoDB の作成方法については、「DynamoDB デベロッパーガイド」の「ステップ 1: DynamoDB DynamoDB でテーブルを作成する」を参照してください。次の表を使用して、指定するオプションを決定します。 DynamoDB
オプション | 値 |
---|---|
テーブル名 |
クラウドマップ |
パーティションキー |
id |
残りの設定のデフォルト値を保持し、テーブルを作成します。
ステップ 3: AWS Cloud Map データサービスを作成し、DynamoDB テーブルをインスタンスとして登録する
このステップでは、 AWS Cloud Map サービスを作成し、最後のステップで作成した DynamoDB テーブルをサービスインスタンスとして登録します。
-
https://console.aws.amazon.com/cloudmap/
で AWS Cloud Map コンソールを開きます。 -
名前空間のリストから
cloudmap-tutorial
名前空間を選択し、詳細の表示を選択します。 -
「サービス」セクションで「サービスの作成」を選択し、以下を実行します。
-
[サービス名] に
data-service
と入力します。 -
残りのデフォルト値のままにし、サービスの作成を選択します。
-
-
サービスセクションで、
data-service
サービスを選択し、詳細の表示を選択します。 -
「サービスインスタンス」セクションで、「サービスインスタンスの登録」を選択します。
-
サービスインスタンスの登録ページで、次の操作を行います。
-
インスタンスタイプで、別のリソースの識別情報を選択します。
-
サービスインスタンス ID には、 を指定します
data-instance
。 -
Custom attributes セクションで、key =
tablename
、value = のキーと値のペアを指定しますcloudmap
。
-
ステップ 4: AWS Lambda 実行ロールを作成する
このステップでは、次のステップで AWS Lambda 関数が使用する IAM ロールを作成します。ロールはこのチュートリアルでのみ使用されcloudmap-tutorial-role
、後で削除できるため、IAM ロールに名前を付け、アクセス許可の境界を省略できます。
Lambda のサービスロールを作成するには (IAM コンソール)
にサインイン AWS Management Console し、https://console.aws.amazon.com/iam/
で IAM コンソールを開きます。 -
IAM コンソールのナビゲーションペインで、[ロール]、[ロールを作成] を選択します。
-
信頼できるエンティティタイプ で、AWS のサービス を選択します。
-
サービスまたはユースケースでは、Lambda を選択し、Lambda ユースケースを選択します。
-
[次へ] を選択します。
-
PowerUserAccess
ポリシーを検索し、ポリシーの横にあるボックスを選択し、次へを選択します。 -
[次へ] を選択します。
-
ロール名には、 を指定します
cloudmap-tutorial-role
。 -
ロールを確認したら、[ロールを作成] を選択します。
ステップ 5: データを書き込む Lambda 関数を作成する
このステップでは、 AWS Cloud Map API を使用して作成した AWS Cloud Map サービスをクエリすることで、DynamoDB テーブルにデータを書き込む Lambda 関数を最初から作成します。
Lambda 関数の作成の詳細については、「 デベロッパーガイド」の「コンソールを使用して Lambda 関数を作成する」を参照してください。次の表を使用して、指定または選択するオプションを決定します。 AWS Lambda
オプション | 値 |
---|---|
関数名 |
書き込み関数 |
ランタイム |
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 関数のタイムアウトを設定する」を参照してください。
ステップ 6: AWS Cloud Map アプリケーションサービスを作成し、Lambda 書き込み関数をインスタンスとして登録する
このステップでは、 AWS Cloud Map サービスを作成し、Lambda 書き込み関数をサービスインスタンスとして登録します。
-
https://console.aws.amazon.com/cloudmap/
で AWS Cloud Map コンソールを開きます。 -
左側のナビゲーションで、名前空間を選択します。
-
名前空間のリストから、
cloudmap-tutorial
名前空間を選択し、詳細の表示を選択します。 -
「サービス」セクションで「サービスの作成」を選択し、次の操作を行います。
-
[サービス名] に
app-service
と入力します。 -
残りのデフォルト値のままにし、サービスの作成を選択します。
-
-
サービスセクションで、
app-service
サービスを選択し、詳細の表示を選択します。 -
「サービスインスタンス」セクションで、「サービスインスタンスの登録」を選択します。
-
サービスインスタンスの登録ページで、次の操作を行います。
-
インスタンスタイプで、別のリソースの識別情報を選択します。
-
サービスインスタンス ID には、 を指定します
write-instance
。 -
カスタム属性セクションで、次のキーと値のペアを指定します。
-
key =
action
、value =write
-
key =
functionname
、value =writefunction
-
-
ステップ 7: データを読み取る Lambda 関数を作成する
このステップでは、作成した DynamoDB テーブルにデータを書き込む Lambda 関数を最初から作成します。
Lambda 関数の作成の詳細については、「 AWS Lambda デベロッパーガイド」の「コンソールを使用して Lambda 関数を作成する」を参照してください。次の表を使用して、指定または選択するオプションを決定します。
オプション | 値 |
---|---|
関数名 |
読み取り関数 |
ランタイム |
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 関数のタイムアウトを設定する」を参照してください。
ステップ 8: Lambda 読み取り関数を AWS Cloud Map サービスインスタンスとして登録する
このステップでは、以前に作成したサービスに Lambda 読み取り関数をapp-service
サービスインスタンスとして登録します。
-
https://console.aws.amazon.com/cloudmap/
で AWS Cloud Map コンソールを開きます。 -
左側のナビゲーションで、名前空間を選択します。
-
名前空間のリストから、
cloudmap-tutorial
名前空間を選択し、詳細の表示を選択します。 -
サービスセクションで、
app-service
サービスを選択し、詳細の表示を選択します。 -
「サービスインスタンス」セクションで、「サービスインスタンスの登録」を選択します。
-
サービスインスタンスの登録ページで、次の操作を行います。
-
インスタンスタイプで、別のリソースの識別情報を選択します。
-
サービスインスタンス ID には、 を指定します
read-instance
。 -
カスタム属性セクションで、次のキーと値のペアを指定します。
-
key =
action
、value =read
-
key =
functionname
、value =readfunction
-
-
ステップ 9: で読み取り/書き込みクライアントを作成して実行する AWS CloudShell
コード AWS CloudShell を使用して で設定したサービスを検出し、これらのサービスを呼び出すクライアントアプリケーションを作成 AWS Cloud Map および実行できます。
-
https://console.aws.amazon.com/cloudshell/
で AWS CloudShell コンソールを開きます。 -
次のコマンドを使用して、 という名前のファイルを作成します
writefunction.py
。vim writeclient.py
-
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())
-
エスケープキーを押し、 と入力し
:wq
、Enter キーを押してファイルを保存し、終了します。 -
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}}"}'
-
前のステップで書き込みが成功したことを確認するには、読み取りクライアントを作成します。
-
次のコマンドを使用して、 というファイルを作成します
readfunction.py
。vim readclient.py
-
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())
-
エスケープキーを押し、 と入力し
:wq
、Enter キーを押してファイルを保存し、終了します。 -
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: リソースをクリーンアップする
チュートリアルを完了したら、追加料金が発生しないようにリソースを削除します。 AWS Cloud Map では、リソースを逆の順序でクリーンアップし、最初にサービスインスタンス、次にサービス、最後に名前空間をクリーンアップする必要があります。次の手順では、チュートリアルで使用される AWS Cloud Map リソースをクリーンアップする手順を説明します。
AWS Cloud Map リソースを削除するには
にサインイン AWS Management Console し、https://console.aws.amazon.com/cloudmap/
で AWS Cloud Map コンソールを開きます。 -
名前空間のリストから、
cloudmap-tutorial
名前空間を選択し、詳細の表示を選択します。 -
名前空間の詳細ページで、サービスのリストから
data-service
サービスを選択し、詳細の表示を選択します。 -
サービスインスタンスセクションで、
data-instance
インスタンスを選択し、登録解除を選択します。 -
ページの上部にあるパンくずリストを使用して、cloudmap-tutorial.com を選択して名前空間の詳細ページに戻ります。
-
名前空間の詳細ページで、サービスのリストからデータサービスを選択し、削除を選択します。
-
app-service
サービス、 およびwrite-instance
read-instance
サービスインスタンスに対してステップ 3~6 を繰り返します。 -
左側のナビゲーションで、名前空間を選択します。
-
cloudmap-tutorial
名前空間を選択し、削除を選択します。
次の表に、チュートリアルで使用されている他のリソースを削除するために実行できる手順を示します。
リソース | ステップ |
---|---|
DynamoDB テーブル |
ステップ 6: (オプション) Amazon DynamoDB デベロッパーガイドの「DynamoDB テーブルを削除してリソースをクリーンアップするDynamoDB」 |
Lambda 関数と関連する IAM 実行ロール |
AWS Lambda デベロッパーガイドの「クリーンアップ」 |