

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 從 Amazon S3 部署 Web 函數程式碼
<a name="web-functions-code-s3"></a>

您可以在 Amazon S3 儲存貯體中提供 Lambda Web 函數程式碼做為 .zip 部署套件。這是為 Web 函數提供程式碼的唯一方法。當您建立 Web 函數或修訂時，請在 `s3Object` 欄位中指定物件，該物件會巢狀在請求的 `codeConfig`內`buildConfig`。在 中`s3Object`，包含儲存貯體、金鑰和選用的 versionId。Lambda 會直接從您的儲存貯體參考您的程式碼。由於 Lambda 會將每個修訂釘選為特定物件版本，因此您的部署可以重現。您可以在帳戶和 AWS 區域之間重複使用單一部署套件。

**Topics**
+ [先決條件](#web-functions-code-s3-requirements)
+ [所需的許可](#web-functions-code-s3-permissions)
+ [使用來自 Amazon S3 的程式碼建立 Web 函數](#web-functions-code-s3-creating)
+ [物件生命週期](#web-functions-code-s3-lifecycle)
+ [多區域部署](#web-functions-code-s3-multi-region)

## 先決條件
<a name="web-functions-code-s3-requirements"></a>

從 Amazon S3 部署 Web 函數程式碼之前，請確定您的儲存貯體和部署套件符合下列要求：

S3 版本控制  
儲存貯體必須啟用 [S3 版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。Lambda 使用物件版本來追蹤修訂使用的程式碼版本。

版本 ID  
`versionId` 參數在請求中是選用的。如果您省略它，Lambda 會在建立時使用最新版本的物件。無論哪種方式，Lambda 都會將修訂綁定到特定物件版本。

最大部署套件大小  
512 MB （解壓縮）。

項目檔案  
部署套件必須包含您應用程式的項目檔案。根據預設，執行時間`index.js`會在套件的根目錄載入。若要使用不同的項目檔案，請將修訂版上的 `AWS_LAMBDA_NODEJS_ENTRYPOINT` 環境變數設定為相對於套件根目錄的檔案路徑。載入項目檔案後，執行時間會等待 HTTP 伺服器開始接聽`AWS_LAMBDA_HTTP_ENDPOINT`來自環境變數的主機和連接埠。如果執行時間無法解析項目檔案，或伺服器從未開始接聽，初始化會失敗，且對端點的請求會失敗。  
Lambda 不會確認您的伺服器在建立或更新端點以使用修訂時開始接聽。`Active` 在這些情況下，修訂和端點仍然可以顯示。每次部署後，傳送測試請求並檢查您的應用程式日誌。

儲存貯體位置  
儲存貯體可以位於與 Web 函數不同的 AWS 帳戶和區域 AWS 。儲存貯體必須與 Web 函數位於相同的 AWS 分割區中。儲存貯體不能位於選擇加入區域 （預設為未啟用的區域）。如果不符合任一條件，Lambda 會拒絕請求。跨區域物件擷取會產生額外的 Amazon S3 資料傳輸成本。如需定價的詳細資訊，請參閱 [Amazon S3 定價](https://aws.amazon.com/s3/pricing/)。

## 所需的許可
<a name="web-functions-code-s3-permissions"></a>

若要從 Amazon S3 部署 Web 函數程式碼，您必須設定呼叫身分和 Lambda 服務主體的許可。

### 來電者許可
<a name="web-functions-code-s3-caller-permissions"></a>

若要建立 Web 函數或修訂，您的 IAM 身分需要 S3 物件的下列許可：
+ `s3:GetObject`
+ `s3:GetObjectVersion`

對於跨帳戶儲存貯體，儲存貯體政策也必須授予對物件的呼叫身分存取權。

### Lambda 的儲存貯體政策
<a name="web-functions-code-s3-bucket-policy"></a>

儲存貯體政策必須授予 Lambda 服務主體 (`lambda.amazonaws.com`) `s3:GetObject`和 `s3:GetObjectVersion` 許可。使用符合修訂 ARN 模式`aws:SourceArn`的條件來範圍政策。使用 `ArnLike` 搭配萬用字元做為修訂 ID，因為 Lambda 會在您建立修訂時產生修訂 ID。

如果物件使用 AWS KMS 金鑰 (SSE-KMS) 加密，則金鑰政策也必須允許 `lambda.amazonaws.com` 對該金鑰`kms:Decrypt`呼叫 。當您建立修訂時，Lambda 會檢查服務主體的存取權，並在缺少存取權時拒絕請求。

下列範例儲存貯體政策授予 Lambda 讀取部署套件的存取權，以用於指定 Web 函數的任何修訂。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowLambdaWebFunctionCodeAccess",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.amazonaws.com"
            },
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::{{my-bucket}}/*",
            "Condition": {
                "ArnLike": {
                    "aws:SourceArn": "arn:aws:lambda:{{us-east-1}}:{{111122223333}}:web-function/{{my-function}}/revision/*"
                }
            }
        }
    ]
}
```

若要限制存取存放部署套件的金鑰字首，請將`Resource`值變更為 `arn:aws:s3:::{{my-bucket}}/{{my-prefix}}/*`，其中 {{my-bucket}} 是您的儲存貯體名稱，{{my-prefix}} 是金鑰字首。將 保留`/*`在字首的結尾。請勿在 中變更`revision/*`萬用字元`aws:SourceArn`。

## 使用來自 Amazon S3 的程式碼建立 Web 函數
<a name="web-functions-code-s3-creating"></a>

您可以在 的 `codeConfig`區段中指定 S3 部署套件`buildConfig`。下列程序說明如何建立 Web 函數，以及如何使用 建立新的修訂 AWS CLI。

**使用來自 Amazon S3 的程式碼建立 Web 函數 (AWS CLI)**
+ 執行下列命令來建立參考 Amazon S3 中 .zip 部署套件的 Web 函數。

  ```
  aws lambda-web create-web-function \
      --function-name {{my-web-app}} \
      --revision-config '{
        "buildConfig": {
          "codeConfig": {
            "s3Object": { "bucket": "{{my-bucket}}", "key": "{{my-app.zip}}" }
          },
          "runtimeConfig": { "runtime": "nodejs24.x" }
        },
        "serviceConfig": {
          "executionRoleArn": "arn:aws:iam::{{111122223333}}:role/{{my-web-function-role}}"
        }
      }' \
      --endpoint-config '{
        "endpointName": "{{my-endpoint}}",
        "endpointType": "HomeRegion",
        "authType": "ApplicationManaged"
      }'
  ```

  當您省略 時`versionId`，Lambda 會在建立時使用最新版本的物件。

**使用特定物件版本建立新的修訂 (AWS CLI)**
+ 執行下列命令來建立使用特定版本部署套件的新修訂版。

  ```
  aws lambda-web create-web-function-revision \
      --function-name {{my-web-app}} \
      --build-config '{
        "codeConfig": {
          "s3Object": {
            "bucket": "{{my-bucket}}",
            "key": "{{my-app.zip}}",
            "versionId": "{{abc123def456}}"
          }
        },
        "runtimeConfig": { "runtime": "nodejs24.x" }
      }' \
      --service-config '{
        "executionRoleArn": "arn:aws:iam::{{111122223333}}:role/{{my-web-function-role}}"
      }'
  ```

  透過指定 `versionId`，您可以將修訂鎖定到物件的確切版本，而不是最新版本。

## 物件生命週期
<a name="web-functions-code-s3-lifecycle"></a>

**請勿刪除 S3 物件或移除作用中修訂的 Lambda 存取權**  
Lambda 參考來自 Amazon S3 儲存貯體的程式碼。如果您刪除修訂使用的 S3 物件，或修訂使用的特定物件版本，則當 Lambda 下次驗證物件的存取權時，修訂會移至 `Failed` 狀態，然後無法再為流量提供服務。保留您仍在使用的所有修訂的物件版本。  
移除 Lambda 服務主體對儲存貯體的存取權具有相同的效果。如果您修改儲存貯體政策以拒絕或移除 的 `s3:GetObject`和 `s3:GetObjectVersion`許可`lambda.amazonaws.com`，參考該儲存貯體中物件的現有修訂會移至 `Failed` 狀態。只要任何修訂參考這些物件，即可同時維護物件和 Lambda 服務主體的讀取存取權。  
`Failed` 狀態為永久性。還原已刪除的物件或儲存貯體許可不會將修訂版傳回 `Active` 狀態。若要復原，請建立參考可用物件版本的新修訂，然後更新端點的修訂權重，以將流量路由到該版本。如需部署模式，請參閱 [部署模式](web-functions-deployment.md)。

Lambda 不會自動將流量移離`Failed`修訂版。以 HTTP 狀態碼 409 和 的`lambda-web-error-type`回應標頭拒絕端點路由至`Failed`修訂的請求`Platform.RevisionNotActive`。如果端點對多個修訂的流量進行加權，則只會影響路由至`Failed`修訂的請求共用；路由至正常運作修訂的請求會正常提供。若要停止失敗，請更新端點的修訂權重以移除`Failed`修訂。

使用新的上傳覆寫物件會建立新的 S3 版本。這不會影響現有的修訂：當您建立修訂時，Lambda 會解析並鎖定確切的物件版本，即使您省略 `versionId`。不過，如果您刪除修訂參考的舊物件版本，則該修訂會移至 `Failed` 狀態。上傳替換物件沒有幫助，因為替換是具有不同版本 ID 的新版本。

## 多區域部署
<a name="web-functions-code-s3-multi-region"></a>

對於具有 `MultiRegion`或 `PerRegion`端點的 Web 函數，Lambda 會從您指定的儲存貯體讀取來源物件，位於儲存貯體所在的任何區域中。然後，Lambda 會將從該物件衍生的準備程式碼成品複寫到其他區域。您不需要將部署套件複製到其他 區域中的儲存貯體。如需 Lambda 複寫項目的詳細資訊，請參閱 [Lambda 複寫的內容](web-functions-endpoint-replication.md#web-functions-endpoint-replication-what)。