Accéder aux objets de godet S3 via CDN à l’aide de Cognito User Pool Auth et Lambda Edge

Dans ce blog, je vous guiderai à travers les étapes pour sécuriser l’accès aux objets S3 à l’aide d’Amazon CloudFront (CDN) intégré à Amazon Cognito Authentication. L’objectif est de s’éloigner des URL pré-signées facilement partageables et de faire respecter l’utilisateur dans un accès authentifié basé sur le pool d’utilisateurs de Cognito. Par exemple, une équipe peut avoir besoin d’accéder aux PDF sensibles, mais ne veut pas que le risque de transmettre à ces liens soit transmis aux utilisateurs non autorisés. En protégeant le contenu derrière une page de connexion Cognito, seuls les utilisateurs vérifiés de cette équipe peuvent accéder aux fichiers via le lien CDN, garantissant que les données sensibles stockées dans S3 sont livrées en toute sécurité et uniquement aux bonnes personnes.
Avant de plonger dans la configuration, passons brièvement en revue les services Core AWS impliqués:
- CloudFront (CDN) avec des comportements personnalisés et des origines S3 pour cache et fournir efficacement le contenu.
- Bodet S3 comme stockage sécurisé pour vos fichiers.
- Pool utilisateur de Cognito pour gérer l’authentification et le contrôle d’accès des utilisateurs
- Lambda Edge
Comment fonctionne le flux?
- L’utilisateur demande un fichier → Exemple: https://mycdn.com/protected/report.pdf
- Le comportement CloudFront correspond / Protégé / * Chemin → Ce comportement est configuré avec:
- Origine → Bodet S3 (où vivent vos fichiers)
- Lambda @ Edge (déclencheur de la demande de la visionneuse) → Exécute avant d’aller à l’origine pour vérifier l’authentification.
- Lambda @ Edge vérifie le cookie de la session Cognito →
- Si pas de cookie → rediriger l’utilisateur vers la page de connexion Cognito.
- Si le cookie présente → Validez-le.
- L’utilisateur se connecte via Cognito User Pool → Cognito vérifie les informations d’identification.
- Étape de rappel: une fois que l’utilisateur vous indique, Cognito les envoie au point de terminaison / rappel avec un code d’autorisation. Un deuxième Lambda @ Edge s’exécute ici, échange le code (ou le simule dans votre code), définit un cookie de session, puis redirige l’utilisateur vers le chemin / le chemin protégé / *.
- Lambda @ Edge valide à nouveau la demande → maintenant, l’utilisateur est authentifié.
- CloudFront transmet la demande à S3 Origin → Retronce le fichier réel (report.pdf).
- L’utilisateur obtient le fichier en toute sécurité → le fichier est livré via CloudFront uniquement après le passage de la connexion Cognito.
Pour faire ce cas d’utilisation, suivez les étapes ci-dessous

1.CDN

1.1 Origine CDN

1.2 Comportement CDN

1.3 Comportement de rappel

1.4 Comportement protégé
Pool utilisateur –

