
# 结合EG事件通知自动处理OBS桶中的图片
#### 应用场景
根据业务需求，您在OBS桶中执行上传、删除对象等操作后，希望能够自动触发执行后续操作流程，提升效率。
本实践将提供全流程方案，即向源桶中上传图片后，通过EG事件通知功能自动通知下游服务函数工作流FunctionGraph，触发函数为图片添加水印，并将处理后的图片上传至目标桶中。
#### 方案架构
图1结合EG通知自动处理OBS桶中图片架构图   
![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002165929381.png)
结合EG通知自动处理OBS桶中图片的方案如下：
1. 向源桶中上传图片，产生OBS事件作为事件源。
2. EG事件通知（事件网格服务）通过通道将事件源路由至事件目标，从而触发函数执行。
3. 函数工作流（FunctionGraph）执行函数处理图片、输出图片，并将图片上传至目标桶。
 
#### 方案优势
- 帮助您快速、实时地监控到OBS桶中的对象操作。
- 涉及多流程业务执行时，可通过EG事件通知功能自动触发下游程序执行，节省了人工监控和执行的成本。
 
#### 约束与限制
- 使用的原图片大小不超过25MB。
- 使用EG事件通知功能，存在一定的延迟，不建议时延敏感类业务场景使用。
- 单桶默认最多同时配置10条EG事件通知策略。
- 新创建的EG事件通知策略将在5分钟之内生效。
- 单桶的多条EG事件通知策略不允许重复，重复的策略会创建失败，即任意对象在发生任意事件时都不能同时匹配两条以上的EG事件通知策略。
  ![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
  针对同一事件，如果配置了一条前后缀均为空的EG事件通知策略，则不允许再配置第二条，因为前后缀均为空表示对所有对象生效。
  例如：针对Put事件，已存在一条EG事件通知策略A，定义的前缀是"abcd"，后缀是".txt"。如果要创建另外一条针对Put事件的EG事件通知策略B，则策略B配置不同前后缀的结果如[表1]所示。
   表1策略B前后缀配置场景及结果 
  | 策略A前后缀配置                                                             | 策略B前后缀配置                                                               | 策略B创建结果 | 原因                |
  |:---|:---|:---|:---|
  | 前缀：abcd 后缀：.txt | 前缀：abcd 后缀：.txt   | 失败      | 前后缀相同             |
  | 前缀：abcd 后缀：.txt | 前缀：abcd 后缀：空      | 失败      | 前缀相同，B的后缀包含A的     |
  | 前缀：abcd 后缀：.txt | 前缀：ab 后缀：xt         | 失败      | B的前缀包含A的，B的后缀包含A的 |
  | 前缀：abcd 后缀：.txt | 前缀：abef 后缀：.txt | 成功      | 前缀不同，后缀相同         |
  | 前缀：abcd 后缀：.txt | 前缀：abcd 后缀：.mp4    | 成功      | 前缀相同，后缀不同         |
     
  
 
#### 资源和成本规划
表2资源规划 
| 资源     | 资源名称             | 资源说明                                                                                                         | 数量 | 费用                                                                                                                  |
|:---|:---|:---|:---|:---|
| OBS桶   | piccomp          | 上传图片的源桶。 您需要在OBS控制台创建源桶。                                                        | 1  | 根据图片占用的存储空间收费，具体请参见[存储费用](https://support.huaweicloud.com/price-obs/obs_42_0003.html)。                              |
| OBS桶   | piccomp-output   | 图片处理后存放的目标桶。 您需要在OBS控制台创建目标桶。                                                  | 1  | 根据图片占用的存储空间收费，具体请参见[存储费用](https://support.huaweicloud.com/price-obs/obs_42_0003.html)。                              |
| 图片     | example.jpg      | 用于添加水印的原图片。 您需要提前准备好需要添加水印的图片。                                                 | 1  | -                                                                                                                   |
| 函数     | FG_Test          | 为图片添加水印的函数。 您需要在函数工作流（FunctionGraph）控制台创建函数。                                   | 1  | 根据请求次数、执行时间、执行次数等收费，具体请参见[函数工作流计费](https://support.huaweicloud.com/price-functiongraph/functiongraph_00_0003.html)。 |
| EG事件订阅 | subscription-obs | 事件订阅将事件源、通道和事件目标绑定在一起，事件源（OBS事件）通过通道触发事件目标（函数）执行。 您需要在OBS控制台的"事件通知"页面创建EG事件订阅。 | 1  | 根据请求次数收费，具体请参见[事件网格计费](https://support.huaweicloud.com/price-eg/eg-pr-003.html)。                                    |
   
#### 前提条件
账号或IAM用户已具有Tenant Administrator权限。给账号授权请参见[给IAM用户授权](https://support.huaweicloud.com/usermanual-iam/iam_01_0652.html) 。
#### 操作流程
图2为图片添加水印流程   
![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000001992968660.png "点击放大")
#### 实施步骤
#### 步骤一：创建OBS源桶和目标桶
桶是OBS中用于存储对象的容器。本示例中，上传的图片存储在源桶，添加水印后的图片存储在目标桶。如果您已有源桶和目标桶，请跳至[步骤二：创建函数]。
![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
由于归档存储和深度归档存储类别的桶，需要先手动恢复才能下载和通过URL访问对象，因此本实践暂不支持使用归档存储和深度归档存储类别的桶。
1. 登录控制台，进入[创建桶](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/create)页面。
2. 在创建桶页面，按照下表说明配置相关参数，其他参数保持默认。表中"示例"仅供参考，您也可以根据业务实际情况自行设置。 
   关于更多参数配置请参见[创建桶](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829088.html)。
   
   | 参数       | 示例          | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
   |:---|:---|:---|
   | 区域       | **华北-北京四**  | 桶所属区域。请选择靠近您业务的区域，以降低网络时延，提高访问速度。 **桶创建成功后，不支持变更区域，请谨慎选择。** **目标桶和源桶必须在同一区域。**                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | 桶名称      | **piccomp** | 桶的名称。桶创建成功后，不支持修改名称。 桶名称命名规则如下： - 全局唯一，不能与已有的任何桶（包含其他账号创建的桶）名称重复。删除桶后，需等待30分钟才能创建同名桶或并行文件系统。  - 长度范围为3到63个字符，支持小写字母、数字、中划线（-）、英文句号（.）。  - 禁止两个英文句号（.）相邻，禁止英文句号（.）和中划线（-）相邻，禁止以英文句号（.）和中划线（-）开头或结尾。  - 禁止使用IP地址。   |
   | 数据冗余存储策略 | **多AZ存储**   | 选择数据存储在多个可用区或单个可用区。 多AZ存储：数据存储至同区域内的多个可用区（AZ），可靠性更高，同时存储成本相对更高。 桶创建成功后，不支持更改数据冗余存储策略。 多AZ存储桶不支持为桶设置归档存储类别和深度归档存储类别。                                                                                                                                                                                                                                                                                                                                                           |
   | 存储类别     | **标准存储**    | 桶的存储类别。不同的存储类别可以满足客户业务对存储性能、成本的不同诉求。 标准存储：适用于有大量热点文件或小文件，且需要频繁访问（平均一个月多次）并快速获取数据的业务场景。 更多存储类别详情请参见[存储类别](https://support.huaweicloud.com/usermanual-obs/obs_41_0080.html)。                                                                                                                                                                                                                                                                                                                                |
   | 桶策略      | **私有**      | 桶的读写权限控制。 私有：除桶ACL授权外的其他用户无桶的访问权限。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
   | 企业项目     | **default** | 将桶加入到企业项目中统一管理。如无特殊的企业项目划分和管理需求，此处可直接选择默认企业项目"default"。 如果您想要了解更多关于如何通过企业项目管理OBS桶，具体请参见[创建桶](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829088.html#section3)中的"企业项目"参数说明。                                                                                                                                                                                                                                                                                                                                            |
      
   
   
3. 单击页面右下角的"立即创建"，并确认提示信息。
   
   创建完成后，将会出现创建成功弹窗，确认后在桶列表页即可看到已创建的桶。
   
   
4. 重复执行[1]\~[3]，再创建目标桶piccomp-output。
 
#### 步骤二：创建函数
在OBS源桶中上传图片后，通过EG事件订阅触发函数执行，因此需要创建图片打水印函数。
1. 单击页面左上角的![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002006586286.png)，选择"计算 \> 函数工作流 Function Graph"，进入函数工作流控制台。
2. 在左侧导航栏选择"函数 \> 函数列表"。
3. 单击"创建函数"。
4. 在"创建函数"页面，按照如下设置参数，其他参数保持默认。 
   关于更多参数配置请参见[创建函数](https://support.huaweicloud.com/usermanual-functiongraph/functiongraph_01_1441.html)。
   表3函数参数说明 
   | 参数     | 示例             | 描述                                                                                                                                                                                                                                                                                                                             |
   |:---|:---|:---|
   | 选择创建方式 | **创建空白函数**     | 选择创建函数的方式。 此处选择"创建空白函数"，即从头开始自定义创建函数。                                                                                                                                                                                                                                                              |
   | 函数类型   | **事件函数**       | 选择触发函数执行的方式。 事件函数，即通过触发器来触发函数执行。                                                                                                                                                                                                                                                                 |
   | 区域     | **华北-北京四**     | 选择要部署函数代码的区域。 此处请选择和源桶、目标桶均相同的区域。                                                                                                                                                                                                                                                                 |
   | 函数名称   | **FG_Test**    | 函数名称，命名规则如下： - 可包含字母、数字、下划线和中划线。  - 以大/小写字母开头，以字母或数字结尾。  - 长度不超过60个字符。   |
   | 企业项目   | **default**    | 将函数加入到企业项目中统一管理。 如无特殊的企业项目划分和管理需求，此处可直接选择默认企业项目"default"。关于企业项目的使用，具体请参见[企业用户权限与项目管理](https://support.huaweicloud.com/usermanual-em/eps_13_0001.html)。                                                                                                                                            |
   | 委托     | **OBS_Agency** | 用于委托函数工作流服务去访问其他其他云服务。 此处需要为函数工作流服务授予OBS的管理员权限（OBS Administrator），授权范围选择"所有资源"。 创建委托请参见[委托其他云服务管理资源](https://support.huaweicloud.com/usermanual-iam/iam_06_0004.html)。                                                                                            |
   | 运行时    | **Python 3.9** | 选择用来编写函数的语言。                                                                                                                                                                                                                                                                                                                   |
      
   图3创建函数   
   ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000001994337278.png "点击放大")
   
   
5. 单击"创建函数"，完成函数的创建。
6. 在函数列表中，单击函数名称，进入函数详情页。
7. 上传代码文件。本示例中使用的样例代码文件请参见[使用函数为图片添加水印](https://support.huaweicloud.com/bestpractice-functiongraph/functiongraph_05_0402.html)。
   
   1. 单击"代码"页签右侧的"上传代码"，选择"Zip文件"。
   
   2. 在"上传Zip文件"弹窗，单击"添加文件"，选择下载的样例代码文件"watermark.zip"，并单击"确定"。 在代码区域产生了一个index.py文件，index.py为函数执行的入口文件。文件中的关键参数说明如下：
      - obs_output_bucket：添加水印后的图片存放的OBS桶（本示例中的目标桶）。
      
      - obs_region：目标桶所在的区域编号。
       
   
   
   
   
8. 添加代码依赖包。样例代码依赖pillow包，需要通过依赖包的形式进行引入。 
   1. 在"代码"页签底部，单击"添加依赖包"。
   
   2. 在右侧的"选择依赖包"弹窗，添加公共依赖包"pillow-7.1.2"，并单击"确定"。
   
   
   
   
9. 设置环境变量。用来配置图片添加水印后存放的目标桶信息。 
   1. 切换至"设置"页签，单击左侧导航列表的"环境变量"。
   
   2. 单击"编辑环境变量"，在右侧弹窗单击"添加环境变量"。
   
   3. 添加以下环境变量，并单击右下角的"确定"。
      表4环境变量 
      | 键                 | 值              | 说明                                                                                                                        |
      |:---|:---|:---|
      | obs_output_bucket | piccomp-output | 添加水印后的图片存放的OBS目标桶。 值为[步骤一：创建OBS源桶和目标桶]中创建的目标桶名称。          |
      | obs_region        | cn-north-4     | 目标桶所在的区域编号。 更多区域编号请参见[地区和终端节点](https://console.huaweicloud.com/apiexplorer/#/endpoint/OBS)。 |
         
      ![](https://support.huaweicloud.com/bestpractice-obs/public_sys-resources/note_3.0-zh-cn.png)
      键"obs_output_bucket"和"obs_region"为[7]中样例代码里面目标桶的关键参数。
      图4设置环境变量   
      ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000001994407532.png "点击放大") 
   
   
   
   
 
#### 步骤三：创建EG通知
使用EG通知来作为事件触发器，触发函数执行。即创建EG事件订阅，将事件源、通道和事件目标绑定在一起，事件源（OBS事件）通过通道触发事件目标（函数）执行。
1. 单击页面左上角的![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002042785269.png)，选择"存储 \> 对象存储服务 OBS"，进入桶列表页面。
2. 单击源桶名称，进入对象列表页。
3. 在左侧导航栏选择"数据管理 \> 事件通知"。
4. 在"EG通知"页签，单击"创建"，进入EG事件订阅详情页。
5. 修改订阅名称。 
   单击上方订阅名称旁的![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002029368513.png)，在"修改订阅"弹窗，修改订阅名称后单击"确定"。本示例中订阅名称修改为"subscription-obs"。
   
   
6. 配置事件源。 
   1. 单击"事件源"，按照如下设置参数，其他参数保持默认。
      关于更多参数配置请参见[创建事件订阅](https://support.huaweicloud.com/usermanual-eg/eg-ug-007.html)。
      表5事件源参数说明 
      | 参数    | 示例                                                                                                                                                                                                                                                                                                                                                                                                                                               | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
      |:---|:---|:---|
      | 选择提供方 | **云服务**                                                                                                                                                                                                                                                                                                                                                                                                                                          | 选择事件源提供方。 云服务，即华为云服务作为事件源提供方。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
      | 事件源   | **OBS应用事件源**                                                                                                                                                                                                                                                                                                                                                                                                                                     | 选择云服务事件源。 OBS应用事件源，即通过操作OBS桶内对象的特定行为来产生事件源。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
      | 桶     | **piccomp**                                                                                                                                                                                                                                                                                                                                                                                                                                      | 选择产生事件源的OBS桶，即本示例中的源桶。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
      | 事件类型  | - **OBS:DWR:ObjectCreated:PUT**  - **OBS:DWR:ObjectCreated:POST**  - **OBS:DWR:ObjectCreated:COPY**  - **OBS:DWR:ObjectCreated:** **CompleteMultipartUpload**   | 选择产生事件源的OBS操作。 - **OBS:DWR:ObjectCreated:PUT**：通过页面或Put请求创建或覆盖桶对象。  - **OBS:DWR:ObjectCreated:POST**：使用Post请求创建或覆盖桶对象。  - **OBS:DWR:ObjectCreated:COPY**：使用Copy请求创建或覆盖桶对象。  - **OBS:DWR:ObjectCreated:** **CompleteMultipartUpload**：通过页面或API请求合并分段任务。   |
         
      图5设置事件源   
      ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000001994590666.png "点击放大") 
   
   2. 单击"确定"，完成事件源配置。
   
   
   
   
7. 配置事件目标。 
   1. 单击"事件目标"，按照如下设置参数，其他参数保持默认。 关于更多参数配置请参见[创建事件订阅](https://support.huaweicloud.com/usermanual-eg/eg-ug-007.html)。
      表6事件目标参数说明 
      | 参数    | 示例                      | 描述                                                                                                                      |
      |:---|:---|:---|
      | 选择提供方 | **云服务**                 | 选择事件目标提供方。 云服务，即华为云服务作为事件目标提供方。                                                            |
      | 事件目标  | **FunctionGraph（函数计算）** | 选择云服务事件目标。 FunctionGraph（函数计算），即由函数工作流服务执行特定操作。                                           |
      | 函数    | **FG-Test**             | 选择要执行的函数。 本示例中选择已创建的为图片添加水印的函数FG-Test。                                                     |
      | 委托    | **EG_TARGET_AGENCY**    | 用于委托事件网格服务EG去访问其他云服务。 本示例中需要委托EG去访问函数工作流服务。如无委托，可单击旁边的"创建委托"，将会自动创建名为"EG_TARGET_AGENCY"的委托。 |
      | 类型    | **变量**                  | 事件网格EG对事件参数进行转换，通过JSONPath从事件中提取参数，然后把这些参数路由到事件目标。                                                                      |
      | 参数    | **如下所示。**               | 需要转换的参数。                                                                                                                |
      | 模板    | **如下所示。**               | 自定义一个包含所需变量的模板，事件网格EG按照模板定义的形式进行转换。                                                                                     |
         
      本示例中，"参数"请填写如下内容：
      ```
      {
        "eventVersion": "$.data.eventVersion",
        "eventTime": "$.data.eventTime",
        "requestParameters": "$.data.requestParameters.sourceIPAddress",
        "configurationId": "$.data.obs.configurationId",
        "eTag": "$.data.obs.object.eTag",
        "sequencer": "$.data.obs.object.sequencer",
        "key": "$.data.obs.object.key",
        "size": "$.data.obs.object.size",
        "arn": "$.data.obs.bucket.arn",
        "name": "$.data.obs.bucket.name",
        "ownerIdentity": "$.data.obs.bucket.ownerIdentity.ID",
        "eventRegion": "$.data.eventRegion",
        "eventName": "$.type",
        "userIdentity": "$.data.userIdentity.ID"
      }
      ```
      本示例中，"模板"请填写如下内容：
      ```
      {
          "Records": [
              {
                  "eventVersion": "${eventVersion}",
                  "eventTime": "${eventTime}",
                  "requestParameters": {
                      "sourceIPAddress": "${requestParameters}"
                  },
                  "b1": {
                      "configurationId": "${configurationId}",
                      "object": {
                          "eTag": "${eTag}",
                          "sequencer": "${sequencer}",
                          "key": "${key}",
                          "size": "${size}"
                      },
                      "bucket": {
                          "arn": "${arn}",
                          "name": "${name}",
                          "ownerIdentity": {
                              "PrincipalId": "${ownerIdentity}"
                          }
                      }
                  },
                  "eventRegion": "${eventRegion}",
                  "eventName": "${eventName}",
                  "userIdentity": {
                      "principalId": "${userIdentity}"
                  }
              }
          ]
      }
      ```
      图6设置事件目标   
      ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002031152733.png "点击放大") 
   
   2. 单击"确定"，完成事件目标配置。
   
   
   
   
8. 单击页面右上角的"保存"。
 
#### 步骤四：上传图片触发OBS事件
向已创建的OBS源桶中上传一张图片，产生OBS事件，使得EG通知去触发函数执行：为上传的图片添加水印，并将处理后的图片存储至已创建的目标桶中。
1. 单击页面左上角的![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002006744498.png)，选择"存储 \> 对象存储服务 OBS"，进入桶列表页面。
2. 单击源桶名称，进入对象列表页。
3. 单击搜索框上方的"上传对象"。
4. 在"上传对象"弹窗，单击"添加文件"，选择要上传的图片，其他参数保持默认即可。 
   关于更多参数配置请参见[上传对象](https://support.huaweicloud.com/usermanual-obs/obs_03_1002.html)。
   
   
5. 单击"上传"。 
   在对象列表页可以看到已上传对象，表示上传成功。
   图7上传对象成功   
   ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002035388425.png)
   
   
 
#### 步骤五：验证结果
在目标桶中查看图片是否已添加水印。
1. 在桶列表页，单击目标桶名称。
2. 在对象列表页，单击添加水印后的图片名称。
3. 切换至"图片预览"页签，查看图片已添加水印。 
   图8查看水印图片   
   ![](https://support.huaweicloud.com/bestpractice-obs/zh-cn_image_0000002077882198.png "点击放大")
   
   
 
