web-dev-qa-db-fra.com

Accès refusé à l'aide de boto3 via aws Lambda

J'utilise le pipeline de traitement de données constitué de 

S3 + SNS + Lambda

parce que S3 ne peut pas envoyer de notification en dehors de sa région de stockage, j'ai donc utilisé SNS pour envoyer une notification S3 à Lambda dans une autre région.

La fonction lambda codée avec

from __future__ import print_function
import boto3


def lambda_handler (event, context):
    input_file_bucket = event["Records"][0]["s3"]["bucket"]["name"]
    input_file_key = event["Records"][0]["s3"]["object"]["key"]

    input_file_name = input_file_bucket+"/"+input_file_key

    s3=boto3.resource("s3")
    obj = s3.Object(bucket_name=input_file_bucket, key=input_file_key)
    response = obj.get()

    return event #echo first key valuesdf

quand j'ai exécuté enregistrer et tester, j'ai eu l'erreur suivante

    {
  "stackTrace": [
    [
      "/var/task/lambda_function.py",
      20,
      "lambda_handler",
      "response = obj.get()"
    ],
    [
      "/var/runtime/boto3/resources/factory.py",
      394,
      "do_action",
      "response = action(self, *args, **kwargs)"
    ],
    [
      "/var/runtime/boto3/resources/action.py",
      77,
      "__call__",
      "response = getattr(parent.meta.client, operation_name)(**params)"
    ],
    [
      "/var/runtime/botocore/client.py",
      310,
      "_api_call",
      "return self._make_api_call(operation_name, kwargs)"
    ],
    [
      "/var/runtime/botocore/client.py",
      395,
      "_make_api_call",
      "raise ClientError(parsed_response, operation_name)"
    ]
  ],
  "errorType": "ClientError",
  "errorMessage": "An error occurred (AccessDenied) when calling the GetObject operation: Access Denied"
}

J'ai configuré le rôle lambda avec

full S3 access

et définir la politique de compartiment sur mon compartiment cible

everyone can do anything(list, delete, etc.)

Il semble que je n’ai pas bien défini la politique.

7
Hello lad

Possibilité de l'objet S3 spécifique que vous recherchez est d'avoir des autorisations limitées

4
omuthu

J'ai eu un problème similaire, je l'ai résolu en attachant la stratégie appropriée à mon utilisateur.

IAM -> Utilisateurs -> Nom d'utilisateur -> Autorisations -> Attacher la stratégie.

Assurez-vous également que vous ajoutez la clé d'accès correcte et la clé d'accès secrète. Pour ce faire, utilisez AmazonCLI.

12
Amri

En ajoutant à la réponse d'Amri, si votre compartiment est privé et que vous disposez des informations d'identification pour y accéder, vous pouvez utiliser le boto3.client:

import boto3
s3 = boto3.client('s3',aws_access_key_id='ACCESS_KEY',aws_secret_access_key='SECRET_KEY')
response = s3.get_object(Bucket='BUCKET', Key='KEY')

* Pour ce fichier: s3: //bucket/a/b/c/some.text, Bucket est 'bucket' et Key est 'a/b/c/some.text'

3
Tal Joffe

La réponse d'Omuthu identifiait correctement mon problème, mais comme elle ne fournissait pas de solution, je pensais le faire.

Il est possible que lorsque vous configurez vos autorisations dans IAM, vous obteniez quelque chose comme ceci:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test"
            ]
        }
    ]
}

Malheureusement, ce n'est pas correct. Vous devez appliquer les autorisations d'objet aux objets du compartiment. Donc, il doit ressembler à ceci:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::test"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::test/*"
            ]
        }
    ]
}

Notez le deuxième ARN avec le /* à la fin.

3
Rob Rose

J'ai eu un problème similaire, la différence était que le seau était crypté en clé KMS. 

Corrigé avec: IAM -> Clés de chiffrement -> YOUR_AWS_KMS_KEY -> à votre politique ou à votre compte

1
MiaeKim