

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

# Lambda と Python を使用したイメージ内のラベルの検出
<a name="lambda-s3-tutorial-python"></a>

 AWS Lambda は、サーバーのプロビジョニングや管理を行わずにコードを実行するために使用できるコンピューティングサービスです。Rekognition API オペレーションは、Lambda 関数内から呼び出せます。以下の手順は、Python で `DetectLabels` を呼び出す Lambda 関数を作成する方法を示したものです。

Lambda 関数が `DetectLabels` を呼び出すと、イメージ内で検出されたラベルと、検出時のその信頼度が返されます。

以下の手順には、Lambda 関数の呼び出し方と、Amazon S3 バケットまたはローカルのコンピュータにあるイメージと共にこれを指定する方法を示す、Python コードの例が含まれています。

選択したイメージが Rekognition の制限を満たしていることを確認します。イメージのファイルタイプとサイズの上限に関する詳細は、Rekognition の「[Guidelines and quotas](https://docs.aws.amazon.com/rekognition/latest/dg/limits.html)」と「[DetectLabels API Reference](https://docs.aws.amazon.com/rekognition/latest/APIReference/API_DetectLabels.html)」を参照してください。

## Lambda 関数の作成 (コンソール)
<a name="lambda-s3-tutorial-python-create"></a>

このステップでは、空の Lambda 関数と、その関数が `DetectLabels` オペレーションを呼び出すための IAM 実行ロールを作成します。ソースコードとレイヤー (オプション) は、後半のステップで Lambda 関数に追加します。

Amazon S3 バケットに保存されているドキュメントを使用している場合は、このステップで、ドキュメントを保存しているバケットへのアクセスを許可する方法についても説明します。

**AWS Lambda 関数を作成するには (コンソール)**

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

1. [**関数の作成**] を選択してください。詳細については、「[コンソールで Lambda の関数の作成](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)」を参照してください。

1. 次のオプションを選択します。
   + **[最初から作成]** を選択します。
   + **[関数名]** に値を入力します。
   + **[ランタイム]** で、最新バージョンの Python を選択します。
   + **[アーキテクチャ]** で **[x86\_64]** を選択します。

1. **[関数の作成]** を選択し、 AWS Lambda 関数を作成します。

1. 関数ページで、**[設定]** タブを選択します。

1. **[アクセス権限]** タブの **[実行ロール]** でロール名を選択し、このロールを IAM コンソールで開きます。

1. **[アクセス権限]** タブで、**[アクセス権限を追加]**、次に **[インラインポリシーを作成]** をクリックします。

1. **[JSON]** タブを選択し、ポリシーを次のポリシーに置き換えます。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": "rekognition:DetectLabels",
               "Resource": "*",
               "Effect": "Allow",
               "Sid": "DetectLabels"
           }
       ]
   }
   ```

------

1. **[ポリシーの確認]** を選択します。

1. ポリシーの名前を入力します (例: DetectLabels-access)。

1. [**Create policy**] (ポリシーの作成) を選択します。

1. 分析用のドキュメントを Amazon S3 バケットに保存する場合は、Amazon S3 アクセスポリシーを追加する必要があります。追加するには、 AWS Lambda コンソールでステップ 7～11 を繰り返し、以下のように変更を加えます。

   1. ステップ 8 で、以下のポリシーを使用します。{{bucket/folder path}} を、Amazon S3 バケットと、分析するドキュメントのフォルダパスに置き換えます。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Sid": "S3Access",
                  "Effect": "Allow",
                  "Action": "s3:GetObject",
                  "Resource": "arn:aws:s3:::{{bucket/folder path}}/*"
              }
          ]
      }
      ```

------

   1. ステップ 10 で、異なるポリシー名 (S3Bucket-access など) を選択します。

## (オプション) レイヤーの作成 (コンソール)
<a name="lambda-s3-tutorial-python-layer"></a>

Lambda 関数を使用して `DetectLabels` を呼び出すときは、このステップを実行する必要はありません。

`DetectLabels` オペレーションは、 AWS SDK for Python (Boto3) の一部としてデフォルトの Lambda Python 環境に含まれています。

Lambda 関数の他の部分で、デフォルトの Lambda Python 環境にない最新の AWS サービス更新が必要な場合は、このステップを実行して、最新の Boto3 SDK リリースを関数のレイヤーとして追加できます。

