1 个不稳定版本
0.1.0 | 2023年5月13日 |
---|
#1648 in 过程宏
36KB
671 行
设置
除了这个crate,您还需要以下依赖项
[dependencies]
aws-config = "0.54.1"
aws-sdk-secretsmanager = "0.24.0"
serde_json = "1.0.93"
tokio = { version = "1.26.0", features = ["full"] }
如果您正在AWS Lambda内部运行,您应该已经拥有了其中大部分。
使用方法
简单使用(无环境特定密钥)
use secrets_manager_macro::build_secrets_struct;
#[tokio::main]
async fn main() {
#[derive(Debug)] // (you can have other annotations in addition to build_secrets_struct)
#[build_secrets_struct]
struct NoPrefixSecret {}
let secrets = NoPrefixSecret::new().await;
// secrets are properties of the struct, so you can now access them
assert_eq!(secrets.thirdKey.as_ref(), "thirdValue");
}
在编译过程中,宏将检查此密钥是否存在。它还接受几种其他大小写风格,所以 ExampleSecret
、example-secret
或 example_secret
都是可接受的。如果未找到有效的密钥或没有有效的AWS凭证,将抛出编译时错误。
接下来,它将使用密钥中的值向 ExampleSecret
结构体添加字段。在上面的例子中,firstKey
就是这些密钥之一。宏期望密钥值是JSON格式。如果不是这种情况,将抛出另一个编译时错误。
这些值显然不会被添加到您的代码中,这样做是危险的。它们仅在运行时使用,即在调用 new()
时使用。在这种情况下,生成的代码将寻找在编译过程中找到的密钥名称(ExampleSecret
、example-secret
或 example_secret
)。现在可以通过它们的名称访问密钥的值。
new
如果密钥不存在、值缺失或密钥值不是有效的JSON,将引发panic。这似乎是可接受的行为,因为我们已经在编译时检查了大部分信息,所以我们的代码崩溃的可能性很小。而且,没有密钥,大多数应用程序都无法运行,所以最好立即停止应用程序的运行。
使用环境特定密钥的使用方法
use secrets_manager_macro::build_secrets_struct;
#[tokio::main]
async fn main() {
std::env::set_var("ENV", "dev");
#[build_secrets_struct(envs = dev,prod)]
struct SecretsManagerTestSecret {}
let secrets = SecretsManagerTestSecret::new().await;
// secrets are properties of the struct, so you can now access them
assert_eq!(secrets.firstKey.as_ref(), "firstValue");
}
类似于上面的“简单”设置,宏将查找匹配项(ExampleSecret
、example-secret
或 example_secret
),但这次它们必须以前缀 envs
开头。例如,/dev/ExampleSecret
将匹配。再次提醒,如果没有凭证或指定的环境变量中缺少密钥,编译将失败。
接下来,它将使用 dev
密钥值向 ExampleSecret
结构体添加字段。(所以你现在需要一个名为 dev 的环境。这种限制将在将来消失。)在上面的例子中,firstKey
是这些密钥之一。像以前一样,宏期望密钥值是 JSON 格式。
这些值仅在运行时使用,即在调用 new()
时使用。此时,生成的代码将寻找在编译期间找到的密钥(ExampleSecret
、example-secret
或 example_secret
),并以前置 ENV
或 ENVIRONMENT
环境变量的内容。在上面的例子中,假设找到的密钥名为 example_secret
,代码将寻找 /dev/example_secret
。
与之前一样,如果密钥不存在、值缺失或密钥值不是有效的 JSON,则 new
将引发恐慌。
依赖项
~21–32MB
~544K SLoC