2. Pool utilisateur
Client de l’application-
Créer un utilisateur avec un ID de messagerie qui souhaite accéder au fichier Nous pouvons créer un e-mail de groupe commun et l’équipe entière peut l’utiliser pour s’authentifier lors de l’accès au fichier. Passez une note de l’ID client, de l’ID de pool d’utilisateurs et définissez URL de rappel autorisé (définissez-le comme

2.1. application de l’application

2.2 Cognito-User-Creation
Premier code lambda utilisé dans le comportement CDN protégé
importer urllib.parse
# ===== config =====
Cognito_region = « ap-sud-1 »
App_client_id = « 2nlgjvvk6a6lj21n0t67fq1itj »
App_client_secret = “LT4M91RBGQVOVB5P1VKPBUJE4VABIBTIKRSLBD1SSNGG8NUT4S5”
CoGnito_domain = «https://ap-south-1edktvejzx.auth.ap-south-1.amazoncognito.com»
Redirect_uri = «https://d21wc134unren9.cloudfront.net/callback»
Protected_uri = ”/ protected / s3_cost_optimisation_summary.xlsx_0.ods »
def lambda_handler (événement, contexte):
demande = événement[‘Records’][0][‘cf’][‘request’]
en-têtes = request.get (‘en-têtes’, {})Imprimer («Débogage: demande entrante URI:», demande[‘uri’])
# Vérifiez si la demande concerne le chemin protégé
Si demande[‘uri’].startswith (protected_uri):
Imprimer («Debug: chemin protégé demandé»)
# Vérifiez le cookie de session
cookies = en-têtes.get (‘cookie’, [])
Has_Session = any (‘cognitoauthSession’ en cookie[‘value’] pour les biscuits dans les cookies)Si ce n’est pas la session:
# Rediriger vers Cognito Connexion
login_url = (
f « {coGnito_domain} / se connecter? »
f ”client_id = {app_client_id} &”
f ”redirect_uri = {urllib.parse.quote (redirect_uri)} &”
f ”Response_Type = Code &”
f ”scope = openID + e-mail + téléphone»
)
Imprimer («Débogage: aucune session trouvée, rediriger vers Cognito Connexion:», Login_url)
retour {
«Statut»: «302»,
«StatusDescription»: «Found»,
‘Headers’: {
’emplacement’: [{‘key’: ‘Location’, ‘value’: login_url}]
}
}
autre:
Imprimer («Débogage: cookie de session trouvé, permettant l’accès»)
autre:
Imprimer («Debug: URI non protégé, passant»)demande de retour
Deuxième code Lambda Edge utilisé dans le comportement du CDN de rappel
importer urllib.parse
Importer la base64# ===== config =====
Cognito_region = « ap-sud-1 »
App_client_id = « 2nlgjvvk6a6lj21n0t67fq1itj »
App_client_secret = “LT4M91RBGQVOVB5P1VKPBUJE4VABIBTIKRSLBD1SSNGG8NUT4S5”
CoGnito_domain = «https://ap-south-1edktvejzx.auth.ap-south-1.amazoncognito.com»
Redirect_uri = «https://d21wc134unren9.cloudfront.net/callback»
= Protected_uri = ”/ protected / s3_cost_optimisation_summary.xlsx_0.ods »def lambda_handler (événement, contexte):
demande = événement[‘Records’][0][‘cf’][‘request’]
QueryString = request.get (‘QueryString’, « )Imprimer («Debug: demande de rappel reçu, Querrystring:», QueryString)
params = UrLlib.Parse.Parse_Qs (QueryString)
code = params.get (‘code’, [None])[0]Si ce n’est pas du code:
Imprimer («Débogage: aucun code d’autant trouvé dans Querrystring, passant la demande»)
demande de retourPrint («Debug: Auth Code reçu:», Code)
# Cookie de session factice (pour les tests)
session_cookie = base64.b64encode (code.encode ()). Decode ()Imprimer («Debug: définir le cookie de session et rediriger vers URI protégé:», Protected_uri)
retour {
«Statut»: «302»,
«StatusDescription»: «Found»,
‘Headers’: {
’emplacement’: [{‘key’: ‘Location’, ‘value’: PROTECTED_URI}],
‘Set-Cookie’: [{
‘key’: ‘Set-Cookie’,
‘value’: f’CognitoAuthSession={session_cookie}; Path=/; Secure; HttpOnly’
}]
}
}

S3-Config

S3-Object Path
Supposons que nous ayons un fichier placé quotidiennement sur le chemin S3 ci-dessus. Un travail d’automatisation s’exécute à un moment fixe, génère le fichier et le télécharge sur le seau S3.
Dans un scénario du monde réel, le nom du fichier peut inclure un horodatage ou une date (par exemple, file_name09052025). Dans de tels cas, nous pouvons améliorer le code lambda pour toujours choisir le dernier fichier et générer une URL CDN pour celui-ci, qui peut ensuite être partagé avec les utilisateurs finaux par e-mail.
Pour plus de simplicité dans cette démo, j’utilise un fichier statique nommé S3_cost_optimisation_summary.xlsx_0.odsdéjà placé dans le seau S3 et partageant directement son URL CDN avec l’utilisateur final.
Les utilisateurs finaux essaieront d’accéder au fichier via cette URL:
https://d21wc134unren9.cloudfront.net/protected/s3_cost_optimisation_summary.xlsx_0.ods
Étant donné que l’utilisateur n’est pas connecté, sa première demande à l’URL sera interceptée et redirigé vers la page de connexion Cognito pour l’authentification.

cognito-login-page.enter le nom d’utilisateur et le mot de passe pour l’utilisateur créé dans le pool utilisateur de services Congnito

cognito-login-username

Considérant la page de mots-passe

de fichier chargé de fichier
Dans cette configuration, nous avons parcouru la façon dont S3, CloudFront, Cognito et Lambda @ Edge peuvent fonctionner ensemble pour verrouiller l’accès aux fichiers. Au lieu de distribuer des liens publics, le contenu se trouve désormais en toute sécurité derrière une page de connexion, et seuls les bons utilisateurs peuvent le récupérer. La meilleure partie est que vous obtenez toujours la vitesse d’un CDN avec un fort contrôle d’accès. C’est un modèle simple que vous pouvez réutiliser chaque fois que vous avez besoin de partager des fichiers en toute sécurité sans exposer votre seau.
Merci d’avoir lu jusqu’à la fin – j’espère que vous repartirez avec quelque chose de pratique à appliquer
Vous avez trouvé cela utile? PARTAGEZ-LE
Source link