本文介绍了Defender as Code (DaC) 插件,它是一个Serverless Framework插件,用于自动化资源管理和配置即代码。
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-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
属性下设置 key
和 secret
。我们建议使用环境变量或安全的(被 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}
...
...
在 serverless.yml
文件中的 provider
属性下,你可以选择性地添加一个 ssot
布尔值。SSOT 或单一信息源,确保你在 Defender 中的堆栈状态与 serverless.yml
模板完全同步。
这意味着所有未在当前模板文件中定义的资源,在部署时将从 Defender 中删除,Relayer 除外。如果在模板中未定义 SSOT,则默认为 false
。
从 serverless.yml
文件中删除的任何资源都不会自动删除,以防止意外删除资源。要使此行为符合预期,必须启用 SSOT 模式。
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
文件中定义的大多数属性。
你可以使用 sls deploy
将当前堆栈部署到 Defender。
deploy 接受一个可选的 --stage
标志,当从上面的模板安装时,该标志默认为 dev
。
此外,serverless.yml
可能包含一个 ssot
属性。有关更多信息,请参见 SSOT 模式 部分。
此命令将在当前工作目录的 .defender
文件夹中附加一个日志条目。此外,如果创建了任何新的 relayer 密钥,这些密钥将作为 JSON 对象存储在 .defender/relayer-keys
文件夹中。
从模板安装时,我们确保 .defender 文件夹被任何 git 提交忽略。但是,当直接安装时,请确保将此文件夹添加到你的 .gitignore 文件中。 |
你可以使用 sls info
来检索 serverless.yml
文件中定义的每个资源的信息,包括唯一标识符和每个组件独有的属性。
你可以使用 sls remove
从 Defender 中删除 serverless.yml
文件中定义的所有资源。
为了避免潜在的资金损失,Relayer 只能直接从 Defender UI 中删除。 |
你可以使用 sls logs --function <stack_resource_id>
来检索给定 action 标识符(例如 mystack.action-example-1)的最新 action 日志。此命令将持续运行,并每 2 秒检索一次日志。
你可以使用 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
在运行时可用。请注意,这些值未加密。
- 原文链接: docs.openzeppelin.com/de...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!