チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する - AWS Lambda

チュートリアル: Amazon S3 トリガーを使用してサムネイル画像を作成する

このチュートリアルでは、Lambda 関数を作成し、Amazon Simple Storage Service (Amazon S3) のトリガーを設定します。Amazon S3 は、S3 バケットにアップロードされる各画像ファイルの CreateThumbnail 関数を呼び出します。この関数は、ソース S3 バケットからイメージオブジェクトを読み取り、ターゲットの S3 バケットに保存するサムネイルイメージを作成します。

注記

このチュートリアルでは、AWS と Lambda ドメインに関する中級レベルの知識が必要です。最初に チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す を試すことをお勧めします。

このチュートリアルでは、AWS Command Line Interface (AWS CLI) を使用して次の AWS リソースを作成します。

Lambda リソース

  • Lambda 関数。関数コードには、Node.js、Python、または Java を選択できます。

  • 関数の .zip ファイルアーカイブデプロイパッケージ。

  • 関数を呼び出すための Amazon S3 アクセス許可を付与するアクセスポリシー。

AWS Identity and Access Management (IAM) リソース

  • 関数に必要なアクセス許可を付与するためのアクセス許可ポリシーが関連付けられている実行ロール。

Amazon S3 のリソース

  • 関数を呼び出す通知設定を持つソース S3 バケット。

  • 関数がサイズ変更された画像を保存するターゲット S3 バケット。

Prerequisites

  • AWS アカウント

    Lambda および他の AWS のサービスを使用するには、AWS アカウントが必要です。アカウントをお持ちでない場合は、aws.amazon.com にアクセスし、[Create an AWS Account] (アカウントを作成する) を選択します。この手順については、「How do I create and activate a new AWS account? (新規アカウントを作成してアクティベートする方法を教えてください)」を参照してください。

  • コマンドライン

    次のステップを完了するには、コマンドを実行するコマンドラインターミナルまたはシェルが必要です。コマンドと予想される出力は、別々のブロックにリストされます。

    aws --version

    次のような出力が表示されます。

    aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

    コマンドが長い場合、コマンドを複数行に分割するためにエスケープ文字 (\) が使用されます。

    Linux および macOS では、任意のシェルとパッケージマネージャーを使用します。Windows 10 では、Linux 用の Windows サブシステムをインストールして、Windows 統合バージョンの Ubuntu および Bash を入手できます。

  • AWS CLI

    このチュートリアルでは、AWS CLI コマンドを使用して Lambda 関数を作成し、呼び出します。AWS CLI をインストールしAWS 認証情報を使用して設定します

  • 言語ツール

    使用する言語 (Node.js、Python、または Java) の言語サポートツールとパッケージマネージャーをインストールします。推奨されるツールについては、「コード作成ツール」を参照してください。

ステップ 1. S3 バケットを作成しサンプルオブジェクトをアップロードする

S3 バケットを作成し、オブジェクトをアップロードするには、以下の手順を実行します。

  1. Amazon S3 コンソールを開きます。

  2. 2 つの S3 バケットを作成します。ターゲットバケットを source-resized と名前を付ける必要があります。ここで、ソースはソースバケットの名前です。例えば、mybucket という名前のソースバケットと、mybucket-resized という名前のターゲットバケットなどです。

  3. ソースバケットで、.jpg オブジェクト (例: HappyFace.jpg) をアップロードします。

    Lambda 関数をテストする前に、このサンプルオブジェクトを作成する必要があります。Lambda invoke コマンドを使用して関数を手動でテストする場合、サンプルイベントデータを、ソースバケット名を指定する関数に渡し、HappyFace.jpg を新しく作成されたオブジェクトとして渡します。

ステップ 2. IAM ポリシーの作成

Lambda 関数のアクセス権限を定義する IAM ポリシーを作成します。関数には、次のアクセス許可が必要です。

  • ソース S3 バケットからオブジェクトを取得します。

  • サイズ変更されたオブジェクトをターゲット S3 バケットに入れます。

  • Amazon CloudWatch Logs への書き込みログ

