Automatisation de la configuration S3 Object Lambda à l’aide d’un modèle CloudFormation
Vous pouvez utiliser un modèle AWS CloudFormation pour créer rapidement un point d’accès Amazon S3 Object Lambda. Le modèle CloudFormation crée automatiquement des ressources pertinentes, configure les rôles AWS Identity and Access Management (IAM) et configure une fonction AWS Lambda qui gère automatiquement les demandes via le point d’accès Object Lambda. Avec le modèle CloudFormation, vous pouvez mettre en œuvre les bonnes pratiques, améliorer votre posture de sécurité et réduire les erreurs causées par les processus manuels.
Ce dépôt GitHub
La fonction Lambda fournie dans ce modèle n’exécute aucune transformation. Au lieu de cela, elle renvoie vos objets en l’état à partir de votre compartiment S3. Vous pouvez cloner la fonction et ajouter votre propre code de transformation pour modifier et traiter les données lorsqu’elles sont renvoyées vers une application. Pour plus d’informations sur la modification de votre fonction, consultez Modification de la fonction Lambda et Écriture de fonctions Lambda pour les points d’accès S3 Object Lambda.
Modification du modèle.
Création d’un nouveau point d’accès de prise en charge
S3 Object Lambda utilise deux points d’accès, un point d’accès Object Lambda et un point d’accès S3 standard, appelé point d’accès de prise en charge. Lorsque vous effectuez une demande auprès d’un point d’accès Object Lambda, S3 invoque Lambda en votre nom ou délègue la demande au point d’accès de prise en charge, en fonction de la configuration S3 Object Lambda. Vous pouvez créer un nouveau point d’accès de prise en charge en transmettant le paramètre suivant dans le cadre de la commande aws
cloudformation deploy
lors du déploiement du modèle.
CreateNewSupportingAccessPoint=true
Configuration d’une charge utile de fonction
Vous pouvez configurer une charge utile de manière à fournir des données supplémentaires à la fonction Lambda en transmettant le paramètre suivant dans le cadre de la commande aws cloudformation
deploy
lors du déploiement du modèle.
LambdaFunctionPayload="format=json"
Activation de la surveillance d’Amazon CloudWatch
Vous pouvez activer la surveillance CloudWatch en transmettant le paramètre suivant dans le cadre de la commande aws cloudformation deploy
lors du déploiement du modèle.
EnableCloudWatchMonitoring=true
Ce paramètre active votre point d’accès Object Lambda pour les métriques de demande Amazon S3 et crée deux alarmes CloudWatch pour surveiller les erreurs côté client et côté serveur.
Note
L’utilisation d’Amazon CloudWatch entraîne des coûts supplémentaires. Pour plus d’informations sur les métriques de demande Amazon S3, consultez Surveillance et journalisation des points d’accès.
Pour les informations de tarification, consultez Tarification CloudWatch
Configuration de la simultanéité provisionnée
Pour réduire la latence, vous pouvez configurer la simultanéité provisionnée pour la fonction Lambda qui soutient le point d’accès Object Lambda, en modifiant le modèle afin d’inclure les lignes suivantes sous Resources
.
LambdaFunctionVersion: Type: AWS::Lambda::Version Properties: FunctionName: !Ref LambdaFunction ProvisionedConcurrencyConfig: ProvisionedConcurrentExecutions: Integer
Note
Des frais supplémentaires pour le provisionnement simultané vous seront facturés. Pour plus d’informations sur la simultanéité provisionnée, consultez Gestion de la simultanéité provisionnée Lambda dans le Guide du développeur AWS Lambda.
Pour plus d’informations sur la tarification, consultez Tarification AWS Lambda
Modification de la fonction Lambda
Modification des valeurs d’en-tête d’une requête GetObject
Par défaut, la fonction Lambda transfère tous les en-têtes, à l’exception de Content-Length
et ETag
, de la demande d’URL pré-signée au client GetObject
. En fonction de votre code de transformation dans la fonction Lambda, vous pouvez choisir d’envoyer de nouvelles valeurs d’en-tête à la demande GetObject
du client.
Vous pouvez mettre à jour votre fonction Lambda pour envoyer de nouvelles valeurs d’en-tête en les transmettant dans l’opération d’API WriteGetObjectResponse
.
Par exemple, si votre fonction Lambda traduit du texte dans des objets Amazon S3 vers une autre langue, vous pouvez transmettre une nouvelle valeur dans l’en-tête Content-Language
. Pour ce faire, vous pouvez modifier la fonction writeResponse
comme suit :
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, ContentLanguage: '
my-new-language
' }).promise(); }
Pour obtenir la liste complète des en-têtes pris en charge, consultez WriteGetObjectResponse
dans la Référence d’API Amazon Simple Storage Service.
Renvoi des en-têtes de métadonnées
Vous pouvez mettre à jour votre fonction Lambda pour envoyer de nouvelles valeurs d’en-tête en les transmettant dans la demande d’opération d’API WriteGetObjectResponse
.
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest, 'my-new-header': '
my-new-value
' }, ...headers }).promise(); }
Renvoi d’un nouveau code de statut
Vous pouvez renvoyer un code de statut personnalisé au client GetObject
en transmettant ce code dans la demande d’opération d’API WriteGetObjectResponse
.
async function writeResponse (s3Client: S3, requestContext: GetObjectContext, transformedObject: Buffer, headers: Headers): Promise<PromiseResult<{}, AWSError>> { const { algorithm, digest } = getChecksum(transformedObject); return s3Client.writeGetObjectResponse({ RequestRoute: requestContext.outputRoute, RequestToken: requestContext.outputToken, Body: transformedObject, Metadata: { 'body-checksum-algorithm': algorithm, 'body-checksum-digest': digest }, ...headers, StatusCode:
Integer
}).promise(); }
Pour obtenir la liste complète des codes de statut pris en charge, consultez WriteGetObjectResponse
dans la Référence d’API Amazon Simple Storage Service.
Application des paramètres Range
et partNumber
à l’objet source
Par défaut, le point d’accès Object Lambda créé par le modèle CloudFormation peut gérer les paramètres Range
et partNumber
. La fonction Lambda applique la plage ou le numéro de partie demandé à l’objet transformé. Pour ce faire, la fonction doit télécharger l’objet entier et exécuter la transformation. Dans certains cas, vos plages d’objets transformés peuvent correspondre exactement à vos plages d’objets source. Cela signifie que la demande de plage d’octets A-B sur votre objet source et l’exécution de la transformation peuvent fournir le même résultat que la demande de l’objet entier, l’exécution de la transformation et le renvoi de la plage d’octets A-B sur l’objet transformé.
Dans ce cas, vous pouvez modifier l’implémentation de la fonction Lambda pour appliquer la plage ou le numéro de partie directement à l’objet source. Cette approche réduit la latence globale de la fonction ainsi que la mémoire requise. Pour plus d’informations, consultez Utilisation des en-têtes Range et partNumber.
Désactivation de la gestion de Range
et partNumber
Par défaut, le point d’accès Object Lambda créé par le modèle CloudFormation peut gérer les paramètres Range
et partNumber
. Si vous n’avez pas besoin de ce comportement, vous pouvez le désactiver en supprimant les lignes suivantes du modèle :
AllowedFeatures: - GetObject-Range - GetObject-PartNumber - HeadObject-Range - HeadObject-PartNumber
Transformation de large objets
Par défaut, la fonction Lambda traite l’ensemble de l’objet en mémoire avant de pouvoir commencer à diffuser la réponse vers S3 Object Lambda. Vous pouvez modifier la fonction pour diffuser la réponse au fur et à mesure qu’elle effectue la transformation. Cela permet de réduire la latence de transformation et la mémoire de la fonction Lambda. Pour obtenir un exemple de mise en œuvre, consultez Stream compressed content example (Exemple de diffusion de contenu compressé).