User:Lambdaでサイズを変更するよりも、ファイルをS3にアップロードするシステムの最良の設計は何ですか。 Assistant:サイズ変更ラムダ関数のトリガーを複数回防ぐために、オブジェクトキーに一意の識別子を使用して、サイズ機能をトリガーする前に存在するかどうかを確認できます。

ファイルをS3にアップロードし、ラムダ関数でサイズ変更するシステムの1つの設計があります。

ユーザーはファイルをS3にアップロードし、S3「Put」イベントをトリガーします。
S3イベントは、アップロードされたファイルの処理を担当するLambda関数（「コントローラー」機能と呼びましょう）を呼び出します。
コントローラー関数は、一意の識別子（タイムスタンプなど）を生成し、元のファイルキーに追加します。
コントローラー関数は、新しいキーを持つオブジェクトがS3に存在するかどうかを確認します。
オブジェクトが存在しない場合、コントローラー関数は、新しいキーを入力とともに、サイズ変更ラムダ関数（「リセイザー」関数と呼びましょう）をトリガーします。
Resizer関数はファイルを変更し、新しいキーの下にS3に保存します。
オブジェクトが既に存在する場合、コントローラー関数は終了し、リサイザー関数をトリガーしません。
この設計により、Resizer関数は一意のファイルごとに1回のみトリガーされ、サイズ変更されたファイルが一意のキーの下に保存されます。 
User:AWS Sam CLIコマンドとの方法を見せてください。
このセットアップのSAMテンプレートを作成するためのAWS SAM CLIコマンドの例を示します。
Sam init -Runtime Python3.8
CD sam-app/
サムビルド
SAMパッケージ-Output-Template-File Packaged.yaml
sam deploy -template-file packaged.yaml -stack-name s3-resize-stack  -  capabilities capability_iam

これがSAMテンプレートです：

---
awstemplateformatversion： '2010-09-09'
変換：AWS :: ServerLess-2016-10-31
資力：
  S3Bucket：
    タイプ：AWS :: S3 :: Bucket
    削除policy：保持します
    プロパティ：
      BucketName：My-Resize-Bucket
      NotificationConfiguration：
        lambdaconfigurations：
           - イベント：S3：オブジェクト作成：*
            関数：！getatt lambdaresizefunction.arn

  lambdaresizeFunction：
    タイプ：AWS :: ServerLess :: function
    プロパティ：
      coduri：sezize_function.py
      ハンドラー：index.handler
      ランタイム：Python3.8
      環境：
        変数：
          s3_bucket：！ref s3bucket
      ポリシー：
        -S3Crudpolicy：
            BucketName：！Ref S3Bucket

そして、これは、アップロードされたファイルを変更するLambda関数のPythonスクリプトの例です。

ボト3をインポートします

DEFハンドラー（イベント、コンテキスト）：
    s3 = boto3.client（ 's3'）
    bucket_name = os.environ ['s3_bucket']

    イベント['records']の記録のために：
        file_key = record ['s3'] ['object'] ['key']
        ＃BOTO3ライブラリを使用してファイルのサイズを変更します
        ＃同じキーを使用して、サイズ化されたファイルをS3に保存します
        s3.upload_file（resized_file、bucket_name、file_key）

このセットアップにより、Lambda関数がアップロードされた新しいオブジェクトごとに1回のみトリガーされ、同じキーを使用してファイルをサイズすることが保証されます。