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.
Possibilité de l'objet S3 spécifique que vous recherchez est d'avoir des autorisations limitées
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.
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'
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.
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