

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

# 自我管理 S3 程式碼儲存
<a name="configuration-self-managed-storage"></a>

根據預設，當您從 .zip 檔案封存建立或更新 Lambda 函數或 layer 時，Lambda 會將程式碼的副本存放在 Lambda 受管儲存體中。每個 AWS 帳戶每個區域都有 300 GB 的 Lambda 受管儲存配額。

使用自我管理的 S3 程式碼儲存，您可以設定 Lambda 直接從您帳戶中的 S3 儲存貯體參考您的程式碼。Lambda 不會儲存程式碼的副本，因此程式碼不會計入您的 Lambda 受管儲存配額。Lambda 會直接從 S3 儲存貯體存取您的程式碼。

自我管理的 S3 程式碼儲存適用於使用 .zip 檔案封存建立和更新的所有函數和層。它與 Glacier 儲存類別以外的所有 S3 儲存類別相容。

**注意**  
自我管理的 S3 程式碼儲存體不會變更最大 .zip 部署套件大小，這會保持在 250 MB （解壓縮）。

**Topics**
+ [設定自我管理 S3 程式碼儲存](#self-managed-storage-setup)
+ [設定許可](#self-managed-storage-permissions)
+ [建立具有自我管理 S3 儲存的函數](#self-managed-storage-create-function)
+ [搭配 layer 使用自我管理的 S3 儲存](#self-managed-storage-layers)
+ [在儲存模式之間切換](#self-managed-storage-switching)
+ [具有自我管理儲存的函數生命週期](#self-managed-storage-lifecycle)
+ [跨帳戶和跨區域用量](#self-managed-storage-cross-account)
+ [考量事項](#self-managed-storage-considerations)

## 設定自我管理 S3 程式碼儲存
<a name="self-managed-storage-setup"></a>

若要使用自我管理的 S3 程式碼儲存，請完成下列步驟：

1. 建立 S3 儲存貯體或使用您帳戶中的現有儲存貯體。

1. 啟用儲存貯體的 [S3 版本控制](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html)。Lambda 需要 S3 版本控制來追蹤要使用的來源物件版本。每次上傳新的 .zip 套件時，S3 都會建立新的版本，讓 Lambda 可以區分更新。

1. 將 .zip 部署套件上傳至 S3 儲存貯體。

1. 授予來源物件的 Lambda 服務主體`s3:GetObject`和`s3:GetObjectVersion`許可。請參閱[設定許可](#self-managed-storage-permissions)。

1. 建立或更新您的函數或 layer，指定 S3 物件、S3 金鑰、S3 物件版本，並將 `S3ObjectStorageMode` 設定為 `REFERENCE`。

## 設定許可
<a name="self-managed-storage-permissions"></a>

若要使用自我管理的 S3 程式碼儲存，請授予 Lambda 服務主體 (`lambda.amazonaws.com`) 存取來源物件的許可。新增下列 S3 儲存貯體政策：

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

## 建立具有自我管理 S3 儲存的函數
<a name="self-managed-storage-create-function"></a>

您可以使用 主控台 AWS CLI、 或 建立具有自我管理 S3 程式碼儲存的函數 AWS CloudFormation。

**注意**  
Lambda 主控台程式碼編輯器不適用於使用參考模式的函數。若要編輯函數程式碼，請更新 S3 儲存貯體中的 .zip 檔案並更新函數。

### 使用主控台
<a name="self-managed-storage-console"></a>

當您從 Lambda 主控台的 S3 位置更新函數時，您可以選擇程式碼儲存模式。

**更新函數以使用參考模式 （主控台）**

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇要更新的函數並選擇 **Code** (程式碼) 索引標籤。

1. 在**程式碼來源**下，選擇**更新**，然後從 **Amazon S3 中的檔案選擇更新**。

1. 針對 **Amazon S3 連結 URL**，輸入 .zip 檔案的 S3 連結 URL。

1. 在**程式碼儲存模式下**，選擇**參考模式**。

1. 選擇**儲存**。

設定參考模式後，函數程式碼標籤上的**程式碼****屬性**區段會顯示**程式碼儲存模式：參考**和指向 **S3 儲存貯體的 S3 位置**。 S3 

### 使用 AWS CLI
<a name="self-managed-storage-cli"></a>

使用 `create-function`命令搭配 `S3ObjectStorageMode=REFERENCE` 參數：

```
aws lambda create-function \
  --function-name my-function \
  --runtime python3.12 \
  --role arn:aws:iam::111122223333:role/lambda-execution-role \
  --handler lambda_function.lambda_handler \
  --code S3Bucket={{my-bucket}},\
S3Key={{my-function.zip}},\
S3ObjectVersion={{abc123def456}},\
S3ObjectStorageMode=REFERENCE
```

若要更新現有函數以使用自我管理的 S3 儲存體：

```
aws lambda update-function-code \
  --function-name my-function \
  --s3-bucket {{my-bucket}} \
  --s3-key {{my-function.zip}} \
  --s3-object-version {{abc123def456}} \
  --s3-object-storage-mode REFERENCE
```

**重要**  
您必須在每次呼叫 `S3ObjectStorageMode=REFERENCE`時指定 `update-function-code`。如果您省略 `S3ObjectStorageMode`，它會預設為 `COPY`，Lambda 會將您的程式碼儲存在 Lambda 受管儲存體中。

### 使用 AWS CloudFormation
<a name="self-managed-storage-cfn"></a>

在 CloudFormation 範本中，將 `AWS::Lambda::Function` 資源的 `Code` 屬性`REFERENCE`中的 `S3ObjectStorageMode` 設定為 ：

```
Resources:
  MyFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-function
      Runtime: python3.12
      Handler: lambda_function.lambda_handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        S3Bucket: {{my-bucket}}
        S3Key: {{my-function.zip}}
        S3ObjectVersion: {{abc123def456}}
        S3ObjectStorageMode: REFERENCE
```

## 搭配 layer 使用自我管理的 S3 儲存
<a name="self-managed-storage-layers"></a>

您也可以將自我管理的 S3 程式碼儲存用於 layer 版本。使用 `publish-layer-version`命令搭配 `S3ObjectStorageMode=REFERENCE`：

```
aws lambda publish-layer-version \
  --layer-name my-layer \
  --content S3Bucket={{my-bucket}},S3Key={{my-layer.zip}},S3ObjectStorageMode=REFERENCE \
  --compatible-runtimes python3.12
```

您可以將 Lambda 受管和自我管理儲存的任意組合用於函數程式碼和 layer 程式碼。

## 在儲存模式之間切換
<a name="self-managed-storage-switching"></a>

您可以在更新函數程式碼或發佈新的層版本時，在 Lambda 受管和自我管理的 S3 程式碼儲存之間切換。`S3ObjectStorageMode` 設定為 `COPY`或 `REFERENCE`：
+ `COPY` （預設） – Lambda 會將您的原始程式碼複製到 Lambda 受管儲存體。
+ `REFERENCE` – Lambda 會直接從 S3 儲存貯體參考原始程式碼，而不儲存複本。

當您從 切換`COPY`到 時`REFERENCE`，Lambda 會刪除原始程式碼的 Lambda 受管複本。當您從 切換`REFERENCE`到 時`COPY`，Lambda 會在 Lambda 受管儲存體中複製您的原始碼。如果您超過 Lambda 受管程式碼儲存限制，切換到 `COPY` 失敗。

## 具有自我管理儲存的函數生命週期
<a name="self-managed-storage-lifecycle"></a>

Lambda 會定期從 S3 儲存貯體存取來源物件，以重新最佳化函數程式碼。您必須維護對 函數來源物件的存取，才能保持作用中狀態。
+ 如果 Lambda 無法存取函數的來源物件，函數會轉換為 `Inactive` 狀態。若要還原函數，請還原來源物件的存取權並更新函數。
+ 如果 Lambda 無法存取 layer 的來源物件，則函數會保持 `Active`。您可以更新函數組態 （無需更新圖層）、更新函數程式碼，或使用新圖層更新函數組態。不過，使用無法存取的 layer 更新函數組態會失敗。

## 跨帳戶和跨區域用量
<a name="self-managed-storage-cross-account"></a>

您可以從不同帳戶和不同區域中 S3 儲存貯體的原始碼建立函數和層。跨區域物件擷取會產生額外的 S3 資料傳輸成本。如需詳細資訊，請參閱 [S3 定價](https://aws.amazon.com/s3/pricing/)。

## 考量事項
<a name="self-managed-storage-considerations"></a>
+ 自我管理的 S3 程式碼儲存僅適用於 .zip 檔案封存函數和層。容器映像函數會繼續使用 Amazon ECR。
+ .zip 部署套件大小上限 (250 MB 解壓縮） 保持不變。
+ 對於存放在自我管理儲存貯體中的程式碼，您需要支付標準 Amazon S3 儲存費率。Lambda 不會針對相同區域內的 S3 物件擷取收費。
+ 自我管理的 S3 程式碼儲存與 Glacier 儲存類別以外的所有 S3 儲存類別相容。
+ 您可以使用 S3 跨區域複寫等 S3 功能，跨區域和 S3 生命週期政策共用成品來管理物件。