Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Pelajari cara menggunakan penemuan AWS Cloud Map layanan dengan atribut kustom menggunakan AWS CLI
Tutorial ini menunjukkan bagaimana Anda dapat menggunakan penemuan AWS Cloud Map layanan dengan atribut khusus. Anda akan membuat aplikasi microservices yang digunakan AWS Cloud Map untuk menemukan sumber daya secara dinamis menggunakan atribut kustom. Aplikasi ini terdiri dari dua fungsi Lambda yang menulis data ke dan membaca dari tabel DynamoDB, dengan semua sumber daya terdaftar di. AWS Cloud Map
Untuk AWS Management Console versi tutorialnya, lihatPelajari cara menggunakan penemuan AWS Cloud Map layanan dengan atribut khusus.
Prasyarat
Sebelum Anda memulai tutorial ini, selesaikan langkah-langkahnyaSiapkan untuk digunakan AWS Cloud Map.
Buat AWS Cloud Map namespace
Namespace adalah konstruksi yang digunakan untuk mengelompokkan layanan untuk aplikasi. Pada langkah ini, Anda akan membuat namespace yang memungkinkan sumber daya dapat ditemukan melalui panggilan API. AWS Cloud Map
-
Jalankan perintah berikut untuk membuat namespace HTTP:
aws servicediscovery create-http-namespace \ --name cloudmap-tutorial \ --creator-request-id cloudmap-tutorial-request
Perintah mengembalikan ID operasi. Anda dapat memeriksa status operasi dengan perintah berikut:
aws servicediscovery get-operation \ --operation-id operation-id
-
Setelah namespace dibuat, Anda dapat mengambil ID-nya untuk digunakan dalam perintah berikutnya:
aws servicediscovery list-namespaces \ --query "Namespaces[?Name=='cloudmap-tutorial'].Id" \ --output text
-
Simpan ID namespace dalam variabel untuk digunakan nanti:
NAMESPACE_ID=$(aws servicediscovery list-namespaces \ --query "Namespaces[?Name=='cloudmap-tutorial'].Id" \ --output text)
Membuat tabel DynamoDB
Selanjutnya, buat tabel DynamoDB yang akan menyimpan data untuk aplikasi Anda:
-
Jalankan perintah berikut untuk membuat tabel:
aws dynamodb create-table \ --table-name cloudmap \ --attribute-definitions AttributeName=id,AttributeType=S \ --key-schema AttributeName=id,KeyType=HASH \ --billing-mode PAY_PER_REQUEST
-
Tunggu tabel menjadi aktif sebelum melanjutkan:
aws dynamodb wait table-exists --table-name cloudmap
Perintah ini menunggu sampai tabel sepenuhnya dibuat dan siap digunakan.
Buat layanan AWS Cloud Map data dan daftarkan tabel DynamoDB
Sekarang, buat layanan di namespace Anda untuk mewakili sumber daya penyimpanan data:
-
Jalankan perintah berikut untuk membuat AWS Cloud Map layanan untuk sumber daya penyimpanan data:
aws servicediscovery create-service \ --name data-service \ --namespace-id $NAMESPACE_ID \ --creator-request-id data-service-request
-
Dapatkan ID layanan untuk layanan data:
DATA_SERVICE_ID=$(aws servicediscovery list-services \ --query "Services[?Name=='data-service'].Id" \ --output text)
-
Mendaftarkan tabel DynamoDB sebagai contoh layanan dengan atribut kustom yang menentukan nama tabel:
aws servicediscovery register-instance \ --service-id $DATA_SERVICE_ID \ --instance-id data-instance \ --attributes tablename=cloudmap
Atribut kustom
tablename=cloudmap
memungkinkan layanan lain untuk menemukan nama tabel DynamoDB secara dinamis.
Buat peran IAM untuk fungsi Lambda
Buat peran IAM yang akan digunakan fungsi Lambda untuk AWS mengakses sumber daya:
-
Buat dokumen kebijakan kepercayaan untuk peran IAM:
cat > lambda-trust-policy.json << EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF
-
Jalankan perintah berikut untuk membuat peran IAM menggunakan kebijakan kepercayaan:
aws iam create-role \ --role-name cloudmap-tutorial-role \ --assume-role-policy-document file://lambda-trust-policy.json
-
Buat file untuk kebijakan IAM khusus dengan izin hak istimewa paling sedikit:
cat > cloudmap-policy.json << EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "servicediscovery:DiscoverInstances" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "dynamodb:PutItem", "dynamodb:Scan" ], "Resource": "arn:aws:dynamodb:*:*:table/cloudmap" } ] } EOF
-
Buat dan lampirkan kebijakan ke peran IAM:
aws iam create-policy \ --policy-name CloudMapTutorialPolicy \ --policy-document file://cloudmap-policy.json POLICY_ARN=$(aws iam list-policies \ --query "Policies[?PolicyName=='CloudMapTutorialPolicy'].Arn" \ --output text) aws iam attach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn $POLICY_ARN aws iam attach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Buat fungsi Lambda untuk menulis data
Untuk membuat fungsi Lambda yang menulis data ke tabel DynamoDB, ikuti langkah-langkah berikut:
-
Buat file Python untuk fungsi tulis:
cat > writefunction.py << EOF import json import boto3 import random def lambda_handler(event, context): try: serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='data-service') if not response.get("Instances"): return { 'statusCode': 500, 'body': json.dumps({"error": "No instances found"}) } tablename = response["Instances"][0]["Attributes"].get("tablename") if not tablename: return { 'statusCode': 500, 'body': json.dumps({"error": "Table name attribute not found"}) } dynamodbclient = boto3.resource('dynamodb') table = dynamodbclient.Table(tablename) # Validate input if not isinstance(event, str): return { 'statusCode': 400, 'body': json.dumps({"error": "Input must be a string"}) } response = table.put_item( Item={ 'id': str(random.randint(1,100)), 'todo': event }) return { 'statusCode': 200, 'body': json.dumps(response) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({"error": str(e)}) } EOF
Fungsi ini digunakan AWS Cloud Map untuk menemukan nama tabel DynamoDB dari atribut kustom, lalu menulis data ke tabel.
-
Package dan deploy fungsi Lambda:
zip writefunction.zip writefunction.py ROLE_ARN=$(aws iam get-role --role-name cloudmap-tutorial-role \ --query 'Role.Arn' --output text) aws lambda create-function \ --function-name writefunction \ --runtime python3.12 \ --role $ROLE_ARN \ --handler writefunction.lambda_handler \ --zip-file fileb://writefunction.zip \ --architectures x86_64
-
Perbarui batas waktu fungsi untuk menghindari kesalahan batas waktu:
aws lambda update-function-configuration \ --function-name writefunction \ --timeout 5
Buat layanan AWS Cloud Map aplikasi dan daftarkan fungsi tulis Lambda
Untuk membuat layanan lain di namespace Anda untuk mewakili fungsi aplikasi, ikuti langkah-langkah berikut:
-
Buat layanan untuk fungsi aplikasi:
aws servicediscovery create-service \ --name app-service \ --namespace-id $NAMESPACE_ID \ --creator-request-id app-service-request
-
Dapatkan ID layanan untuk layanan aplikasi:
APP_SERVICE_ID=$(aws servicediscovery list-services \ --query "Services[?Name=='app-service'].Id" \ --output text)
-
Daftarkan fungsi tulis Lambda sebagai instance layanan dengan atribut khusus:
aws servicediscovery register-instance \ --service-id $APP_SERVICE_ID \ --instance-id write-instance \ --attributes action=write,functionname=writefunction
Atribut kustom
action=write
danfunctionname=writefunction
memungkinkan klien untuk menemukan fungsi ini berdasarkan tujuannya.
Buat fungsi Lambda untuk membaca data
Untuk membuat fungsi Lambda yang membaca data dari tabel DynamoDB, ikuti langkah-langkah berikut:
-
Buat file Python untuk fungsi baca:
cat > readfunction.py << EOF import json import boto3 def lambda_handler(event, context): try: serviceclient = boto3.client('servicediscovery') response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='data-service') if not response.get("Instances"): return { 'statusCode': 500, 'body': json.dumps({"error": "No instances found"}) } tablename = response["Instances"][0]["Attributes"].get("tablename") if not tablename: return { 'statusCode': 500, 'body': json.dumps({"error": "Table name attribute not found"}) } dynamodbclient = boto3.resource('dynamodb') table = dynamodbclient.Table(tablename) # Use pagination for larger tables response = table.scan( Select='ALL_ATTRIBUTES', Limit=50 # Limit results for demonstration purposes ) # For production, you would implement pagination like this: # items = [] # while 'LastEvaluatedKey' in response: # items.extend(response['Items']) # response = table.scan( # Select='ALL_ATTRIBUTES', # ExclusiveStartKey=response['LastEvaluatedKey'] # ) # items.extend(response['Items']) return { 'statusCode': 200, 'body': json.dumps(response) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({"error": str(e)}) } EOF
Fungsi ini juga digunakan AWS Cloud Map untuk menemukan nama tabel DynamoDB, lalu membaca data dari tabel. Ini termasuk penanganan kesalahan dan komentar pagination.
-
Package dan deploy fungsi Lambda:
zip readfunction.zip readfunction.py aws lambda create-function \ --function-name readfunction \ --runtime python3.12 \ --role $ROLE_ARN \ --handler readfunction.lambda_handler \ --zip-file fileb://readfunction.zip \ --architectures x86_64
-
Perbarui batas waktu fungsi:
aws lambda update-function-configuration \ --function-name readfunction \ --timeout 5
Daftarkan fungsi baca Lambda sebagai instance layanan
Untuk mendaftarkan fungsi baca Lambda sebagai instance layanan lain di layanan aplikasi, ikuti langkah ini:
aws servicediscovery register-instance \ --service-id $APP_SERVICE_ID \ --instance-id read-instance \ --attributes action=read,functionname=readfunction
Atribut kustom action=read
dan functionname=readfunction
memungkinkan klien untuk menemukan fungsi ini berdasarkan tujuannya.
Membuat dan menjalankan aplikasi klien
Untuk membuat aplikasi klien Python yang digunakan AWS Cloud Map untuk menemukan dan memanggil fungsi tulis, ikuti langkah-langkah berikut:
-
Buat file Python untuk aplikasi klien tulis:
cat > writeclient.py << EOF import boto3 import json try: serviceclient = boto3.client('servicediscovery') print("Discovering write function...") response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'write' } ) if not response.get("Instances"): print("Error: No instances found") exit(1) functionname = response["Instances"][0]["Attributes"].get("functionname") if not functionname: print("Error: Function name attribute not found") exit(1) print(f"Found function: {functionname}") lambdaclient = boto3.client('lambda') print("Invoking Lambda function...") resp = lambdaclient.invoke( FunctionName=functionname, Payload='"This is a test data"' ) payload = resp["Payload"].read() print(f"Response: {payload.decode('utf-8')}") except Exception as e: print(f"Error: {str(e)}") EOF
Klien ini menggunakan
QueryParameters
opsi untuk menemukan instance layanan denganaction=write
atribut. -
Buat file Python untuk aplikasi klien baca:
cat > readclient.py << EOF import boto3 import json try: serviceclient = boto3.client('servicediscovery') print("Discovering read function...") response = serviceclient.discover_instances( NamespaceName='cloudmap-tutorial', ServiceName='app-service', QueryParameters={ 'action': 'read' } ) if not response.get("Instances"): print("Error: No instances found") exit(1) functionname = response["Instances"][0]["Attributes"].get("functionname") if not functionname: print("Error: Function name attribute not found") exit(1) print(f"Found function: {functionname}") lambdaclient = boto3.client('lambda') print("Invoking Lambda function...") resp = lambdaclient.invoke( FunctionName=functionname, InvocationType='RequestResponse' ) payload = resp["Payload"].read() print(f"Response: {payload.decode('utf-8')}") except Exception as e: print(f"Error: {str(e)}") EOF
-
Jalankan klien tulis untuk menambahkan data ke tabel DynamoDB:
python3 writeclient.py
Output harus menunjukkan respons yang berhasil dengan kode status HTTP 200.
-
Jalankan klien baca untuk mengambil data dari tabel DynamoDB:
python3 readclient.py
Output harus menunjukkan data yang ditulis ke tabel, termasuk ID yang dihasilkan secara acak dan nilai “Ini adalah data uji”.
Pembersihan sumber daya
Setelah selesai dengan tutorial, bersihkan sumber daya untuk menghindari biaya tambahan.
-
Pertama, jalankan perintah berikut untuk membatalkan pendaftaran instance layanan:
aws servicediscovery deregister-instance \ --service-id $APP_SERVICE_ID \ --instance-id read-instance aws servicediscovery deregister-instance \ --service-id $APP_SERVICE_ID \ --instance-id write-instance aws servicediscovery deregister-instance \ --service-id $DATA_SERVICE_ID \ --instance-id data-instance
-
Jalankan perintah berikut untuk menghapus layanan:
aws servicediscovery delete-service \ --id $APP_SERVICE_ID aws servicediscovery delete-service \ --id $DATA_SERVICE_ID
-
Jalankan perintah berikut untuk menghapus namespace:
aws servicediscovery delete-namespace \ --id $NAMESPACE_ID
-
Jalankan perintah berikut untuk menghapus fungsi Lambda:
aws lambda delete-function --function-name writefunction aws lambda delete-function --function-name readfunction
-
Jalankan perintah berikut untuk menghapus peran dan kebijakan IAM:
aws iam detach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn $POLICY_ARN aws iam detach-role-policy \ --role-name cloudmap-tutorial-role \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam delete-policy \ --policy-arn $POLICY_ARN aws iam delete-role --role-name cloudmap-tutorial-role
-
Jalankan perintah berikut untuk menghapus tabel DynamoDB:
aws dynamodb delete-table --table-name cloudmap
-
Jalankan perintah berikut untuk membersihkan file sementara:
rm -f lambda-trust-policy.json cloudmap-policy.json writefunction.py readfunction.py writefunction.zip readfunction.zip writeclient.py readclient.py