#secrets-manager #aws #macro

secrets-manager-macro

用于在您的应用程序中使用AWS Secrets Manager密钥的宏

1 个不稳定版本

0.1.0 2023年5月13日

#1648 in 过程宏

MIT 许可证

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");
}

在编译过程中,宏将检查此密钥是否存在。它还接受几种其他大小写风格,所以 ExampleSecretexample-secretexample_secret 都是可接受的。如果未找到有效的密钥或没有有效的AWS凭证,将抛出编译时错误。

接下来,它将使用密钥中的值向 ExampleSecret 结构体添加字段。在上面的例子中,firstKey 就是这些密钥之一。宏期望密钥值是JSON格式。如果不是这种情况,将抛出另一个编译时错误。

这些值显然不会被添加到您的代码中,这样做是危险的。它们仅在运行时使用,即在调用 new() 时使用。在这种情况下,生成的代码将寻找在编译过程中找到的密钥名称(ExampleSecretexample-secretexample_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");
}

类似于上面的“简单”设置,宏将查找匹配项(ExampleSecretexample-secretexample_secret),但这次它们必须以前缀 envs 开头。例如,/dev/ExampleSecret 将匹配。再次提醒,如果没有凭证或指定的环境变量中缺少密钥,编译将失败。

接下来,它将使用 dev 密钥值向 ExampleSecret 结构体添加字段。(所以你现在需要一个名为 dev 的环境。这种限制将在将来消失。)在上面的例子中,firstKey 是这些密钥之一。像以前一样,宏期望密钥值是 JSON 格式。

这些值仅在运行时使用,即在调用 new() 时使用。此时,生成的代码将寻找在编译期间找到的密钥(ExampleSecretexample-secretexample_secret),并以前置 ENVENVIRONMENT 环境变量的内容。在上面的例子中,假设找到的密钥名为 example_secret,代码将寻找 /dev/example_secret

与之前一样,如果密钥不存在、值缺失或密钥值不是有效的 JSON,则 new 将引发恐慌。

依赖项

~21–32MB
~544K SLoC