

# 创建函数
<a name="create-function"></a>

创建函数的过程分为两个阶段：

1. 将函数代码编写为 JavaScript。您可以使用来自 CloudFront 控制台的默认示例，也可以自行编写。有关更多信息，请参阅以下主题：
   + [编写函数代码](writing-function-code.md)
   + [CloudFront Functions 事件结构](functions-event-structure.md)
   + [CloudFront 的 CloudFront Functions 示例](service_code_examples_cloudfront_functions_examples.md)

1. 使用 CloudFront 创建函数并包括您的代码。代码位于函数内部（不是作为引用）。

------
#### [ Console ]

**创建函数**

1. 通过 [https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions) 登录到 CloudFront 控制台，然后选择**函数**页面。

1. 选择 **Create function (创建函数)**。

1. 输入在 AWS 账户中唯一的函数名称，选择 JavaScript 版本，然后选择**继续**。此时将显示新函数的详细信息页面。
**注意**  
要在函数中使用[键值对](kvs-with-functions.md)，您必须选择 JavaScript 运行时 2.0。

1. 在**函数代码**部分，选择**构建**选项卡，然后输入您的函数代码。**构建**选项卡中包含的代码示例说明了函数代码的基本语法。

1. 选择**保存更改**。

1. 如果函数代码使用键值对，则必须关联键值存储。

   您可在首次创建函数时关联键值存储。或者，您也可以稍后通过[更新函数](update-function.md)来关联它。

   要立即关联键值存储，请执行以下步骤：
   + 转至**关联 KeyValueStore** 部分，选择**关联现有 KeyValueStore**。
   + 选择包含函数中键值对的键值存储，然后选择**关联 KeyValueStore**。

   CloudFront 会立即将存储与该函数关联。您无需保存此函数。

------
#### [ CLI ]

如果您使用 CLI，则通常需要首先在文件中创建函数代码，然后使用 AWS CLI 创建函数。

**创建函数**

1. 在文件中创建函数代码，并将其存储在计算机可以连接到的目录中。

1. 运行该命令，如示例所示。此示例使用 `fileb://` 表示法来传入文件。它还包括换行符，以使命令更具可读性。

   ```
   aws cloudfront create-function \
       --name MaxAge \
       --function-config '{"Comment":"Max Age 2 years","Runtime":"cloudfront-js-2.0","KeyValueStoreAssociations":{"Quantity":1,"Items":[{"KeyValueStoreARN":"arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"}]}}' \
       --function-code fileb://function-max-age-v1.js
   ```
**备注**  
`Runtime` – JavaScript 的版本。要在函数中使用[键值对](kvs-with-functions.md)，您必须指定版本 2.0。
`KeyValueStoreAssociations` – 如果您的函数使用键值对，则可以在首次创建函数时关联键值存储。或者，您可以稍后使用 `update-function` 关联它。`Quantity` 始终为 `1`，因为每个函数只能有一个与之关联的键值存储。

   该命令成功执行后，您会看到类似以下内容的输出。

   ```
   ETag: ETVABCEXAMPLE
   FunctionSummary:
     FunctionConfig:
       Comment: Max Age 2 years
       Runtime: cloudfront-js-2.0
       KeyValueStoreAssociations= \
         {Quantity=1, \
         Items=[{KeyValueStoreARN='arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'}]} \
     FunctionMetadata:
       CreatedTime: '2021-04-18T20:38:56.915000+00:00'
       FunctionARN: arn:aws:cloudfront::111122223333:function/MaxAge
       LastModifiedTime: '2023-11-19T20:38:56.915000+00:00'
       Stage: DEVELOPMENT
     Name: MaxAge
     Status: UNPUBLISHED
   Location: https://cloudfront.amazonaws.com/2020-05-31/function/arn:aws:cloudfront:::function/MaxAge
   ```

   请求中的大部分信息都是重复的。其他信息由 CloudFront 添加。
**备注**  
`ETag` – 每次修改键值存储时，此值都会更改。您可以使用此值和函数名称在将来引用该函数。确保您始终使用最新的 `ETag`。
`FunctionARN` – 您的 CloudFront 函数的 ARN。
111122223333 – AWS 账户。
`Stage` – 函数的阶段（`LIVE` 或 `DEVELOPMENT`）。
`Status` – 函数的状态（`PUBLISHED` 或 `UNPUBLISHED`）。

------

函数在创建后，将添加到 `DEVELOPMENT` 阶段。我们建议您在[发布函数](publish-function.md)之前对其[进行测试](test-function.md)。在您发布函数后，函数将变为 `LIVE` 状态。