IAM ポリシーを作成するには

  1. IAM コンソールのポリシーのページを開きます。

  2. [Create policy] を選択します。

  3. [JSON] タブを選択し、以下のポリシーを貼り付けます。mybucket は、以前に作成したソースバケットの名前に置き換えてください。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogGroup", "logs:CreateLogStream" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": "arn:aws:s3:::mybucket/*" }, { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::mybucket-resized/*" } ] }
  4. [次へ: タグ] を選択します。

  5. [Next: Review] を選択します。

  6. [ポリシーの確認] の [名前] に、AWSLambdaS3Policy と入力します。

  7. [Create policy] を選択します。

ステップ 3. 実行ロールを作成する

AWS リソースにアクセスするためのアクセス権限をLambda 関数に付与する実行ロールを作成します。

実行ロールを作成するには

  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. [ロールの作成] を選択します。

  3. 次のプロパティでロールを作成します。

    • 信頼されたエンティティLambda

    • アクセス許可ポリシー - AWSLambdaS3Policy

    • ロール名lambda-s3-role

ステップ 4. 関数コードの作成

次のコード例では、Amazon S3 イベントにソース S3 バケット名とオブジェクトキー名が含まれています。オブジェクトが .jpg または .png イメージファイルの場合、ソースバケットからイメージを読み取り、サムネイルイメージを生成してから、ターゲットの S3 バケットにサムネイルを保存します。

次の点に注意してください。

  • コードは、ターゲットバケットが存在し、その名前がソースバケット名と -resized を連結したものであることを前提としています。

  • 作成された各サムネイルファイルについて、Lambda 関数コードはオブジェクトキー名を resized- とソースオブジェクトキー名の連結として導出します。例えば、ソースオブジェクトキー名が sample.jpg の場合、コードではキー resized-sample.jpg があるサムネイルオブジェクトが作成されます。

Node.js

以下のコード例を index.js という名前のファイルにコピーします。

例 index.js

// dependencies const AWS = require('aws-sdk'); const util = require('util'); const sharp = require('sharp'); // get reference to S3 client const s3 = new AWS.S3(); exports.handler = async (event, context, callback) => { // Read options from the event parameter. console.log("Reading options from event:\n", util.inspect(event, {depth: 5})); const srcBucket = event.Records[0].s3.bucket.name; // Object key may have spaces or unicode non-ASCII characters. const srcKey = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " ")); const dstBucket = srcBucket + "-resized"; const dstKey = "resized-" + srcKey; // Infer the image type from the file suffix. const typeMatch = srcKey.match(/\.([^.]*)$/); if (!typeMatch) { console.log("Could not determine the image type."); return; } // Check that the image type is supported const imageType = typeMatch[1].toLowerCase(); if (imageType != "jpg" && imageType != "png") { console.log(`Unsupported image type: ${imageType}`); return; } // Download the image from the S3 source bucket. try { const params = { Bucket: srcBucket, Key: srcKey }; var origimage = await s3.getObject(params).promise(); } catch (error) { console.log(error); return; } // set thumbnail width. Resize will set the height automatically to maintain aspect ratio. const width = 200; // Use the sharp module to resize the image and save in a buffer. try { var buffer = await sharp(origimage.Body).resize(width).toBuffer(); } catch (error) { console.log(error); return; } // Upload the thumbnail image to the destination bucket try { const destparams = { Bucket: dstBucket, Key: dstKey, Body: buffer, ContentType: "image" }; const putResult = await s3.putObject(destparams).promise(); } catch (error) { console.log(error); return; } console.log('Successfully resized ' + srcBucket + '/' + srcKey + ' and uploaded to ' + dstBucket + '/' + dstKey); };
Python

以下のコード例を lambda_function.py という名前のファイルにコピーします。

例 lambda_function.py

import boto3 import os import sys import uuid from urllib.parse import unquote_plus from PIL import Image import PIL.Image s3_client = boto3.client('s3') def resize_image(image_path, resized_path): with Image.open(image_path) as image: image.thumbnail(tuple(x / 2 for x in image.size)) image.save(resized_path) def lambda_handler(event, context): for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) tmpkey = key.replace('/', '') download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey) upload_path = '/tmp/resized-{}'.format(tmpkey) s3_client.download_file(bucket, key, download_path) resize_image(download_path, upload_path) s3_client.upload_file(upload_path, '{}-resized'.format(bucket), key)
Java

Java コードは、RequestHandler ライブラリで提供される aws-lambda-java-core インタフェースを実装します。Lambda 関数を作成するときは、クラスをハンドラ-として指定します (このコード例では、example.handler)。インターフェイスを使用したハンドラーの提供の詳細については、「ハンドラーのインターフェイス」を参照してください。

ハンドラーは、S3Event を入力タイプとして使用します。これは、関数コードが、受信 Amazon S3 イベントから情報を読み取るための便利なメソッドを提供します。Amazon S3 は、Lambda 関数を非同期的に呼び出します。戻り値の型を指定する必要があるインターフェイスを実装しているため、ハンドラーは戻り値の型として String を使用します。

以下のコード例を Handler.java という名前のファイルにコピーします。

例 Handler.java

package example; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.imageio.ImageIO; import com.amazonaws.AmazonServiceException; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; import com.amazonaws.services.lambda.runtime.events.S3Event; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.event.S3EventNotification.S3EventNotificationRecord; import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.AmazonS3ClientBuilder; public class Handler implements RequestHandler<S3Event, String> { private static final float MAX_WIDTH = 100; private static final float MAX_HEIGHT = 100; private final String JPG_TYPE = (String) "jpg"; private final String JPG_MIME = (String) "image/jpeg"; private final String PNG_TYPE = (String) "png"; private final String PNG_MIME = (String) "image/png"; public String handleRequest(S3Event s3event, Context context) { try { S3EventNotificationRecord record = s3event.getRecords().get(0); String srcBucket = record.getS3().getBucket().getName(); // Object key may have spaces or unicode non-ASCII characters. String srcKey = record.getS3().getObject().getUrlDecodedKey(); String dstBucket = srcBucket + "-resized"; String dstKey = "resized-" + srcKey; // Sanity check: validate that source and destination are different // buckets. if (srcBucket.equals(dstBucket)) { System.out .println("Destination bucket must not match source bucket."); return ""; } // Infer the image type. Matcher matcher = Pattern.compile(".*\\.([^\\.]*)").matcher(srcKey); if (!matcher.matches()) { System.out.println("Unable to infer image type for key " + srcKey); return ""; } String imageType = matcher.group(1); if (!(JPG_TYPE.equals(imageType)) && !(PNG_TYPE.equals(imageType))) { System.out.println("Skipping non-image " + srcKey); return ""; } // Download the image from S3 into a stream AmazonS3 s3Client = AmazonS3ClientBuilder.defaultClient(); S3Object s3Object = s3Client.getObject(new GetObjectRequest( srcBucket, srcKey)); InputStream objectData = s3Object.getObjectContent(); // Read the source image BufferedImage srcImage = ImageIO.read(objectData); int srcHeight = srcImage.getHeight(); int srcWidth = srcImage.getWidth(); // Infer the scaling factor to avoid stretching the image // unnaturally float scalingFactor = Math.min(MAX_WIDTH / srcWidth, MAX_HEIGHT / srcHeight); int width = (int) (scalingFactor * srcWidth); int height = (int) (scalingFactor * srcHeight); BufferedImage resizedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = resizedImage.createGraphics(); // Fill with white before applying semi-transparent (alpha) images g.setPaint(Color.white); g.fillRect(0, 0, width, height); // Simple bilinear resize g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.drawImage(srcImage, 0, 0, width, height, null); g.dispose(); // Re-encode image to target format ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(resizedImage, imageType, os); InputStream is = new ByteArrayInputStream(os.toByteArray()); // Set Content-Length and Content-Type ObjectMetadata meta = new ObjectMetadata(); meta.setContentLength(os.size()); if (JPG_TYPE.equals(imageType)) { meta.setContentType(JPG_MIME); } if (PNG_TYPE.equals(imageType)) { meta.setContentType(PNG_MIME); } // Uploading to S3 destination bucket System.out.println("Writing to: " + dstBucket + "/" + dstKey); try { s3Client.putObject(dstBucket, dstKey, is, meta); } catch(AmazonServiceException e) { System.err.println(e.getErrorMessage()); System.exit(1); } System.out.println("Successfully resized " + srcBucket + "/" + srcKey + " and uploaded to " + dstBucket + "/" + dstKey); return "Ok"; } catch (IOException e) { throw new RuntimeException(e); } } }

ステップ 5. デプロイパッケージの作成

デプロイパッケージは、Lambda 関数のコードとその依存関係を含む .zip ファイルアーカイブです。

Node.js

サンプル関数では、デプロイパッケージにシャープモジュールを含める必要があります。

デプロイパッケージを作成するには

  1. Linux 環境でコマンドラインターミナルまたはシェルを開きます。ローカル環境の Node.js バージョンが関数の Node.js バージョンと一致していることを確認します。

  2. 関数コードを index.js という名前のディレクトリに lambda-s3 として保存します。

  3. npm でシャープライブラリをインストールします。Linux の場合、次のコマンドを使用します。

    npm install sharp

    この手順の後、次のディレクトリ構造になります。

    lambda-s3 |- index.js |- /node_modules/sharp └ /node_modules/...
  4. 関数コードとその依存関係を含むデプロイパッケージを作成します。zip コマンドの -r (再帰的) オプションを設定して、サブフォルダを圧縮します。

    zip -r function.zip .
Python

Dependencies

デプロイパッケージを作成するには

  • --use-container オプション付きの AWS SAMCLI sam build コマンドを使用して、C または C++ で記述されたライブラリ (Pillow (PIL) ライブラリなど) を含むデプロイパッケージを作成することが推奨されます。

Java

Dependencies

  • aws-lambda-java-core

  • aws-lambda-java-events

  • aws-java-sdk

デプロイパッケージを作成するには

ステップ 6. Lambda 関数を作成する

関数を作成するには

  • create-function コマンドを使用して Lambda 関数を作成します。

    Node.js
    aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/lambda-s3-role

    AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。このオプションは、AWS CLI 設定ファイルで設定することもできます。

    create-function コマンドは、関数ハンドラーを index.handler として指定します。このハンドラー名は、関数名を handler として反映し、ハンドラーコードが保存されるファイルの名前を index.js として反映します。詳細については、「Node.js の AWS Lambda 関数ハンドラー」を参照してください。コマンドは、nodejs12.x のランタイムを指定します。詳細については、「Lambda ランタイム」を参照してください。

    Python
    aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler lambda_function.lambda_handler --runtime python3.8 \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/lambda-s3-role

    AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。このオプションは、AWS CLI 設定ファイルで設定することもできます。

    create-function コマンドは、関数ハンドラーを lambda_function.lambda_handler として指定します。このハンドラー名は、関数名を lambda_handler として反映し、ハンドラーコードが保存されるファイルの名前を lambda_function.py として反映します。詳細については、「Python の Lambda 関数ハンドラー」を参照してください。コマンドは、python3.8 のランタイムを指定します。詳細については、「Lambda ランタイム」を参照してください。

    Java
    aws lambda create-function --function-name CreateThumbnail \ --zip-file fileb://function.zip --handler example.handler --runtime java11 \ --timeout 10 --memory-size 1024 \ --role arn:aws:iam::123456789012:role/lambda-s3-role

    AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。このオプションは、AWS CLI 設定ファイルで設定することもできます。

    create-function コマンドは、関数ハンドラーを example.handler として指定します。この関数はハンドラーインタフェイスを実装するため、package.Class の省略形ハンドラー形式を使用できます。詳細については、「Java の AWS Lambda 関数ハンドラー」を参照してください。コマンドは、java11 のランタイムを指定します。詳細については、「Lambda ランタイム」を参照してください。

ロールパラメータについては、123456789012AWS アカウント ID に置き換えます。前の例のコマンドは、関数の設定として 10 秒のタイムアウト値を指定します。アップロードするオブジェクトのサイズに応じて、次の AWS CLI コマンドを使用してタイムアウトの値を増やす必要が生じる場合があります。

aws lambda update-function-configuration --function-name CreateThumbnail --timeout 30

ステップ 7. Lambda 関数をテストする

サンプルの Amazon S3 イベントデータを使用して手動で Lambda 関数を呼び出します。

Lambda 関数をテストするには

  1. 次の Amazon S3 サンプルイベントデータを、inputFile.txt という名前のファイルに保存します。sourcebucketHappyFace.jpg をそれぞれソース S3 バケット名と .jpg オブジェクトキーに置き換えてください。

    { "Records":[ { "eventVersion":"2.0", "eventSource":"aws:s3", "awsRegion":"us-west-2", "eventTime":"1970-01-01T00:00:00.000Z", "eventName":"ObjectCreated:Put", "userIdentity":{ "principalId":"AIDAJDPLRKLG7UEXAMPLE" }, "requestParameters":{ "sourceIPAddress":"127.0.0.1" }, "responseElements":{ "x-amz-request-id":"C3D13FE58DE4C810", "x-amz-id-2":"FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" }, "s3":{ "s3SchemaVersion":"1.0", "configurationId":"testConfigRule", "bucket":{ "name":"sourcebucket", "ownerIdentity":{ "principalId":"A3NL1KOZZKExample" }, "arn":"arn:aws:s3:::sourcebucket" }, "object":{ "key":"HappyFace.jpg", "size":1024, "eTag":"d41d8cd98f00b204e9800998ecf8427e", "versionId":"096fKKXTRTtl3on89fVO.nfljtsv6qko" } } } ] }
  2. 次の invoke コマンドを使用して関数を呼び出します。コマンドは非同期実行 (--invocation-type Event) をリクエストします。オプションで、RequestResponse パラメータ値として invocation-type を指定することで、関数を同期的に呼び出すことができます。

    aws lambda invoke --function-name CreateThumbnail \ --invocation-type Event \ --payload file://inputFile.txt outputfile.txt

    AWS CLI バージョン 2 を使用している場合、cli-binary-format オプションは必須です。このオプションは、AWS CLI 設定ファイルで設定することもできます。

  3. ターゲット S3 バケットでサムネイルが作成されたことを確認します。

ステップ 8. Amazon S3 を設定してイベントを発行する

Amazon S3 がオブジェクト作成イベントをLambda に公開して Lambda 関数を呼び出すように、設定を完成させます。このステップでは、次の作業を行います。

  • 関数のアクセスポリシーに、この関数の呼び出しを Amazon S3 に許可するアクセス許可を追加します。

  • 通知設定をソース S3 バケットに追加します。通知設定で、以下の項目を指定します。

    • Amazon S3 がイベントを発行するイベントタイプ。このチュートリアルでは、s3:ObjectCreated:* イベントタイプを指定し、オブジェクトが作成されたときに Amazon S3 がイベントを発行するようにします。

    • 呼び出す関数。

関数ポリシーにアクセス許可を追加するには

  1. 以下の add-permission コマンドを実行して、Amazon S3 サービスプリンシパル (s3.amazonaws.com) に lambda:InvokeFunction アクションを実行するためのアクセス許可を付与します。次の条件を満たす場合にのみ関数を呼び出すアクセス許可が Amazon S3 に付与されることに注意してください。

    • オブジェクト作成イベントが、特定の S3 バケットで検出されます。

    • S3 バケットはお客様の AWS アカウントによって所有されています。バケットを削除すると、別の AWS アカウントが同じ Amazon リソースネーム (ARN) でバケットを作成する可能性があります。

    aws lambda add-permission --function-name CreateThumbnail --principal s3.amazonaws.com \ --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::sourcebucket \ --source-account account-id
  2. get-policy コマンドを呼び出すことで、関数のアクセスポリシーを確認します。

    aws lambda get-policy --function-name CreateThumbnail

Amazon S3 に、オブジェクト作成イベントを Lambda に発行させるには、ソース S3 バケットに通知設定を追加します。

重要

この手順では、オブジェクトが S3 バケット内に作成されるたびに、関数を呼び出すようにバケットを設定します。このオプションは、ソースバケットでのみ設定してください。関数でソースバケットにオブジェクトを作成させないでください。そうしないと、関数自体がループ内で継続的に呼び出される可能性があります。

通知を設定するには

  1. Amazon S3 コンソールを開きます。

  2. ソース S3 バケットの名前を選択します。

  3. [プロパティ] タブを選択します。

  4. [イベント通知] で、[イベント通知の作成] を選択して、次のように通知を設定します。

    • イベント名lambda-trigger

    • イベントタイプAll object create events

    • 送信先Lambda function

    • Lambda 関数CreateThumbnail

イベント設定の詳細については、Amazon Simple Storage Service Console ユーザーガイドAmazon S3 コンソールを使用したイベント通知の有効化と設定を参照してください。

ステップ 9. S3 トリガーを使用してテストする

次のようにセットアップをテストします。

  1. Amazon S3 コンソールを使って、.jpg または .png オブジェクトをソース S3 バケットにアップロードします。

  2. CreateThumbnail Lambda 関数を使用して、イメージオブジェクトごとに、ターゲット S3 バケットにサムネイルが作成されていることを確認します。

  3. CloudWatch コンソールでのログの表示

ステップ 10. リソースのクリーンアップ

このチュートリアル用に作成したリソースは、保持を希望しない場合、すぐに削除できます。使用しなくなった AWS リソースを削除することで、AWS アカウントに請求される料金が発生しないようにできます。

Lambda 関数を削除するには

  1. Lambda コンソールの [Functions] (関数) ページを開きます。

  2. 作成した関数を選択します。

  3. [ Actions] で、[Delete ] を選択します。

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

作成したポリシーを削除する

  1. IAM コンソールの [Policies (ポリシー)] ページを開きます。

  2. 作成したポリシー (AWSLambdaS3Policy) を選択します。

  3. [ポリシーアクション]、[削除] の順に選択します。

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

実行ロールを削除するには

  1. IAM コンソールの [Roles (ロール)] ページを開きます。

  2. 作成した実行ロールを選択します。

  3. [ロールの削除] を選択します。

  4. [はい、削除します] を選択します。

S3 バケットを削除するには

  1. Amazon S3 コンソールを開きます。

  2. 作成したバケットを選択します。

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

  4. テキストボックスにバケットの名前を入力します。

  5. [Confirm] を選択します。