Skip to content

Commit db7a9ab

Browse files
authored
fix(filemanager): ignore transient secret errors (#981)
* fix(filemanager): ignore transient errors and print error message better if it does occur * fix(filemanager): add DescribeSecret permission for Lambda role
1 parent f0accdb commit db7a9ab

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

lib/workload/stateless/stacks/filemanager/deploy/constructs/functions/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export class ApiFunction extends fn.Function {
3636
// Allow access to the access key secret.
3737
this.role.addToPolicy(
3838
new PolicyStatement({
39-
actions: ['secretsmanager:GetSecretValue'],
39+
actions: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'],
4040
resources: [`${props.accessKeySecretArn}-*`],
4141
})
4242
);

lib/workload/stateless/stacks/filemanager/filemanager/src/clients/aws/secrets_manager.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@ use crate::error::Error::{ParseError, SecretsManagerError};
66
use crate::error::Result;
77
use aws_credential_types::provider::ProvideCredentials;
88
use aws_credential_types::{provider, Credentials};
9+
use aws_sdk_s3::error::SdkError;
910
use aws_sdk_secretsmanager as secretsmanager;
11+
use aws_sdk_secretsmanager::error::DisplayErrorContext;
12+
use aws_sdk_secretsmanager::operation::get_secret_value::GetSecretValueError;
1013
use aws_secretsmanager_caching::output::GetSecretValueOutputDef;
1114
use aws_secretsmanager_caching::SecretsManagerCachingClient;
1215
use base64::prelude::Engine;
@@ -38,7 +41,7 @@ impl Client {
3841
secretsmanager::config::Builder::from(&config),
3942
NonZeroUsize::new(1).expect("valid non-zero usize"),
4043
Duration::from_secs(900),
41-
false,
44+
true,
4245
)
4346
.await
4447
.map_err(|err| SecretsManagerError(err.to_string()))?;
@@ -89,10 +92,16 @@ impl ProvideCredentials for SecretsManagerCredentials {
8992
impl SecretsManagerCredentials {
9093
/// Construct the credentials from the secret.
9194
pub async fn new(id: &str, client: &Client) -> Result<Self> {
92-
let secret = client
93-
.get_secret(id)
94-
.await
95-
.map_err(|err| SecretsManagerError(format!("no valid secret {}: {}", id, err)))?;
95+
let secret = client.get_secret(id).await.map_err(|err| {
96+
let sdk_err: Option<&SdkError<GetSecretValueError>> = err.downcast_ref();
97+
let display_err = if let Some(err) = sdk_err {
98+
DisplayErrorContext(&err).to_string()
99+
} else {
100+
err.to_string()
101+
};
102+
103+
SecretsManagerError(format!("no valid secret {}: {}", id, display_err))
104+
})?;
96105

97106
let secret = if let Some(string) = secret.secret_string {
98107
from_str(&string)?

0 commit comments

Comments
 (0)