Defender as Code插件 - OpenZeppelin 文档

本文介绍了Defender as Code (DaC) 插件,它是一个Serverless Framework插件,用于自动化资源管理和配置即代码。

Defender as Code 插件

Defender as Code (DaC) 是一个 Serverless Framework 插件,用于自动化资源管理和配置即代码。

此插件正在开发中,行为可能会改变。请谨慎使用。

前提条件

Serverless Framework: https://www.serverless.com/framework/docs/getting-started/

安装

你可以直接使用我们预配置的模板初始化你的 Serverless 项目:

sls install --url https://github.com/OpenZeppelin/defender-as-code/tree/main/template -n my-service
为了使上面的命令正确执行,你需要访问此 repo。

或者,你可以将其直接安装到现有项目中:

yarn add @openzeppelin/defender-as-code

设置

你可以通过几种方式设置 serverless.yml 配置:

  • 从头开始创建;

  • 使用 Defender 的 2.0 Serverless 导出功能;

  • 利用 defender-as-code 仓库中提供的示例模板

如果你已经在 Defender 中拥有诸如合约、通知、Relayer、Action 等资源,则可以从 manage → advanced 页面导出一个包含这些资源的 serverless.yml 配置文件。

Defender Export Serverless

如果你之前使用 defender-as-code 部署到同一账户,并且随后通过 Defender 用户界面创建了新资源,则导出功能将根据你最新的部署堆栈的名称自动为新资源分配一个 stackResourceId。如果你之前没有使用 defender-as-code 部署过,则将使用 mystack 的默认堆栈名称。

此插件允许你从 serverless.yml 中声明性地定义 Action、Monitor、通知、区块浏览器 API 密钥、Relayer、合约、策略和密钥,并使用 serverless deploy 通过 CLI 供应它们。下面是一个示例模板,其中定义了一个 action、一个 relayer、一个策略和一个 relayer API 密钥:

service: defender-as-code-template
configValidationMode: error
frameworkVersion: '3'

provider:
  name: defender
  stage: ${opt:stage, 'dev'}
  stackName: 'mystack'
  ssot: false

defender:
  key: '${env:TEAM_API_KEY}'
  secret: '${env:TEAM_API_SECRET}'

resources:
  actions:
    action-example-1:
      name: 'Hello world from serverless'
      path: './actions/hello-world'
      relayer: ${self:resources.relayers.relayer-1}
      trigger:
        type: 'schedule'
        frequency: 1500
      paused: false
      # optional - unencrypted and scoped to the individual action
      environment-variables:
        hello: 'world!'
    action-example-2: 2cbc3f58-d962-4be8-a158-1035be4b661c

  policies:
    policy-1:
      gas-price-cap: 1000
      whitelist-receivers:
        - '0x0f06aB75c7DD497981b75CD82F6566e3a5CAd8f2'
      eip1559-pricing: true

  relayers:
    relayer-1:
      name: 'Test Relayer 1'
      network: 'sepolia'
      min-balance: 1000
      policy: ${self:resources.policies.policy-1}
      api-keys:
        - key1

plugins:
  - '@openzeppelin/defender-as-code'

这需要在 YAML 文件的 defender 属性下设置 keysecret。我们建议使用环境变量或安全的(被 gitignore)配置文件来检索这些值。相应地修改 serverless.yml

确保 Defender 团队 API 密钥已设置为所有适当的 API 功能。

stackName(例如 mystack)与资源键(例如 relayer-1)组合以唯一标识每个资源。此标识符称为 stackResourceId(例如 mystack.relayer-1),允许你在同一租户中管理多个部署。

你也可以通过唯一的 ID 直接引用现有的 Defender 资源(例如 2cbc3f58-d962-4be8-a158-1035be4b661c)。这些资源将不受插件管理,并且在部署过程中会被忽略。但是,你可以在其他资源中引用它们以相应地更新其配置。 以下是支持直接引用的属性列表:

  • relayer 可以在 Action 中引用 relayerId

  • action-trigger 可以在 Monitor 中引用 actionid

  • action-condition 可以在 Monitor 中引用 actionId

  • address-from-relayer 可以在 Relayer 中引用 relayerId

  • notify-config.channels 可以在 Monitor 中引用多个 notificationId

  • contracts 可以通过 addresses 使用,并在 Monitor 中引用多个 contractId 以下是如何在 Monitor 和 Action 中分别直接引用 Defender 合约和 Relayer 的示例:

...
contracts:
  contract-1: 'sepolia-0xd70d6A0480420b4C788AF91d0E1b0ca6141A9De8' # Defender 中现有资源的 contractId