SDK をレイヤーとして追加するには、最初に Boto3 SDK を含む .zip ファイルアーカイブを作成します。次に、レイヤーを作成して .zip ファイルアーカイブをそのレイヤーに追加します。詳細については「[Using layers with your Lambda function](https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html#invocation-layers-using)」を参照してください。

**レイヤーを作成して追加するには (コンソール)**

1. コマンドプロンプトを開き、次のコマンドを入力して、最新バージョンの AWS SDK でデプロイパッケージを作成します。

   ```
   pip install boto3 --target python/.
   zip boto3-layer.zip -r python/
   ```

1. zip ファイルの名前 (boto3-layer.zip) を書き留めます。この名前は、この手順内のステップ 8 で使用します。

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

1. ナビゲーションペインで **[レイヤー]** を選択します。

1. **[レイヤーを作成]** を選択します。

1. **[名前]** と **[説明]** の値を入力します。

1. **[コードエントリタイプ]** で、**[.zip ファイルをアップロード]** を選択し、**[アップロード]** を選択します。

1. ダイアログボックスで、この手順のステップ 1 で作成した .zip ファイルアーカイブ (boto3-layer.zip) を選択します。

1. **[互換性のあるランタイム]** で、最新バージョンの Python を選択します。

1. **[作成]** を選択してレイヤーを作成します。

1. ナビゲーションペインのメニューアイコンを選択します。

1. ナビゲーションペインで、**[関数]** を選択します。

1. リソースリストの中から、「[](#lambda-s3-tutorial-python-create)」で作成した関数を選択します。

1. **[コード]** タブを選択します。

1. **[レイヤー]** セクションで、**[レイヤーの追加]** を選択します。

1. **[カスタムレイヤー]** を選択します。

1. **[カスタムレイヤー]** で、ステップ 6 で入力したレイヤー名を選択します。

1. **[バージョン]** でレイヤーバージョンを選択します。バージョンは「1」です。

1. **[Add]** (追加) を選択します。

## Python コードの追加 (コンソール)
<a name="lambda-s3-tutorial-python-console-code"></a>

このステップでは、Lambda コンソールのコードエディタから Lambda 関数に Python コードを追加します。このコードは、`DetectLabels` オペレーションを使用してイメージ内のラベルを検出します。それにより、イメージ内で検出されたラベルと、検出されたラベルの信頼度が返されます。

`DetectLabels` オペレーションに提供するドキュメントは、Amazon S3 バケットかローカルコンピュータにあります。

**Python コードを追加するには (コンソール)**

1. **[コード]** タブに移動します。

1. コードエディタで、**lambda\_function.py** のコードを以下のコードに置き換えます。

   ```
   import boto3
   import logging
   from botocore.exceptions import ClientError
   import json
   import base64
   
   # Instantiate logger
   logger = logging.getLogger(__name__)
   
   # connect to the Rekognition client
   rekognition = boto3.client('rekognition')
   
   def lambda_handler(event, context):
   
       try:
           image = None
           if 'S3Bucket' in event and 'S3Object' in event:
               s3 = boto3.resource('s3')
               s3_object = s3.Object(event['S3Bucket'], event['S3Object'])
               image = s3_object.get()['Body'].read()
   
           elif 'image' in event:
               image_bytes = event['image'].encode('utf-8')
               img_b64decoded = base64.b64decode(image_bytes)
               image = img_b64decoded
   
   
           elif image is None:
               raise ValueError('Missing image, check image or bucket path.')
   
           else:
               raise ValueError("Only base 64 encoded image bytes or S3Object are supported.")
   
           response = rekognition.detect_labels(Image={'Bytes': image})
           lambda_response = {
               "statusCode": 200,
               "body": json.dumps(response)
           }
           labels = [label['Name'] for label in response['Labels']]
           print("Labels found:")
           print(labels)
   
       except ClientError as client_err:
   
          error_message = "Couldn't analyze image: " + client_err.response['Error']['Message']
   
          lambda_response = {
              'statusCode': 400,
              'body': {
                  "Error": client_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
   ```

1. **[デプロイ]** を選択し、Lambda 関数をデプロイします。

## Python コードを追加するには (コンソール)
<a name="lambda-s3-tutorial-python-invoke"></a>

Lambda 関数を作成したので、この関数を呼び出すことでイメージ内のラベルを検出できます。

このステップでは、コンピュータで Python コードを実行し、ローカルのイメージまたは Amazon S3 バケット内のイメージを Lambda 関数に渡します。

Lambda 関数を作成したリージョンと同じ AWS リージョンでコードを実行してください。Lambda 関数の AWS リージョンは、Lambda コンソールの関数の詳細ページのナビゲーションバーで表示できます。

Lambda 関数がタイムアウトエラーを返した場合は、Lambda 関数のタイムアウト期間を延長します。詳細については、「[関数のタイムアウトの設定 (コンソール)](https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-timeout-console)」を参照してください。

コードから Lambda 関数を呼び出す方法の詳細については、「[Lambda 関数を呼び出す](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)」を参照してください。

**Lambda 関数をテストするには**

1. まだの場合は、 以下を実行してください:

   1. ユーザーに `lambda:InvokeFunction` のアクセス許可があることを確認します。以下のポリシーを使用できます。

      Lambda 関数の ARN は、[Lambda コンソール](https://console.aws.amazon.com/lambda/)にある [関数の概要] から取得できます。

      アクセスを提供するには、ユーザー、グループ、またはロールにアクセス許可を追加します。
      + 以下のユーザーとグループ AWS IAM アイデンティティセンター:

        アクセス許可セットを作成します。「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[アクセス許可セットを作成する](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)」の手順に従ってください。
      + IAM 内で、ID プロバイダーによって管理されているユーザー:

        ID フェデレーションのロールを作成します。詳細については *IAM ユーザーガイド* の [サードパーティー ID プロバイダー (フェデレーション) 用のロールを作成する](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html) を参照してください。
      + IAM ユーザー:
        + ユーザーが担当できるロールを作成します。手順については *IAM ユーザーガイド* の [IAM ユーザーのロールの作成](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html) を参照してください。
        + (お奨めできない方法) ポリシーをユーザーに直接アタッチするか、ユーザーをユーザーグループに追加します。*IAM ユーザーガイド* の [ユーザー (コンソール) へのアクセス許可の追加](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console) の指示に従います。

   1.  AWS SDK for Python をインストールして設定します。詳細については、「[ステップ 2: AWS CLI と AWS SDKsを設定する](setup-awscli-sdk.md)」を参照してください。

1. 次のコードを `client.py` という名前のファイルに保存します。

   ```
   import boto3
   import json
   import base64
   import pprint
   
   # Replace with the name of your S3 bucket and image object key
   bucket_name = "name of bucket"
   object_key = "name of file in s3 bucket"
   # If using a local file, supply the file name as the value of image_path below
   image_path = ""
   
   # Create session and establish connection to client['
   session = boto3.Session(profile_name='developer-role')
   s3 = session.client('s3', region_name="us-east-1")
   lambda_client = session.client('lambda',  region_name="us-east-1")
   
   # Replace with the name of your Lambda function
   function_name = 'RekDetectLabels'
   
   def analyze_image_local(img_path):
   
       print("Analyzing local image:")
   
       with open(img_path, 'rb') as image_file:
           image_bytes = image_file.read()
           data = base64.b64encode(image_bytes).decode("utf8")
   
           lambda_payload = {"image": data}
   
           # Invoke the Lambda function with the event payload
           response = lambda_client.invoke(
               FunctionName=function_name,
               Payload=(json.dumps(lambda_payload))
           )
   
           decoded = json.loads(response['Payload'].read().decode())
           pprint.pprint(decoded)
   
   def analyze_image_s3(bucket_name, object_key):
   
       print("Analyzing image in S3 bucket:")
   
       # Load the image data from S3 into memory
       response = s3.get_object(Bucket=bucket_name, Key=object_key)
       image_data = response['Body'].read()
       image_data = base64.b64encode(image_data).decode("utf8")
   
        # Create the Lambda event payload
       event = {
           'S3Bucket': bucket_name,
           'S3Object': object_key,
           'ImageBytes': image_data
       }
   
       # Invoke the Lambda function with the event payload
       response = lambda_client.invoke(
               FunctionName=function_name,
               InvocationType='RequestResponse',
               Payload=json.dumps(event),
               )
   
       decoded = json.loads(response['Payload'].read().decode())
       pprint.pprint(decoded)
   
   def main(path_to_image, name_s3_bucket, obj_key):
   
       if str(path_to_image) != "":
           analyze_image_local(path_to_image)
       else:
           analyze_image_s3(name_s3_bucket, obj_key)
   
   if __name__ == "__main__":
       main(image_path, bucket_name, object_key)
   ```

1. コードを実行します。ドキュメントが Amazon S3 バケットにある場合は、「[](#lambda-s3-tutorial-python-create)」のステップ 12 で指定したバケットと同じバケットであることを確認します。

   正常に実行されると、コードはドキュメント内で検出された各ブロックタイプについて JSON レスポンスの一部を返します。