web-dev-qa-db-fra.com

Stratégie S3 pour autoriser Lambda

J'ai la stratégie suivante sur un compartiment S3 créé avec le générateur de stratégie AWS pour permettre à un lambda, fonctionnant avec un rôle spécifique, d'accéder aux fichiers du compartiment. Cependant, lorsque j'exécute la Lambda, j'obtiens l'autorisation 403 refusée:

"errorMessage": "Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: <requestId>)",
  "errorType": "com.amazonaws.services.s3.model.AmazonS3Exception",

La politique sur le compartiment S3:

{
"Version": "2012-10-17",
"Id": "Policy<number>",
"Statement": [
    {
        "Sid": "Stmt<number>",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::<account>:role/<roleName>"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::<bucketName>/*"
    }
]
}

Quel est le problème avec la politique? Lamba s'exécute avec le rôle configuré dans la stratégie.

12
FiguringThisOut

Un rôle attribué à une fonction AWS Lambda doit être créé un rôle AWS Lambda (sélectionné lors de la création d'un rôle dans la console IAM).

Rôles n'ont pas de principal car les autorisations sont affectées au service (dans ce cas, la fonction Lambda) qui utilise le rôle.

En outre, vous devez attribuer des autorisations sur le compartiment lui-même (par exemple pour répertorier le contenu) et sur le contenu du compartiment (par exemple, sur GetObject).

Ce serait quelque chose comme ceci:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123XXX:role/service-role/LAMBDA_ROLE_NAME"
            },
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
17
John Rotenstein

Après avoir bouclé pendant que je pouvais le faire fonctionner, le processus est le suivant:

  1. créer le seau s3.
  2. créer la stratégie IAM (nom du compartiment requis)
  3. Créer un rôle IAM (stratégie IAM nécessaire)
  4. Créer une fonction lambda (rôle IAM nécessaire)
  5. Créer une stratégie de compartiment s3 (nom de fonction lambda nécessaire)

Politique IAM:

 {
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Stmt*******",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:PutObjectTagging",
            "s3:PutObjectVersionAcl",
            "s3:PutObjectVersionTagging"
        ],
        "Resource": [
            "arn:aws:s3:::<bucket-name>"
        ]
    }
]
}

et j'utilise cette politique sur le s3 seau

{
"Id": "Policy************",
"Version": "2012-10-17",
"Statement": [
{
  "Sid": "Stmt********",
  "Action": [
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectTagging",
    "s3:PutObjectVersionAcl",
    "s3:PutObjectVersionTagging"
  ],
  "Effect": "Allow",
  "Resource": "arn:aws:s3:::<bucket-name>/*",
  "Principal": {
    "AWS": [
      "arn:aws:iam::*********:role/<lambda-function-name>"
          ]
          }
        }
     ]
}
6
Cristian Sepulveda