feat(dynamic-secret): Add custom tags to AWS IAM dynamic secret

This commit is contained in:
carlosmonastyrski
2025-06-17 16:06:35 -03:00
parent bfee34f38d
commit 489bd124d2
12 changed files with 96 additions and 18 deletions
@@ -80,6 +80,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) =>
environmentSlug: z.string().describe(DYNAMIC_SECRETS.CREATE.environmentSlug).min(1),
name: slugSchema({ min: 1, max: 64, field: "Name" }).describe(DYNAMIC_SECRETS.CREATE.name),
metadata: ResourceMetadataSchema.optional(),
tags: ResourceMetadataSchema.optional(),
usernameTemplate: userTemplateSchema.optional()
}),
response: {
@@ -146,6 +147,7 @@ export const registerDynamicSecretRouter = async (server: FastifyZodProvider) =>
.nullable(),
newName: z.string().describe(DYNAMIC_SECRETS.UPDATE.newName).optional(),
metadata: ResourceMetadataSchema.optional(),
tags: ResourceMetadataSchema.optional(),
usernameTemplate: userTemplateSchema.nullable().optional()
})
}),
@@ -166,6 +166,7 @@ export const dynamicSecretLeaseServiceFactory = ({
usernameTemplate: dynamicSecretCfg.usernameTemplate,
identity,
metadata: { projectId },
tags: dynamicSecretCfg.tags as Record<string, string>[] | undefined,
config
});
} catch (error: unknown) {
@@ -79,6 +79,7 @@ export const dynamicSecretServiceFactory = ({
defaultTTL,
actorAuthMethod,
metadata,
tags,
usernameTemplate
}: TCreateDynamicSecretDTO) => {
const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId);
@@ -165,7 +166,8 @@ export const dynamicSecretServiceFactory = ({
folderId: folder.id,
name,
gatewayId: selectedGatewayId,
usernameTemplate
usernameTemplate,
tags: JSON.stringify(tags)
},
tx
);
@@ -202,6 +204,7 @@ export const dynamicSecretServiceFactory = ({
actorOrgId,
actorAuthMethod,
metadata,
tags,
usernameTemplate
}: TUpdateDynamicSecretDTO) => {
const project = await projectDAL.findProjectBySlug(projectSlug, actorOrgId);
@@ -315,7 +318,8 @@ export const dynamicSecretServiceFactory = ({
name: newName ?? name,
status: null,
gatewayId: selectedGatewayId,
usernameTemplate
usernameTemplate,
tags: JSON.stringify(tags)
},
tx
);
@@ -23,6 +23,7 @@ export type TCreateDynamicSecretDTO = {
projectSlug: string;
metadata?: ResourceMetadataDTO;
usernameTemplate?: string | null;
tags?: ResourceMetadataDTO;
} & Omit<TProjectPermission, "projectId">;
export type TUpdateDynamicSecretDTO = {
@@ -35,6 +36,7 @@ export type TUpdateDynamicSecretDTO = {
inputs?: TProvider["inputs"];
projectSlug: string;
metadata?: ResourceMetadataDTO;
tags?: ResourceMetadataDTO;
usernameTemplate?: string | null;
} & Omit<TProjectPermission, "projectId">;
@@ -119,20 +119,31 @@ export const AwsIamProvider = (): TDynamicProviderFns => {
identity?: {
name: string;
};
tags?: Record<string, string>[];
metadata: { projectId: string };
}) => {
const { inputs, usernameTemplate, metadata, identity } = data;
const { inputs, usernameTemplate, metadata, identity, tags } = data;
const providerInputs = await validateProviderInputs(inputs);
const client = await $getClient(providerInputs, metadata.projectId);
const username = generateUsername(usernameTemplate, identity);
const { policyArns, userGroups, policyDocument, awsPath, permissionBoundaryPolicyArn } = providerInputs;
const awsTags = [{ Key: "createdBy", Value: "infisical-dynamic-secret" }];
if (tags && Array.isArray(tags)) {
const additionalTags = tags.map((tag) => ({
Key: tag.key,
Value: tag.value
}));
awsTags.push(...additionalTags);
}
const createUserRes = await client.send(
new CreateUserCommand({
Path: awsPath,
PermissionsBoundary: permissionBoundaryPolicyArn || undefined,
Tags: [{ Key: "createdBy", Value: "infisical-dynamic-secret" }],
Tags: awsTags,
UserName: username
})
);
@@ -525,6 +525,7 @@ export type TDynamicProviderFns = {
name: string;
};
metadata: { projectId: string };
tags?: Record<string, string>[];
config?: TDynamicSecretLeaseConfig;
}) => Promise<{ entityId: string; data: unknown }>;
validateConnection: (inputs: unknown, metadata: { projectId: string }) => Promise<boolean>;