From e8ab19962b1810e90893470903398d38c011ef6a Mon Sep 17 00:00:00 2001 From: Gabriel Radureau Date: Sun, 26 Jul 2026 11:43:04 +0200 Subject: [PATCH] =?UTF-8?q?fix(minio)=20=E2=80=94=20le=20provisionneur=20n?= =?UTF-8?q?e=20pouvait=20pas=20cr=C3=A9er=20de=20bucket=20:=20s3:ListBucke?= =?UTF-8?q?t=20manquait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le premier apply réel (kadans) a créé la politique, le compte de service, l'attachement et le secret Vault — puis a échoué sur le bucket lui-même : Error: [FATAL] unable to check bucket (kadans-videos): Access Denied. Le provider teste l'existence du bucket AVANT de le créer (HeadBucket), et MinIO exige `s3:ListBucket` pour ça. C'est le seul point que l'ADR annonçait comme non éprouvé ; il l'est maintenant. `s3:ListBucket` donne la vue des CLÉS d'un bucket, pas leur contenu : GetObject / PutObject restent absents, donc le provisionneur — partagé entre les rôles CI — ne peut toujours pas lire les vidéos d'une autre application. Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01CoafGWmRVESaWX819USUUA --- minio/iac/provisioner.tf | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/minio/iac/provisioner.tf b/minio/iac/provisioner.tf index 43be8c1..78f73e0 100644 --- a/minio/iac/provisioner.tf +++ b/minio/iac/provisioner.tf @@ -3,8 +3,9 @@ # qu'elles déclarent leurs buckets sans qu'on leur confie le root. # Décisions : factory/doc/adr/20260726-stockage-objet-minio.md # -# ⚠ Noms d'actions issus de la documentation MinIO, NON éprouvés contre le -# serveur : le premier apply les confirmera ou les corrigera. +# Noms d'actions confirmés par le premier apply réel (kadans, 2026-07-26) : le +# bloc admin passe tel quel ; côté s3 il manquait `s3:ListBucket`, que le +# provider appelle AVANT de créer un bucket pour savoir s'il existe déjà. resource "minio_iam_policy" "provisioner" { name = "provisioner" policy = jsonencode({ @@ -26,9 +27,15 @@ resource "minio_iam_policy" "provisioner" { Resource = ["arn:aws:s3:::*"] }, { - # s3:GetObject / s3:PutObject volontairement ABSENTS. + # s3:GetObject / s3:PutObject volontairement ABSENTS : le provisionneur + # ne LIT ni n'ÉCRIT aucun objet, c'est ce qui rend son partage entre + # rôles CI acceptable. + # + # `s3:ListBucket` est la seule concession : MinIO le demande pour un + # HeadBucket, et le provider teste l'existence du bucket avant de le + # créer. Il donne la vue des CLÉS d'un bucket, jamais leur contenu. Effect = "Allow" - Action = ["s3:CreateBucket", "s3:DeleteBucket", "s3:ListAllMyBuckets", "s3:GetBucketLocation", "s3:GetBucketPolicy", "s3:PutBucketPolicy"] + Action = ["s3:CreateBucket", "s3:DeleteBucket", "s3:ListBucket", "s3:ListAllMyBuckets", "s3:GetBucketLocation", "s3:GetBucketPolicy", "s3:PutBucketPolicy"] Resource = ["arn:aws:s3:::*"] }, ]