翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS Lambda は、サーバーのプロビジョニングや管理を行わずにコードを実行できるようにするコンピューティングサービスです。たとえば、アプリケーションコードをホストするサーバーを作成しなくても、モバイルアプリケーションから送信された画像を分析できます。以下の手順は、Python で DetectCustomLabels を呼び出す Lambda 関数を作成する方法を示したものです。この関数は提供されたイメージを分析し、イメージに含まれるラベルのリストを返します。この手順では Python コードの例を記載し、Amazon S3 バケット内またはローカルコンピュータのイメージに対する Lambda 関数の呼び出し方を示しています。
トピック
ステップ 1: AWS Lambda 関数を作成する (コンソール)
このステップでは、空の AWS 関数と、 関数が DetectCustomLabels
オペレーションを呼び出せるようにするIAM実行ロールを作成します。分析用の画像を保存する Amazon S3 バケットへのアクセス権も付与します。また、以下の環境変数も指定します。
Lambda 関数が使用する Amazon Rekognition Custom Labels モデル。
モデルが使用する信頼限界。
後で、ソースコードとレイヤー (オプション) を Lambda 関数に追加します。
AWS Lambda 関数を作成するには (コンソール)
にサインイン AWS Management Console し、 で AWS Lambda コンソールを開きますhttps://console.aws.amazon.com/lambda/
。 -
[Create function (関数の作成)] を選択します。詳細については、「コンソールで Lambda 関数を作成する」を参照してください。
-
次のオプションを選択します。
-
[最初から作成] を選択します。
-
[関数名] の値を入力します。
-
[ランタイム] では、[Python 3.10] を選択します。
-
-
[関数を作成] を選択し AWS Lambda 関数を作成します。
「関数」ページで、[構成] タブを選択します。
[環境変数] ペインで、[編集] を選択します。
次の環境変数を追加します。変数ごとに [環境変数を追加] を選択し、変数のキーと値を入力します。
キー 値 MODEL_ARN
Lambda 関数で使用するモデルの Amazon リソースネーム (ARN)。モデルは、Amazon Rekognition Custom Labels コンソールのモデルの詳細ページのモデルの使用タブARNから取得できます。
CONFIDENCE
ラベルの予測におけるモデルの信頼度の最小値 (0~100)。Lambda 関数は、この値より信頼度の低いラベルを返しません。
[保存] を選択して環境変数を保存します。
-
アクセス許可ペインのロール名で、実行ロールを選択してIAMコンソールでロールを開きます。
-
[権限] タブで、[権限を追加]、[インラインポリシーを作成] をクリックします。
既存のポリシーを選択しJSON、次のポリシーに置き換えます。
{ "Version": "2012-10-17", "Statement": [ { "Action": "rekognition:DetectCustomLabels", "Resource": "*", "Effect": "Allow", "Sid": "DetectCustomLabels" } ] }
[Next (次へ)] を選択します。
ポリシーの詳細に、DetectCustomLabels-access などのポリシーの名前を入力します。
[Create policy] を選択します。
分析用の画像を Amazon S3 バケットに保存する場合は、ステップ 10 ~ 14 を繰り返します。
-
ステップ 11 では、次のポリシーを使用します。を、分析するイメージへの Amazon S3 バケットとフォルダパス
bucket/folder path
に置き換えます。{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3Access", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::
bucket/folder path
/*" } ] } ステップ 13 では、「S3Bucket-access」などの別のポリシー名を選択します。
-
ステップ 2: (オプション) レイヤーを作成する (コンソール)
この例を実行するには、このステップを行う必要はありません。DetectCustomLabels
オペレーションは、 for Python (Boto3) の一部として AWS SDKデフォルトの Lambda Python 環境に含まれています。Lambda 関数の他の部分で、デフォルトの Lambda Python 環境にない最近の AWS サービス更新が必要な場合は、このステップを実行して最新の Boto3 SDKリリースをレイヤーとして関数に追加します。
まず、Boto3 を含む .zip ファイルアーカイブを作成しますSDK。次に、レイヤーを作成し、.zip ファイルアーカイブをそのレイヤーに追加します。詳細については、「Lambda 関数でのレイヤーの使用」を参照してください。
レイヤーを作成して追加するには (コンソール)
-
コマンドプロンプトを開き、次のコマンドを入力します。
pip install boto3 --target python/. zip boto3-layer.zip -r python/
zip ファイル (boto3-layer.zip) の名前をメモします。それは、この手順のステップ 6 で必要になります。
で AWS Lambda コンソールを開きますhttps://console.aws.amazon.com/lambda/
。 -
ナビゲーションペインで [レイヤー] を選択します。
-
[レイヤーを作成] を選択します。
-
[名前] と [説明] の値を入力します。
-
[.zip ファイルをアップロード]、[アップロード] の順に選択します。
-
ダイアログボックスで、この手順のステップ 1 で作成した.zip ファイルアーカイブ (boto3-layer.zip) を選択します。
-
互換性のあるランタイムについては、Python 3.9 を選択してください。
-
[作成] を選択してレイヤーを作成します。
-
ナビゲーションペインのメニューアイコンを選択します。
-
ナビゲーションペインで、[関数] を選択します。
-
リソースリストで、ステップ 1: AWS Lambda 関数を作成する (コンソール) で作成した関数を選択します。
-
[コード] タブを選択します。
-
[レイヤー] セクションで、[レイヤーの追加] を選択します。
-
[カスタムレイヤー] を選択します。
-
[カスタムレイヤー] で、ステップ 6 で入力したレイヤー名を選択します。
[バージョン] でレイヤーバージョンを選択します。バージョンは「1」です。
-
[追加] を選択します。
ステップ 3: Python コードを追加する (コンソール)
このステップでは、Lambda コンソールのコードエディタを使用して、Lambda 関数に Python コードを追加します。このコードはDetectCustomLabels
を使って、提供されたイメージを分析し、イメージ内のラベルのリストを返します。イメージは Amazon S3 バケットに置くか、または byte64 暗号化イメージのバイトとして提供することもできます。
Python コードを追加するには (コンソール)
Lambda コンソールを使用していない場合は、次の操作を行います:
で AWS Lambda コンソールを開きますhttps://console.aws.amazon.com/lambda/
。 ステップ 1: AWS Lambda 関数を作成する (コンソール) で作成した Lambda 関数を開きます。
[コード] タブを選択します。
[コードソース] で、lambda_function.py のコードを次のコードに置き換えます。
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose An AWS lambda function that analyzes images with an the Amazon Rekognition Custom Labels model. """ import json import base64 from os import environ import logging import boto3 from botocore.exceptions import ClientError # Set up logging. logger = logging.getLogger(__name__) # Get the model ARN and confidence. model_arn = environ['MODEL_ARN'] min_confidence = int(environ.get('CONFIDENCE', 50)) # Get the boto3 client. rek_client = boto3.client('rekognition') def lambda_handler(event, context): """ Lambda handler function param: event: The event object for the Lambda function. param: context: The context object for the lambda function. return: The labels found in the image passed in the event object. """ try: # Determine image source. if 'image' in event: # Decode the image image_bytes = event['image'].encode('utf-8') img_b64decoded = base64.b64decode(image_bytes) image = {'Bytes': img_b64decoded} elif 'S3Object' in event: image = {'S3Object': {'Bucket': event['S3Object']['Bucket'], 'Name': event['S3Object']['Name']} } else: raise ValueError( 'Invalid source. Only image base 64 encoded image bytes or S3Object are supported.') # Analyze the image. response = rek_client.detect_custom_labels(Image=image, MinConfidence=min_confidence, ProjectVersionArn=model_arn) # Get the custom labels labels = response['CustomLabels'] lambda_response = { "statusCode": 200, "body": json.dumps(labels) } except ClientError as err: error_message = f"Couldn't analyze image. " + \ err.response['Error']['Message'] lambda_response = { 'statusCode': 400, 'body': { "Error": err.response['Error']['Code'], "ErrorMessage": error_message } } logger.error("Error function %s: %s", context.invoked_function_arn, error_message) except ValueError as val_error: lambda_response = { 'statusCode': 400, 'body': { "Error": "ValueError", "ErrorMessage": format(val_error) } } logger.error("Error function %s: %s", context.invoked_function_arn, format(val_error)) return lambda_response
Lambda 関数をデプロイするには、[デプロイ] を選択します。
ステップ 4: Lambda 関数を試す
このステップでは、コンピューター上の Python コードを使用して、ローカル画像または Amazon S3 バケット内の画像を Lambda 関数に渡します。ローカルコンピュータから渡される画像は 6291456 バイト未満でなければなりません。画像が大きい場合は、画像を Amazon S3 バケットにアップロードし、画像への Amazon S3 パスを使用してスクリプトを呼び出します。Amazon S3 バケットへの画像ファイルのアップロードに関しては、「オブジェクトのアップロード」を参照してください。
Lambda 関数を作成したのと同じ AWS リージョンでコードを実行してください。Lambda 関数の AWS リージョンは、Lambda コンソール
AWS Lambda 関数がタイムアウトエラーを返す場合は、Lambda 関数のタイムアウト期間を延長します。詳細については、「関数タイムアウトの設定 (コンソール)」を参照してください。
コードから Lambda 関数を呼び出す方法の詳細については、AWS Lambda 「関数の呼び出し」を参照してください。
Lambda 関数を試すには
lambda:InvokeFunction
の権限があることを確認してください。以下のポリシーを使用できます。{ "Version": "2012-10-17", "Statement": [ { "Sid": "InvokeLambda", "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "
ARN for lambda function
" } ] }Lambda 関数ARNの は、Lambda コンソール
の関数の概要から取得できます。 アクセス権限を付与するには、ユーザー、グループ、またはロールにアクセス許可を追加します。
-
以下のユーザーとグループ AWS IAM Identity Center:
アクセス許可セットを作成します。「AWS IAM Identity Center ユーザーガイド」の「権限設定を作成する」の手順に従ってください。
-
ID プロバイダーIAMを介して で管理されるユーザー:
ID フェデレーションのロールを作成します。IAM 「 ユーザーガイド」の「サードパーティー ID プロバイダー (フェデレーション) のロールを作成する」の手順に従います。
-
IAM ユーザー:
-
ユーザーが担当できるロールを作成します。「 IAMユーザーガイド」のIAM「 ユーザーのロールを作成する」の手順に従います。
-
(お奨めできない方法) ポリシーをユーザーに直接アタッチするか、ユーザーをユーザーグループに追加する。「 IAMユーザーガイド」の「ユーザーへのアクセス許可の追加 (コンソール)」の手順に従います。
-
-
-
for Python をインストールして設定 AWS SDKします。詳細については、「ステップ 4: AWS CLI と をセットアップする AWS SDKs」を参照してください。
-
ステップ 1: AWS Lambda 関数を作成する (コンソール) のステップ 7 で指定したモデルを開始します。
-
次のコードを
client.py
という名前のファイルに保存します。# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. # SPDX-License-Identifier: Apache-2.0 """ Purpose Test code for running the Amazon Rekognition Custom Labels Lambda function example code. """ import argparse import logging import base64 import json import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) def analyze_image(function_name, image): """Analyzes an image with an AWS Lambda function. :param image: The image that you want to analyze. :return The status and classification result for the image analysis. """ lambda_client = boto3.client('lambda') lambda_payload = {} if image.startswith('s3://'): logger.info("Analyzing image from S3 bucket: %s", image) bucket, key = image.replace("s3://", "").split("/", 1) s3_object = { 'Bucket': bucket, 'Name': key } lambda_payload = {"S3Object": s3_object} # Call the lambda function with the image. else: with open(image, 'rb') as image_file: logger.info("Analyzing local image image: %s ", image) image_bytes = image_file.read() data = base64.b64encode(image_bytes).decode("utf8") lambda_payload = {"image": data} response = lambda_client.invoke(FunctionName=function_name, Payload=json.dumps(lambda_payload)) return json.loads(response['Payload'].read().decode()) def add_arguments(parser): """ Adds command line arguments to the parser. :param parser: The command line parser. """ parser.add_argument( "function", help="The name of the AWS Lambda function that you want " \ "to use to analyze the image.") parser.add_argument( "image", help="The local image that you want to analyze.") def main(): """ Entrypoint for script. """ try: logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") # Get command line arguments. parser = argparse.ArgumentParser(usage=argparse.SUPPRESS) add_arguments(parser) args = parser.parse_args() # Get analysis results. result = analyze_image(args.function, args.image) status = result['statusCode'] if status == 200: labels = result['body'] labels = json.loads(labels) print(f"There are {len(labels)} labels in the image.") for custom_label in labels: confidence = int(round(custom_label['Confidence'], 0)) print( f"Label: {custom_label['Name']}: Confidence: {confidence}%") else: print(f"Error: {result['statusCode']}") print(f"Message: {result['body']}") except ClientError as error: logging.error(error) print(error) if __name__ == "__main__": main()
-
コードを実行します。コマンドライン引数には、Lambda 関数名と分析するイメージを指定します。ローカルイメージへのパス、または Amazon S3 バケットに保存したイメージへの S3 パスを指定できます。以下に例を示します。
python client.py
function_name s3://bucket/path/image.jpg
イメージが Amazon S3 バケットにある場合は、ステップ 1: AWS Lambda 関数を作成する (コンソール)のステップ 15 で指定したバケットと同じであることを確認してください。
成功すると、イメージ内のラベルのリストが出力されます。ラベルが返されない場合は、ステップ 1: AWS Lambda 関数を作成する (コンソール)のステップ 7 で設定した「信頼度」の値を下げてみてください。
Lambda 関数を使用し終わり、そのモデルが他のアプリケーションで使用中でない場合は、モデルを停止します。次回 Lambda 関数を使用するときには、モデルを開始することを忘れないでください。