

# チュートリアル: S3 Object Lambda を使用したアプリケーションのデータの変換
<a name="tutorial-s3-object-lambda-uppercase"></a>

**注記**  
2025 年 11 月 7 日現在、S3 Object Lambda は、現在サービスを使用している既存のお客様、および一部の AWS パートナーネットワーク (APN) パートナーのみが利用できます。S3 Object Lambda と同様の機能の詳細については、「[Amazon S3 Object Lambda availability change](https://docs.aws.amazon.com/AmazonS3/latest/userguide/amazons3-ol-change.html)」を参照してください。

Amazon S3 にデータを保管すると、複数のアプリケーションで使用するために簡単にデータを共有できます。ただし、各アプリケーションには固有のデータ形式の要件があり、特定のユースケースでデータの変更や処理が必要になる場合があります。例えば、e コマースアプリケーションによって作成されたデータセットには、個人を特定できる情報 (PII) が含まれている場合があります。分析のために同じデータが処理される場合、この PII は必要ないため、編集する必要があります。ただし、同じデータセットをマーケティングキャンペーンに使用する場合は、顧客ロイヤルティデータベースからの情報など、追加の詳細でデータを充実させる必要がある場合があります。

[S3 Object Lambda](https://aws.amazon.com/s3/features/object-lambda) を使用すると、独自のコードを追加して、データがアプリケーションに返される前に S3 からのデータを処理できます。具体的には、AWS Lambda 関数を設定して、S3 Object Lambda アクセスポイントにアタッチします。アプリケーションが S3 Object Lambda アクセスポイントを介して[標準 S3 GET リクエスト](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)を送信すると、指定された Lambda 関数が呼び出され、サポートする S3 アクセスポイントを介して基盤となるデータソースから取得されたデータが処理されます。その後、S3 Object Lambda アクセスポイントは、変換された結果をアプリケーションに返します。独自のカスタム Lambda 関数を作成して実行し、S3 Object Lambda データ変換を特定のユースケースに合わせて調整できます。すべて、アプリケーションの変更は不要です。

![\[これは S3 Object Lambda ワークフロー図です。\]](http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/images/ol-example-image-global.png)


**目的**  
このチュートリアルでは、標準の S3 GET リクエストにカスタムコードを追加して、リクエストしたクライアントまたはアプリケーションのニーズに合うように、S3 から取得したリクエストされたオブジェクトを変更する方法を学習します。具体的には、S3 バケットに保存されている元のオブジェクトのすべてのテキストを S3 Object Lambda を使用して大文字に変換する方法を学習します。

**注記**  
このチュートリアルでは、Python コードを使用してデータを変換します。他の AWS SDK の使用例については、AWS SDK コードサンプルライブラリの「[S3 Object Lambda でアプリケーションのデータを変換する](https://docs.aws.amazon.com/code-library/latest/ug/lambda_example_cross_ServerlessS3DataTransformation_section.html)」を参照してください。

**Topics**
+ [前提条件](#ol-upper-prerequisites)
+ [ステップ 1: S3 バケットを作成する](#ol-upper-step1)
+ [ステップ 2: S3 バケットにファイルをアップロード](#ol-upper-step2)
+ [ステップ 3: S3 アクセスポイントの作成](#ol-upper-step3)
+ [ステップ 4: Lambda 関数を作成する](#ol-upper-step4)
+ [ステップ 5: Lambda 関数の実行ロールの IAM ポリシーを設定する](#ol-upper-step5)
+ [ステップ 6: Object Lambda アクセスポイントの作成](#ol-upper-step6)
+ [ステップ 7: 変換されたデータを表示する](#ol-upper-step7)
+ [ステップ 8: クリーンアップする](#ol-upper-step8)
+ [次のステップ](#ol-upper-next-steps)

## 前提条件
<a name="ol-upper-prerequisites"></a>

このチュートリアルを開始する前に、適切な許可が付与された AWS Identity and Access Management (IAM) ユーザーとしてサインインできる AWS アカウントが必要です。また、バージョン 3.8 以降の Python をインストールする必要があります。

**Topics**
+ [AWS アカウントでアクセス許可を持つ IAM ユーザーを作成します (コンソール)。](#ol-upper-prerequisites-account)
+ [ローカルマシンに Python 3.8 以降をインストールする](#ol-upper-prerequisites-python)

### AWS アカウントでアクセス許可を持つ IAM ユーザーを作成します (コンソール)。
<a name="ol-upper-prerequisites-account"></a>

チュートリアル用の IAM ユーザーを作成できます。このチュートリアルを完了するには、IAM ユーザーが次の IAM ポリシーをアタッチして、関連する AWS リソースにアクセスし、特定のアクションを実行する必要があります。IAM ユーザーを作成する方法の詳細については、**「IAM ユーザーガイド」の「[IAM ユーザーの作成 (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console)」を参照してください。

IAM ユーザーには次のポリシーが必要です。
+ [AmazonS3FullAccess](https://console.aws.amazon.com/iam/home?#/policies/arn:aws:iam::aws:policy/AmazonS3FullAccess$jsonEditor) – Object Lambda アクセスポイントを作成および使用するための許可を含む、すべての Amazon S3 アクションに対する許可を付与します。
+ [AWSLambda\$1FullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor) – すべての Lambda アクションに許可を付与します。
+ [IAMFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor) – すべての IAM アクションに許可を付与します。
+ [IAMAccessAnalyzerReadOnlyAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/IAMAccessAnalyzerReadOnlyAccess$jsonEditor) – IAM Access Analyzer によって提供されるすべてのアクセス情報を読み取る許可を付与します。
+ [CloudWatchLogsFullAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/CloudWatchLogsFullAccess$jsonEditor) – CloudWatch Logs へのフルアクセスを付与します。

**注記**  
このチュートリアルでは、わかりやすいように IAM ユーザーを作成して使用します。このチュートリアルを完了したら、忘れずに「[IAM ユーザーを削除する](#ol-upper-step8-delete-user)」を行います。本番環境で使用する場合は、「*IAM ユーザーガイド*」の「[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」に従うことをお勧めします。ベストプラクティスでは、人間のユーザーと ID プロバイダーとのフェデレーションにより、一時的な認証情報を使用して AWS にアクセスする必要があります。追加のベストプラクティスとして、ワークロードでは一時的な認証情報で IAM ロールを使用し、AWS にアクセス必要があります。AWS IAM アイデンティティセンター を使用して一時的な認証情報を持つユーザーを作成する方法については、「*AWS IAM アイデンティティセンター ユーザーガイド*」の「[Getting started](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)」を参照してください。  
このチュートリアルでは、フルアクセス権を持つ AWS マネージドポリシーも使用します。実稼働環境では、代わりに、[セキュリティのベストプラクティス](security-best-practices.md#security-best-practices-prevent)に従って、ユースケースに必要な最小限の許可のみを付与することをお勧めします。

### ローカルマシンに Python 3.8 以降をインストールする
<a name="ol-upper-prerequisites-python"></a>

次の手順に従って、Python 3.8 以降をローカルマシンにインストールします。インストール手順については、Python の *Beginner Guide* で「[Python のダウンロード](https://wiki.python.org/moin/BeginnersGuide/Download)」ページを参照してください。

1. ローカルターミナルまたはシェルを開き、次のコマンドを実行して、Python がすでにインストールされているかどうか、インストールされている場合は、どのバージョンがインストールされているかを確認します。

   ```
   python --version
   ```

1. Python 3.8 以降をお持ちでない場合は、ローカルマシンに適した Python 3.8 以降の[公式インストーラ](https://www.python.org/downloads/)をダウンロードします。

1. ダウンロードしたファイルをダブルクリックしてインストーラを実行し、手順に従ってインストールを完了します。

   **Windows ユーザー**の場合、インストールウィザードで [**Python 3.X を PATH に追加**] を選択してから、[**今すぐ、インストール**] を選択します。

1. ターミナルを閉じて再度開いて、再起動します。

1. 次のコマンドを実行して、Python 3.8 以降が正しくインストールされていることを確認します。

   **macOS ユーザー**の場合は、このコマンドを実行します。

   ```
   python3 --version
   ```

   **Windows ユーザー**の場合は、このコマンドを実行します。

   ```
   python --version
   ```

1. 次のコマンドを実行して、pip3 パッケージマネージャーがインストールされていることを確認します。コマンド応答に pip のバージョン番号と python 3.8 以降が表示された場合、pip3 パッケージマネージャが正常にインストールされていることを意味します。

   ```
   pip --version
   ```

## ステップ 1: S3 バケットを作成する
<a name="ol-upper-step1"></a>

変換する元のデータを保存するバケットを作成します。

**注記**  
Amazon FSx for OpenZFS ボリュームなどの別のデータソースにアクセスポイントをアタッチできますが、このチュートリアルでは S3 バケットにアタッチされたサポートアクセスポイントを使用します。

**バケットを作成するには**

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

1. 左側のナビゲーションペインで、[**バケット**] を選択します。

1. [**Create bucket (バケットの作成)**] を選択します。

   **[バケットの作成]** ページが開きます。

1. [**バケット名**] に、バケットの名前 (例、**tutorial-bucket**) を入力します。

   Amazon S3 のバケット命名規則の詳細については、「[汎用バケットの命名規則](bucketnamingrules.md)」を参照してください。

1. [**リージョン**] で、バケットを保存する AWS リージョン を選択します。

   バケットのリージョンの詳細については、「[汎用バケットの概要](UsingBucket.md)」を参照してください。

1. [**このバケットのパブリックアクセス設定をブロック**] で、デフォルト設定 (**ブロック*すべて*パブリックアクセス**が有効) のままであることを確認します。

   ユースケースでオフにする必要のある設定が 1 つ以上あることがわかっている場合を除き、すべてのブロックパブリックアクセス設定を有効にしておくことをお勧めします。パブリックアクセスのブロックの詳細については、[Amazon S3 ストレージへのパブリックアクセスのブロック](access-control-block-public-access.md) を参照してください。

1. 残りの設定はデフォルトのままにしておきます。

   (オプション) 特定のユースケースに追加のバケット設定を設定する場合は、「[汎用バケットの作成](create-bucket-overview.md)」を参照してください。

1. **[バケットを作成]** を選択します。

## ステップ 2: S3 バケットにファイルをアップロード
<a name="ol-upper-step2"></a>

S3 バケットにテキストファイルをアップロードします。このテキストファイルには、このチュートリアルの後半で大文字に変換する元のデータが含まれています。

例えば、次のテキストが含まれている `tutorial.txt` ファイルをアップロードできます。

```
Amazon S3 Object Lambda Tutorial:
You can add your own code to process data retrieved from S3 before 
returning it to an application.
```

**バケットにファイルをアップロードするには**

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

1. 左側のナビゲーションペインで、[**バケット**] を選択します。

1. **[バケット]** リストで、[ステップ 1](#ol-upper-step1) で作成したバケットの名前を選択し (**tutorial-bucket** など)、ファイルをアップロードします。

1. バケットの **[オブジェクト]** タブで、**[アップロード]** を選択します。

1. [**アップロード**] ページの [**ファイルとフォルダ**] の下で、[**ファイルを追加**] を選択します。

1. アップロードするファイルを選択し、続いて **[オープン]** を選択します。例えば、前述した `tutorial.txt` ファイルの例をアップロードできます。

1. **アップロード** を選択します。

## ステップ 3: S3 アクセスポイントの作成
<a name="ol-upper-step3"></a>

S3 Object Lambda アクセスポイントを使用して元のデータにアクセスし、変換するには、S3 アクセスポイントを作成し、[ステップ 1](#ol-upper-step1) で作成した S3 バケットに関連付けます。アクセスポイントは、変換するオブジェクトと同じ AWS リージョン に存在する必要があります。

このチュートリアルの後半では、このアクセスポイントを Object Lambda アクセスポイントのサポートアクセスポイントとして使用します。

**アクセスポイントを作成するには**

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

1. 左のナビゲーションペインで、[**アクセスポイント**] を選択します。

1. [**アクセスポイント**] ページで、[**アクセスポイントの作成**] を選択します。

1. **[アクセスポイント名]** フィールドに、アクセスポイントの名前を入力します (**tutorial-access-point** など)。

   アクセスポイントの名前付けの詳細については、「[アクセスポイントの命名規則](access-points-restrictions-limitations-naming-rules.md#access-points-names)」を参照してください。

1. **[データソース]** フィールドに、[ステップ 1](#ol-upper-step1) で作成したバケットの名前を入力します (**tutorial-bucket** など)。S3 は、アクセスポイントをこのバケットにアタッチします。

   (オプション) **[S3 を参照]** を選択して、アカウント内のバケットを参照および検索できます。**[S3 を参照]** を選択した場合は、目的のバケットを選択し、**[パスの選択]** を選択して、**[バケット名]** フィールドにバケットの名前を入力します。

1. [**ネットワークオリジン**] で、[**インターネット**] を選択します。

   アクセスポイントのネットワークオリジンの詳細については、「[Virtual Private Cloud に制限されたアクセスポイントの作成](access-points-vpc.md)」を参照してください。

1. デフォルトでは、アクセスポイントに対してすべてのブロックパブリックアクセス設定が有効になります。**パブリックアクセスブロック設定**は、*すべて*を有効にしておくことを推奨します。

   詳細については、「[汎用バケットのアクセスポイントへのパブリックアクセスの管理](access-points-bpa-settings.md)」を参照してください。

1. その他のすべてのアクセスポイント設定で、デフォルトの設定を保持します。

   (オプション) アクセスポイントの設定は、ユースケースをサポートするように変更できます。このチュートリアルでは、デフォルトの設定を保持することをお勧めします。

   (オプション) アクセスポイントへのアクセスを管理する必要がある場合は、アクセスポイントポリシーを指定できます。詳細については、「[アクセスポイントのポリシーの例](access-points-policies.md#access-points-policy-examples)」を参照してください。

1. **[アクセスポイントを作成]** を選択します。

## ステップ 4: Lambda 関数を作成する
<a name="ol-upper-step4"></a>

元のデータを変換するには、S3 Object Lambda アクセスポイントで使用する Lambda 関数を作成します。

**Topics**
+ [Lambda 関数コードを記述し、仮想環境でデプロイパッケージを作成する](#ol-upper-step4-write-lambda)
+ [実行ロールを使用した Lambda 関数の作成 (コンソール)](#ol-upper-step4-create-function)
+ [.zip ファイルアーカイブを使用して Lambda 関数コードをデプロイし、Lambda 関数を設定 (コンソール)](#ol-upper-step4-deploy-function)

### Lambda 関数コードを記述し、仮想環境でデプロイパッケージを作成する
<a name="ol-upper-step4-write-lambda"></a>

1. ローカルマシンで、このチュートリアルの後半で使用する仮想環境に対して、フォルダ名が `object-lambda` であるフォルダを作成します。

1. `object-lambda` フォルダで、元のオブジェクトのすべてのテキストを大文字に変更する Lambda 関数を含むファイルを作成します。例えば、Python で記述された次の関数を使用できます。この関数は、`transform.py` という名前のファイルに保存してください。

   ```
   import boto3
   import requests
   from botocore.config import Config
   
   # This function capitalizes all text in the original object
   def lambda_handler(event, context):
       object_context = event["getObjectContext"]
       # Get the presigned URL to fetch the requested original object 
       # from S3
       s3_url = object_context["inputS3Url"]
       # Extract the route and request token from the input context
       request_route = object_context["outputRoute"]
       request_token = object_context["outputToken"]
       
       # Get the original S3 object using the presigned URL
       response = requests.get(s3_url)
       original_object = response.content.decode("utf-8")
   
       # Transform all text in the original object to uppercase
       # You can replace it with your custom code based on your use case
       transformed_object = original_object.upper()
   
       # Write object back to S3 Object Lambda
       s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
       # The WriteGetObjectResponse API sends the transformed data
       # back to S3 Object Lambda and then to the user
       s3.write_get_object_response(
           Body=transformed_object,
           RequestRoute=request_route,
           RequestToken=request_token)
   
       # Exit the Lambda function: return the status code  
       return {'status_code': 200}
   ```
**注記**  
前述の例の Lambda 関数は、リクエストされたオブジェクト全体をメモリにロードしてから、変換してクライアントに返します。または、オブジェクト全体をメモリにロードしないようにするために、S3 からオブジェクトをストリーミングすることもできます。この方法は、大きなオブジェクトを扱うときに役立ちます。Object Lambda アクセスポイントを使用したレスポンスのストリーミングの詳細については、[Lambdaでの `GetObject` リクエストの処理](olap-writing-lambda.md#olap-getobject-response) にあるストリーミングの例を参照してください。

   S3 Object Lambda アクセスポイントで使用する Lambda 関数を記述する場合、この関数は S3 Object Lambda が Lambda 関数に提供する入力イベントコンテキストに基づいています。イベントコンテキストは、S3 Object Lambda から Lambda に渡されたイベントで行われたリクエストに関する情報を提供します。これには、Lambda 関数の作成に使用するパラメータが含まれています。

   前述の Lambda 関数の作成に使用されるフィールドは次のとおりです。

   `getObjectContext` のフィールドは、Amazon S3 および S3 Object Lambda への接続に関する入力および出力の詳細を意味します。以下のフィールドがあります。
   + `inputS3Url` – Lambda 関数がサポートするアクセスポイントから元のオブジェクトをダウンロードするために使用できる署名付き URL です。Lambda 関数は、署名付き URL を使用することにより、元のオブジェクトを取得するために Amazon S3 の読み取り許可を必要とせず、呼び出しごとに処理されたオブジェクトにのみアクセスできます。
   + `outputRoute` – Lambda 関数が変換したオブジェクトを戻すために `WriteGetObjectResponse` を呼び出すときに S3 Object Lambda URL に追加されるルーティングトークン。
   + `outputToken` – 変換されたオブジェクトを送り返すときに、`WriteGetObjectResponse` 呼び出しを元の呼び出し元と照合するために S3 Object Lambda によって使用されるトークンです。

   イベントコンテキスト内のすべてのフィールドの詳細については、「[イベントコンテキストの形式と使用法](olap-event-context.md) および [S3 Object Lambda アクセスポイントの Lambda 関数の記述](olap-writing-lambda.md)」を参照してください。

1. ローカルターミナルで次のコマンドを入力し、`virtualenv` パッケージをインストールします。

   ```
   python -m pip install virtualenv
   ```

1. ローカルターミナルで、前に作成した `object-lambda` フォルダを開き、次のコマンドを入力して、`venv` という名前の仮想環境を作成し、初期化します。

   ```
   python -m virtualenv venv
   ```

1. 仮想環境をアクティブ化するには、次のコマンドを入力して環境のフォルダから `activate` ファイルを実行します。

   **macOS ユーザー**の場合は、このコマンドを実行します。

   ```
   source venv/bin/activate
   ```

   **Windows ユーザー**の場合は、このコマンドを実行します。

   ```
   .\venv\Scripts\activate
   ```

   ここで、コマンドプロンプトが変わり、仮想環境がアクティブであることを示す **(venv)** が表示されます。

1. 必要なライブラリをインストールするには、`venv` 仮想環境で、以下のコマンドを行単位で実行します。

   これらのコマンドは、`lambda_handler` Lambda 関数の依存関係の更新バージョンをインストールします。これらの依存関係は、AWS SDK for Python (Boto3) とリクエストモジュールです。

   ```
   pip3 install boto3
   ```

   ```
   pip3 install requests
   ```

1. 仮想環境を無効にするには、次のコマンドを実行します。

   ```
   deactivate
   ```

1. インストール済みライブラリを含むデプロイパッケージを `object-lambda` ディレクトリのルートにある `lambda.zip` という名前の `.zip` ファイルで作成し、以下のコマンドをローカルターミナルで行単位で実行します。
**ヒント**  
以下のコマンドは、特定の環境で動作するように調整する必要がある場合があります。例えば、ライブラリは `site-packages` または `dist-packages` であり、最初のフォルダは`lib` または `lib64` です。また、`python` フォルダには、別の Python バージョンで名前が付けられている可能性があります。特定のパッケージを見つけるには、`pip show` コマンドを使用します。

   **macOS ユーザー**の場合は、このコマンドを実行します。

   ```
   cd venv/lib/python3.8/site-packages 
   ```

   ```
   zip -r ../../../../lambda.zip .
   ```

   **Windows ユーザー**の場合は、このコマンドを実行します。

   ```
   cd .\venv\Lib\site-packages\ 
   ```

   ```
   powershell Compress-Archive * ../../../lambda.zip
   ```

   最後のコマンドは、デプロイメントパッケージを `object-lambda` ディレクトリのルートに保存します。

1. デプロイパッケージのルートに関数コードファイル `transform.py` を追加します。

   **macOS ユーザー**の場合は、このコマンドを実行します。

   ```
   cd ../../../../ 
   ```

   ```
   zip -g lambda.zip transform.py
   ```

   **Windows ユーザー**の場合は、このコマンドを実行します。

   ```
   cd ..\..\..\
   ```

   ```
   powershell Compress-Archive -update transform.py lambda.zip
   ```

   このステップを完了すると、以下のようなディレクトリ構造になります。

   ```
   lambda.zip$
     │ transform.py
     │ __pycache__
     | boto3/
     │ certifi/
     │ pip/
     │ requests/
     ...
   ```

### 実行ロールを使用した Lambda 関数の作成 (コンソール)
<a name="ol-upper-step4-create-function"></a>

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

   

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

1. **関数の作成** を選択します。

1. **Author from scratch** を選択します。

1. **基本的な情報** で、以下の作業を行います。

   1. **[関数名]** に「**tutorial-object-lambda-function**」と入力します。

   1. [**ランタイム**] で、**Python 3.8** またはそれ以降のバージョンを選択します。

1. [**デフォルト実行ロールの変更**] セクションを展開します。[**実行ロール**] で、[**基本的な Lambda 許可で新しいロールを作成**] を選択します。

   このチュートリアルの[ステップ 5](#ol-upper-step5) で、**AmazonS3ObjectLambdaExecutionRolePolicy** をこの Lambda 関数の実行ロールにアタッチします。

1. 残りの設定はデフォルト値のままにしておきます。

1. [**関数の作成**] を選択してください。

### .zip ファイルアーカイブを使用して Lambda 関数コードをデプロイし、Lambda 関数を設定 (コンソール)
<a name="ol-upper-step4-deploy-function"></a>

1. AWS Lambda コンソール ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) で、左のナビゲーションペインの**関数**を選択します。

1. 前に作成した Lambda 関数を選択します (例、**tutorial-object-lambda-function**)。

1. Lambda 関数の詳細ページで、[**コード**] を選択します。[**コードソース**] セクションで、[**からアップロード**]、[**.zip ファイル**] の順に選択します。

1. [**アップロード**] を選択して、ローカルの `.zip` ファイルを選択します。

1. 前に作成した `lambda.zip` ファイルを選択し、[**開く**] を選択します。

1. **[保存]** を選択します。

1. [**ランタイム設定**] セクションで、[**編集**] を選択します。

1. [**ランタイム設定の編集**] ページで、**ランタイム**が **Python 3.8** またはそれ以降のバージョンに設定されていることを確認します。

1. Lambda ランタイムに Lambda 関数コード内のどのハンドラメソッドを呼び出すかを指示するには、[**ハンドラー**] に **transform.lambda\$1handler** を入力します。

   Python で関数を設定するとき、ハンドラー設定の値は、ファイル名と、ハンドラーモジュールの名前を、ドットで区切ったものになります。例えば、`transform.lambda_handler` は、`transform.py` ファイルで定義された `lambda_handler` メソッドを呼び出します。

1. **[保存]** を選択します。

1. (オプション) Lambda 関数の詳細ページで、[**設定**] タブを選択します。左のナビゲーションペインで、[**一般的な設定**] を選択してから、[**編集**] を選択します。[**タイムアウト**] フィールドに、**1** 分 **0** 秒と入力します。残りの設定はデフォルト値のままにして、[**保存**] を選択します。

   **タイムアウト**は、Lambda で関数が停止するまでに許可される実行時間の長さです。デフォルト値は 3 秒です。S3 Object Lambda によって使用される Lambda 関数の最大持続時間は 60 秒です。料金は、設定されたメモリの量とコードの実行時間に基づいて請求されます。

## ステップ 5: Lambda 関数の実行ロールの IAM ポリシーを設定する
<a name="ol-upper-step5"></a>

Lambda 関数がカスタマイズされたデータと応答ヘッダーを `GetObject` 呼び出し元に提供できるようにするには、Lambda 関数の実行ロールに `WriteGetObjectResponse` API を呼び出すための IAM 許可が必要です。

**IAM ポリシーを Lambda 関数ロールにアタッチするには**



1. AWS Lambda コンソール ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) で、左のナビゲーションペインの**関数**を選択します。

1. [ステップ 4](#ol-upper-step4) で作成した関数 (たとえば、**tutorial-object-lambda-function**) を選択します。

1. Lambda 関数の詳細ページで、[**設定**] タブを選択してから、左のナビゲーションペインの [**許可**] を選択します。

1. [**実行ロール**] で、[**ロール名**] のリンクを選択します。IAM コンソールが開きます。

1. Lambda 関数の実行ロールの IAM コンソールの **[Summary]** (概要) ページで、**[Permissions]** (許可) タブを選択します。**[Add Permissions]** (許可を追加) メニューから **[Attach policies]** (ポリシーを添付) を選択します。

1. [**許可のアタッチ**] ページで、[検索] ボックスに **AmazonS3ObjectLambdaExecutionRolePolicy** を入力して、ポリシーのリストをフィルタリングします。**AmazonS3ObjectLambdaExecutionRolePolicy** ポリシーの名前の横にあるチェックボックスを選択します。

1. **ポリシーのアタッチ** を選択します。

## ステップ 6: Object Lambda アクセスポイントの作成
<a name="ol-upper-step6"></a>

S3 Object Lambda アクセスポイントは、S3 GET リクエストから Lambda 関数を直接呼び出す柔軟性を提供し、関数が S3 アクセスポイントから取得したデータを処理できるようにします。S3 Object Lambda アクセスポイントを作成および設定するときは、Lambda が使用するカスタムパラメータとして JSON 形式のイベントコンテキストを呼び出し、提供する Lambda 関数を指定する必要があります。

**S3 Object Lambda アクセスポイントを作成するには**

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

1. 左のナビゲーションペインで、[**Object Lambda アクセスポイント**] を選択します。

1. [**Object Lambda アクセスポイント**] ページで、[**Object Lambda アクセスポイントの作成**] を選択します。

1. **Object Lambda アクセスポイント名**] に、Object Lambda アクセスポイントに使用する名前を入力します (例、**tutorial-object-lambda-accesspoint**)。

1. **[サポートするアクセスポイント]** で、[ステップ 3](#ol-upper-step3) で作成した標準アクセスポイントを入力または参照します (**tutorial-access-point** など)。次に、**[サポートするアクセスポイントの選択]** を選択します。

1. **S3 API** の場合、Lambda 関数が処理する S3 バケットからオブジェクトを取得するには、**[GetObject]** を選択します。

1. **[Lambda 関数の呼び出し]** では、このチュートリアルでは、次の 2 つのオプションのいずれかを選択できます。
   + **[アカウントの関数から選択]** を選択し、**[Lambda 関数]** ドロップダウンリストから、[ステップ 4](#ol-upper-step4) (例、**tutorial-object-lambda-function**) で作成したLambda 関数を選択します。
   + [**ARN を入力**] を選択し、[ステップ 4](#ol-upper-step4) で作成した Lambda 関数の Amazon リソースネーム (ARN) を入力します。

1. [**Lambda 関数のバージョン**] で、**\$1LATEST** ([ステップ 4](#ol-upper-step4) で作成した Lambda 関数の最新バージョン) を選択します。

1. (オプション) Lambda 関数で、範囲とパート番号によって GET リクエストを認識および処理する必要がある場合は、[**Lambda 関数は、範囲を使用してリクエストをサポート**] および [**Lambda 関数は、パート番号を使用してリクエストをサポート**] を選択します。それ以外の場合は、これらの 2 つのチェックボックスをオフにします。

   S3 Object Lambda で範囲またはパート番号を使用する方法の詳細については、「[Range および partNumber ヘッダーの操作](range-get-olap.md)」を参照してください。

1. (オプション) [**ペイロード - *オプション***] で JSON テキストを追加して、Lambda 関数に追加情報を提供します。

   ペイロードは、特定の S3 Object Lambda アクセスポイントからのすべての呼び出しに対する入力として、Lambda 関数に提供できるオプションの JSON テキストです。同じ Lambda 関数を呼び出す複数の Object Lambda アクセスポイントの動作をカスタマイズして、異なるパラメータを使用してペイロードを設定できます。これにより、Lambda 関数の柔軟性が向上します。

   ペイロードの詳細については、「[イベントコンテキストの形式と使用法](olap-event-context.md)」を参照してください。

1. (オプション) **[リクエストメトリクス - *オプション*]** で、**[無効]** または **[有効]** を選択して、Amazon S3 モニタリングを Object Lambda アクセスポイントに追加します。リクエストメトリクスには、Amazon CloudWatch の標準料金が課金されます。詳細については、「[CloudWatch 料金表](https://aws.amazon.com/cloudwatch/pricing/)」を参照してください。

1. [**Object Lambda アクセスポイントポリシー-*オプション***] で、デフォルトの設定を保持します。

   (オプション) リソースポリシーを設定できます。このリソースポリシーは、指定された Object Lambda アクセスポイントを使用する `GetObject` API 許可を付与します。

1. 残りの設定はデフォルト値のままにしておき、[**Object Lambda アクセスポイントの作成**] を選択します。

## ステップ 7: 変換されたデータを表示する
<a name="ol-upper-step7"></a>

これで、S3 Object Lambda は、ユースケースに合わせてデータを変換する準備が整いました。このチュートリアルでは、S3 Object Lambda はオブジェクト内のすべてのテキストを大文字に変換します。

**Topics**
+ [S3 Object Lambda アクセスポイントの変換済みデータの表示](#ol-upper-step7-check-data)
+ [Python スクリプトを実行して、元のデータと変換されたデータを出力する](#ol-upper-step7-python-print)

### S3 Object Lambda アクセスポイントの変換済みデータの表示
<a name="ol-upper-step7-check-data"></a>

S3 Object Lambda アクセスポイントを使用してファイルの取得をリクエストすると、S3 Object Lambda への `GetObject` API 呼び出しが行われます。S3 Object Lambda は Lambda 関数を呼び出してデータを変換し、変換されたデータを標準 S3 `GetObject` API への応答として返します。

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

1. 左のナビゲーションペインで、[**Object Lambda アクセスポイント**] を選択します。

1. [**Object Lambda アクセスポイント**] ページで、[ステップ 6](#ol-upper-step6) で作成した S3 Object Lambda アクセスポイントを選択します (例、**tutorial-object-lambda-accesspoint**)。

1. S3 Object Lambda アクセスポイントの [**オブジェクト**] タブで、[ステップ 2](#ol-upper-step2) で S3 バケットにアップロードしたファイルと同じ名前のファイルを選択します(例、`tutorial.txt`)。

   このファイルには、変換されたすべてのデータが含まれているはずです。

1. 変換されたデータを表示するには、[**開く**] または [**ダウンロード**] を選択します。

### Python スクリプトを実行して、元のデータと変換されたデータを出力する
<a name="ol-upper-step7-python-print"></a>

S3 Object Lambda は、既存のアプリケーションで使用できます。これを行うには、アプリケーション設定を更新して、[ステップ 6](#ol-upper-step6) で、S3 からのデータを作成した新しい S3 Object Lambda アクセスポイント ARN を使用してデータを取得します。

次の Python スクリプトの例では、S3 バケットからの元のデータと S3 Object Lambda アクセスポイントからの変換されたデータの両方を出力します。

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

1. 左のナビゲーションペインで、[**Object Lambda アクセスポイント**] を選択します。

1. [**Object Lambda アクセスポイント**] ページで、[ステップ 6](#ol-upper-step6) で作成した S3 Object Lambda アクセスポイントの左にあるラジオブタンを選択します (例、**tutorial-object-lambda-accesspoint**)。

1. [**ARN のコピー**] を選択します。

1. 後で使用するために ARN を保存します。

1. ローカルマシンで Python スクリプトを記述して、S3 バケットからの元のデータ (例えば、`tutorial.txt`) と S3 Object Lambda アクセスポイントからの変換されたデータ (例えば、`tutorial.txt`) の両方を出力します。次のサンプルスクリプトを使用できます。

   ```
   import boto3
   from botocore.config import Config
   
   s3 = boto3.client('s3', config=Config(signature_version='s3v4'))
   
   def getObject(bucket, key):
       objectBody = s3.get_object(Bucket = bucket, Key = key)
       print(objectBody["Body"].read().decode("utf-8"))
       print("\n")
   
   print('Original object from the S3 bucket:')
   # Replace the two input parameters of getObject() below with 
   # the S3 bucket name that you created in Step 1 and 
   # the name of the file that you uploaded to the S3 bucket in Step 2
   getObject("tutorial-bucket", 
             "tutorial.txt")
   
   print('Object transformed by S3 Object Lambda:')
   # Replace the two input parameters of getObject() below with 
   # the ARN of your S3 Object Lambda Access Point that you saved earlier and
   # the name of the file with the transformed data (which in this case is
   # the same as the name of the file that you uploaded to the S3 bucket 
   # in Step 2)
   getObject("arn:aws:s3-object-lambda:us-west-2:111122223333:accesspoint/tutorial-object-lambda-accesspoint",
             "tutorial.txt")
   ```

1. Python スクリプトにカスタム名 (`tutorial_print.py` など) を付けて、[ステップ 4](#ol-upper-step4) でローカルマシンに作成したフォルダ (`object-lambda` など) に保存します。

1. ローカルターミナルで、[ステップ 4](#ol-upper-step4) で作成したディレクトリ　 (例えば、`object-lambda`) のルートから次のコマンドを実行します。

   ```
   python3 tutorial_print.py
   ```

   元のデータと変換されたデータ(すべて大文字)の両方がターミナルに表示されます。例えば、次のようなテキストが表示されます。

   ```
   Original object from the S3 bucket:
   Amazon S3 Object Lambda Tutorial:
   You can add your own code to process data retrieved from S3 before 
   returning it to an application.
   
   Object transformed by S3 Object Lambda:
   AMAZON S3 OBJECT LAMBDA TUTORIAL:
   YOU CAN ADD YOUR OWN CODE TO PROCESS DATA RETRIEVED FROM S3 BEFORE 
   RETURNING IT TO AN APPLICATION.
   ```

## ステップ 8: クリーンアップする
<a name="ol-upper-step8"></a>

学習のためだけに S3 Object Lambda によってデータを変換した場合は、割り当てた AWS リソースを削除して、料金が発生しないようにします。

**Topics**
+ [Object Lambda アクセスポイントの削除](#ol-upper-step8-delete-olap)
+ [S3 アクセスポイントを削除する](#ol-upper-step8-delete-ap)
+ [Lambda 関数の実行ロールを削除する](#ol-upper-step8-delete-lambda-role)
+ [Lambda 関数を削除する](#ol-upper-step8-delete-lambda-function)
+ [CloudWatch Logs グループを削除する](#ol-upper-step8-delete-cloudwatch)
+ [S3 ソースバケットの元のファイルを削除する](#ol-upper-step8-delete-file)
+ [S3 ソースバケットを削除する](#ol-upper-step8-delete-bucket)
+ [IAM ユーザーを削除する](#ol-upper-step8-delete-user)

### Object Lambda アクセスポイントの削除
<a name="ol-upper-step8-delete-olap"></a>

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

1. 左のナビゲーションペインで、[**Object Lambda アクセスポイント**] を選択します。

1. [**Object Lambda アクセスポイント**] ページで、[ステップ 6](#ol-upper-step6) で作成した S3 Object Lambda アクセスポイントの左にあるラジオブタンを選択します (例、**tutorial-object-lambda-accesspoint**)。

1. **[削除]** を選択します。

1. 表示されるテキストフィールドにアクセスポイントの名前を入力して、[**削除**] を選択し、bject Lambda アクセスポイントを削除することを確認します。

### S3 アクセスポイントを削除する
<a name="ol-upper-step8-delete-ap"></a>

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

1. 左のナビゲーションペインで、[**アクセスポイント**] を選択します。

1. [ステップ 3](#ol-upper-step3) で作成したアクセスポイントに移動し (例、**tutorial-access-point**)、アクセスポイントの名前の横にあるラジオボタンを選択します。

1. **[削除]** を選択します。

1. 表示されるテキストフィールドにアクセスポイントの名前を入力して、アクセスポイントを削除することを確認し、[**削除**] を選択します。

### Lambda 関数の実行ロールを削除する
<a name="ol-upper-step8-delete-lambda-role"></a>

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

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

1. [ステップ 4](#ol-upper-step4) で作成した関数 (例、**tutorial-object-lambda-function**) を選択します。

1. Lambda 関数の詳細ページで、[**設定**] タブを選択してから、左のナビゲーションペインの [**許可**] を選択します。

1. [**実行ロール**] で、[**ロール名**] のリンクを選択します。IAM コンソールが開きます。

1. Lambda 関数の実行ロールの IAM コンソールの [**概要**] ページで、[**ロールの削除**] を選択します。

1. **ロールの削除**ダイアログボックスで、[**はい、削除します**] をクリックします。

### Lambda 関数を削除する
<a name="ol-upper-step8-delete-lambda-function"></a>

1. AWS Lambda コンソール ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) で、左のナビゲーションペインの**関数**を選択します。

1. [ステップ 4](#ol-upper-step4) で作成した関数名の左にあるチェックボックスを選択します (例、**tutorial-object-lambda-function**)。

1. **[アクション]**、**[削除]** の順に選択します。

1. **[関数の削除]** ダイアログボックスで、**[削除]** を選択します。

### CloudWatch Logs グループを削除する
<a name="ol-upper-step8-delete-cloudwatch"></a>

1. CloudWatch コンソールの [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) を開いてください。

1. 左側のナビゲーションペインで、**[ロググループ]** をクリックします。

1. [ステップ 4](#ol-upper-step4) で作成した Lambda 関数で終わる名前のロググループを検索します(例、**tutorial-object-lambda-function**)。

1. ロググループの名前の左にあるチェックボックスを選択します。

1. [**アクション**] を選択してから、[**ロググループの削除**] を選択します。

1. **[ロググループの削除]** ダイアログボックスで、**[削除]** をクリックします。

### S3 ソースバケットの元のファイルを削除する
<a name="ol-upper-step8-delete-file"></a>

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

1. 左側のナビゲーションペインで、[**バケット**] を選択します。

1. **バケット名**] リストで、[ステップ 2](#ol-upper-step2) で元のファイルをアップロードしたバケットの名前を選択します(例、**tutorial-bucket**)。

1. 削除するオブジェクトの名前の左にあるチェックボックスを選択します (例、`tutorial.txt`)。

1. **[削除]** を選択します。

1. [**オブジェクトの削除**] ページの [**オブジェクトを完全に削除しますか?**] セクションで、テキストボックスに「**permanently delete**」と入力して、このオブジェクトを削除することを確認します。

1. **オブジェクトの削除** を選択します。

### S3 ソースバケットを削除する
<a name="ol-upper-step8-delete-bucket"></a>

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

1. 左側のナビゲーションペインで、[**バケット**] を選択します。

1. [**バケット**] リストで、[ステップ 1](#ol-upper-step1) で作成したバケットの名前の横にあるラジオボタンを選択します (例、**tutorial-bucket**)。

1. **[削除]** を選択します。

1. [**バケットを削除する**] ページで、テキストフィールドにバケット名を入力することでバケットを削除することを確認し、[**バケットを削除する**] を選択します。

### IAM ユーザーを削除する
<a name="ol-upper-step8-delete-user"></a>

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

1. 左のナビゲーションペインで、[**ユーザー**] を選択し、削除するユーザー名の横にあるチェックボックスを選択します。

1. ページの上部で、[**削除**] を選択します。

1. [***ユーザー名*を削除しますか?**] ダイアログボックスで、テキスト入力フィールドにユーザー名を入力し、ユーザーの削除を確認します。**[削除]** を選択します。

## 次のステップ
<a name="ol-upper-next-steps"></a>

このチュートリアルを完了すると、ユースケースの Lambda 関数をカスタマイズし、標準 S3 GET リクエストによって返されるデータを変更できます。

S3 Object Lambda の一般的なユースケースを以下に示します。
+ セキュリティとコンプライアンスのために機密データをマスキングします。

  詳細については、「[チュートリアル: S3 Object Lambda と Amazon Comprehend を使用した PII データの検出と編集](tutorial-s3-object-lambda-redact-pii.md)」を参照してください。
+ 特定の情報を配信するために、特定のデータ行をフィルタリングします。
+ 他のサービスやデータベースからの情報でデータ強化します。
+ アプリケーション互換性のために XML から JSON への変換など、データ形式間の変換を行います。
+ ダウンロード中のファイルを圧縮または解凍します。
+ 画像のサイズ変更とウォーターマークを行います。

  詳細については、「[チュートリアル: S3 Object Lambda を使用して、取得時に画像に動的に透かしを入れる](https://aws.amazon.com/getting-started/hands-on/amazon-s3-object-lambda-to-dynamically-watermark-images/?ref=docs_gateway/amazons3/tutorial-s3-object-lambda-uppercase.html)」を参照してください。
+ データにアクセスするためのカスタム承認規則を実装します。

S3 Object Lambda, の詳細については、「[S3 Object Lambda を使用したオブジェクトの変換](transforming-objects.md)」を参照してください。