Secret yönetimi
Credential değerlerini SecretResolver veya dosya reference ile startup sırasında çözün.
Broker password gibi deployment'a özel değerleri kaynak kodunda taşımak yerine configuration reference'ı kullanabilirsiniz. Lily reference'ı startup sırasında çözer, typed config'i doğrular ve immutable snapshot'a dönüştürür. Secret provider'ın nasıl kimlik doğruladığı ve hangi depoya eriştiği uygulamanızın seçimidir.
Desteklenen reference biçimleri#
[rabbitmq.consumer]
password = "${secret:broker.password}"Bu parça tam configuration değildir: ilk uygulamadaki consumer bölümünde yalnız password alanını değiştirin. ${secret:broker.password} uygulamanın SecretResolver sağlayıcısını çağırır. ${file:/run/secrets/rabbitmq_password} ise mutlak dosya yolundaki bounded UTF-8 değeri okur; dosya 1–8192 byte sınırındadır. Yol canonical ve mutlak, hedef normal bir dosya olmalıdır; symlink kabul edilmez. Dosya tam bir boş olmayan satır içermelidir: sondaki tek LF veya CRLF kaldırılır, içeride newline, CR veya NUL bulunması reddedilir.
Reference bütün alanın değeri olmalıdır. prefix-${secret:key} bir template değildir; ${env:NAME} bu API'nin secret reference şeması değildir. Environment override için configuration bölümündeki LILY__... yolunu kullanın. Queue, exchange ve routing key gibi topology kimliklerini açık, credential içermeyen değerler olarak tutun.
Uygulamanın resolver sağlayıcısını bağlayın#
lilyrs = { version = "0.1.0", features = ["consumer", "config"] }Aşağıdaki parça environment'tan tek bir allowlisted secret okuyan küçük bir adapter'dır. Environment okumasını Lily'nin reference parser'ı değil bu uygulama kodu yapar. Gerçek secret store kullandığınızda aynı trait içinde store client'ınızı çağırabilirsiniz.
use lilyrs::{
config::{ConfigError, SecretResolver},
consumer::{Consumer, ConsumerError},
};
struct ApplicationSecrets;
#[lilyrs::consumer::async_trait::async_trait]
impl SecretResolver for ApplicationSecrets {
async fn resolve(&self, key: &str) -> Result<String, ConfigError> {
if key != "broker.password" {
return Err(ConfigError::KeyNotFound(key.to_owned()));
}
std::env::var("BROKER_PASSWORD").map_err(|_| ConfigError::SecretResolveError {
key: key.to_owned(),
error: "required secret is unavailable".to_owned(),
})
}
}
async fn run_with_secrets() -> Result<(), ConsumerError> {
Consumer::builder().secret_resolver(ApplicationSecrets).run().await
}Bu fonksiyon mevcut handler'ların bulunduğu binary'de ve Tokio runtime içinde çağrılır. Resolver config yüklenmeden bağlanır. Hata mesajı secret'ın kendisini içermez. Hazır Vault, AWS veya başka sağlayıcı adapter'ının otomatik kurulması bu trait'in sözleşmesi değildir.
Caller-owned container ile kullanın#
.container(...) ve .secret_resolver(...) birlikte verilirse ownership çakışması reddedilir. Dış container yolunda resolver'ı ConfigService üzerinde oluşturup seed edin. Aşağıdaki parça önceki ApplicationSecrets tipini kullanır:
use std::sync::Arc;
use lilyrs::{
config::{ConfigOptions, ConfigService},
consumer::{ApplicationContainer, ConsumerBuilder},
};
async fn caller_owned_consumer()
-> Result<(ConsumerBuilder, Arc<ApplicationContainer>), Box<dyn std::error::Error>>
{
let config = ConfigService::with_options_and_secret_resolver(
ConfigOptions::production("./lily.toml"), ApplicationSecrets,
);
let container = Arc::new(ApplicationContainer::builder()
.seed_singleton(config).build().await?);
Ok((lilyrs::consumer::Consumer::builder().container(Arc::clone(&container)), container))
}Fonksiyon kaynakları üst owner'a döndürür; onları kapatmaz. Consumer sona erdiğinde dış container'ı kapatmak için aktif queue kullanıcılarının bitişini ve shutdown raporunu gözleyin. Bu sahiplik düzeninin tam akışı managed Consumer sayfasındadır.
Rotation ve güvenli tanılama#
Snapshot yüklendikten sonra resolver yeniden çağrılarak hot rotation yapılmaz. Secret değiştiğinde yeni application instance/startup gerekir. resolve_versioned ile provider generation veya lease metadata'sı taşınabilir; bu metadata kendi başına arka plan refresh mekanizması kurmaz.
ConfigSnapshot::redacted_values() tanılama için güvenli görünümü verir. Raw typed config'i, resolved string'i veya secret store yanıtını loglamayın. Secret çözümü broker connection credential'ını sağlar; mesaj gönderen kullanıcının kimliğini doğrulamak ayrı bir guard/uygulama politikasıdır.
Bu sayfanın kaynakları v0.1.0
Anlatım, incelenen framework commit’ine dayanır.