relayers:
  relayer-2: 'bcb659c6-7e11-4d37-a15b-0fa9f3d3442c' # Defender 中现有 relayer 的 relayerId
actions:
  action-example-1:
    name: 'Hello world from serverless'
    path: './actions/hello-world'
    relayer: ${self:resources.relayers.relayer-2}
    trigger:
      type: 'schedule'
      frequency: 1500
    paused: false
monitors:
  block-example:
    name: 'Block Example'
    type: 'BLOCK'
    network: 'sepolia'
    risk-category: 'TECHNICAL'
    # optional - either contracts OR addresses should be defined
    contracts:
      - ${self:resources.contracts.contract-1}
    ...
...

SSOT 模式

serverless.yml 文件中的 provider 属性下,你可以选择性地添加一个 ssot 布尔值。SSOT 或单一信息源,确保你在 Defender 中的堆栈状态与 serverless.yml 模板完全同步。 这意味着所有未在当前模板文件中定义的资源,在部署时将从 Defender 中删除,Relayer 除外。如果在模板中未定义 SSOT,则默认为 false

serverless.yml 文件中删除的任何资源都不会自动删除,以防止意外删除资源。要使此行为符合预期,必须启用 SSOT 模式。

密钥 (Action)

Action 密钥可以全局定义,也可以按堆栈定义。在 global 下定义的密钥不受 stackName 更改的影响,并在新的堆栈下重新部署时保留。在 stack 下定义的密钥将在新的 stackName 下重新部署堆栈时被删除(前提是启用了 SSOT 模式)。要引用在 stack 下定义的密钥,请使用以下格式:<stackname>_<secretkey>,例如 mystack_test

secrets:
  # optional - global secrets are not affected by stackName changes
  global:
    foo: ${self:custom.config.secrets.foo}
    hello: ${self:custom.config.secrets.hello}
  # optional - stack secrets (formatted as <stackname>_<secretkey>)
  stack:
    test: ${self:custom.config.secrets.test}

类型和模式验证

我们提供基于 JSON 模式自动生成的文档:

有关类型的更多信息,请参见此处。具体来说,是以 Y 开头的类型(例如 YRelayer)。对于模式,你可以查看 docs-schema 文件夹。

此外,还提供了一个示例项目,其中提供了可以在 serverless.yml 文件中定义的大多数属性。

命令

Deploy

你可以使用 sls deploy 将当前堆栈部署到 Defender。

deploy 接受一个可选的 --stage 标志,当从上面的模板安装时,该标志默认为 dev

此外,serverless.yml 可能包含一个 ssot 属性。有关更多信息,请参见 SSOT 模式 部分。

此命令将在当前工作目录的 .defender 文件夹中附加一个日志条目。此外,如果创建了任何新的 relayer 密钥,这些密钥将作为 JSON 对象存储在 .defender/relayer-keys 文件夹中。

从模板安装时,我们确保 .defender 文件夹被任何 git 提交忽略。但是,当直接安装时,请确保将此文件夹添加到你的 .gitignore 文件中。

Info

你可以使用 sls info 来检索 serverless.yml 文件中定义的每个资源的信息,包括唯一标识符和每个组件独有的属性。

Remove

你可以使用 sls remove 从 Defender 中删除 serverless.yml 文件中定义的所有资源。

为了避免潜在的资金损失,Relayer 只能直接从 Defender UI 中删除。

Logs

你可以使用 sls logs --function <stack_resource_id> 来检索给定 action 标识符(例如 mystack.action-example-1)的最新 action 日志。此命令将持续运行,并每 2 秒检索一次日志。

Invoke

你可以使用 sls invoke --function <stack_resource_id> 来手动运行一个 action,给定它的标识符(例如 mystack.action-example-1)。

每个命令都有一个到 JSON 对象的标准输出。

注意事项

deploy 过程中抛出的错误不会恢复任何先前的更改。常见的错误是:

  • 未设置 API 密钥和 secret

  • API 密钥的权限不足

  • serverless.yml 文件的验证错误(请参见 类型和架构验证

通常,修复错误并重试部署就足够了,因为任何现有资源都将属于部署的 update 子句。但是,如果不确定,你可以随时调用 sls remove 来删除整个堆栈,然后重试。

Action 密钥是加密的键值对,并在运行时注入到 lambda 环境中。密钥会自动作用于所有 action。或者,你可以使用 environment-variables 来定义作用于单个 action 的键值对,并通过 process.env 在运行时可用。请注意,这些值未加密。

← 升级 action 依赖项

Remix 插件 →

  • 原文链接: docs.openzeppelin.com/de...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
OpenZeppelin
OpenZeppelin
江湖只有他的大名,没有他的介绍。