2017-11-10 8 views
0

S3 버킷을 생성하고 즉시 람다 알림 이벤트를 할당하려고합니다.S3 버킷 람다 이벤트 : 다음 대상 구성의 유효성을 검사 할 수 없습니다.

const aws = require('aws-sdk'); 
const uuidv4 = require('uuid/v4'); 

aws.config.update({ 
    accessKeyId: 'key', 
    secretAccessKey:'secret', 
    region: 'us-west-1' 
}); 

const s3 = new aws.S3(); 

const params = { 
    Bucket: `bucket-${uuidv4()}`, 
    ACL: "private", 
    CreateBucketConfiguration: { 
    LocationConstraint: 'us-west-1' 
    } 
}; 

s3.createBucket(params, function (err, data) { 
    if (err) { 
    throw err; 
    } else { 
    const bucketUrl = data.Location; 

    const bucketNameRegex = /bucket-[a-z0-9\-]+/; 
    const bucketName = bucketNameRegex.exec(bucketUrl)[0]; 

    const params = { 
     Bucket: bucketName, 
     NotificationConfiguration: { 
     LambdaFunctionConfigurations: [ 
      { 
      Id: `lambda-upload-notification-${bucketName}`, 
      LambdaFunctionArn: 'arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload', 
      Events: ['s3:ObjectCreated:CompleteMultipartUpload'] 
      }, 
     ] 
     } 
    }; 

    // Throws "Unable to validate the following destination configurations" until an event is manually added and deleted from the bucket in the AWS UI Console 
    s3.putBucketNotificationConfiguration(params, function(err, data) { 
     if (err) { 
     console.error(err); 
     console.error(this.httpResponse.body.toString()); 
     } else { 
     console.log(data); 
     } 
    }); 
    } 
}); 

창조가 잘 작동하지만 aws-sdk에서 s3.putBucketNotificationConfiguration를 호출하면 발생합니다 :

{ InvalidArgument: Unable to validate the following destination configurations 
    at Request.extractError ([...]/node_modules/aws-sdk/lib/services/s3.js:577:35) 
    at Request.callListeners ([...]/node_modules/aws-sdk/lib/sequential_executor.js:105:20) 
    at Request.emit ([...]/node_modules/aws-sdk/lib/sequential_executor.js:77:10) 
    at Request.emit ([...]/node_modules/aws-sdk/lib/request.js:683:14) 
    at Request.transition ([...]/node_modules/aws-sdk/lib/request.js:22:10) 
    at AcceptorStateMachine.runTo ([...]/node_modules/aws-sdk/lib/state_machine.js:14:12) 
    at [...]/node_modules/aws-sdk/lib/state_machine.js:26:10 
    at Request.<anonymous> ([...]/node_modules/aws-sdk/lib/request.js:38:9) 
    at Request.<anonymous> ([...]/node_modules/aws-sdk/lib/request.js:685:12) 
    at Request.callListeners ([...]/node_modules/aws-sdk/lib/sequential_executor.js:115:18) 
    message: 'Unable to validate the following destination configurations', 
    code: 'InvalidArgument', 
    region: null, 
    time: 2017-11-10T02:55:43.004Z, 
    requestId: '9E1CB35811ED5828', 
    extendedRequestId: 'tWcmPfrAu3As74M/0sJL5uv+pLmaD4oBJXwjzlcoOBsTBh99iRAtzAloSY/LzinSQYmj46cwyfQ=', 
    cfId: undefined, 
    statusCode: 400, 
    retryable: false, 
    retryDelay: 4.3270874729153475 } 

<?xml version="1.0" encoding="UTF-8"?> 
<Error> 
    <Code>InvalidArgument</Code> 
    <Message>Unable to validate the following destination configurations</Message> 
    <ArgumentName1>arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload, null</ArgumentName1> 
    <ArgumentValue1>Not authorized to invoke function [arn:aws:lambda:us-west-1:xxxxxxxxxx:function:respondS3Upload]</ArgumentValue1> 
    <RequestId>9E1CB35811ED5828</RequestId> 
    <HostId>tWcmPfrAu3As74M/0sJL5uv+pLmaD4oBJXwjzlcoOBsTBh99iRAtzAloSY/LzinSQYmj46cwyfQ=</HostId> 
</Error> 

나는에 할당 된 역할을 실행 한 다음

은 내가 쓴 노드 테스트 스크립트입니다 나는 그것이 필요한 모든 정책이라고 생각하는 람다를 사용한다. 나는 뭔가를 놓칠 수 있습니다. 이 스크립트를 실행하려면 루트 액세스 키를 사용하고 있습니다.

Role

가 나는 S3가 이벤트를 추가하기 전에 버킷을 만들 시간이 필요 타이밍 오류가있을 수 있습니다 생각했지만, 나는 잠시 기다렸다, 버킷 이름을 하드 코딩, 그리고 다시는 내 스크립트를 실행 같은 오류가 발생합니다.

이상한 점은 S3 UI에 이벤트 훅을 만들고 즉시 삭제하면 그 버킷 이름을 하드 코딩하면 스크립트가 작동한다는 것입니다. UI에서 이벤트를 만드는 것이 필요한 권한을 추가하는 것처럼 보이지만 SDK 또는 콘솔 UI에 무엇이 있는지 확실하지 않습니다.

S3 Event Config

어떤 생각하거나 시도하는 것? 도움을 주셔서 감사합니다

답변

2

s3 버킷에 람다 함수 호출 권한이 없으므로이 메시지가 표시됩니다.

AWS documentation에 따르면! 필요한 권한의 두 가지 유형이 있습니다

  1. 권한 아마존 S3는 당신의 람다 함수를 호출하기 위해 람다 함수가 서비스
  2. 권한을 호출하려면 당신은 AWS '형식의 개체를 만들어야합니다

: : Lambda :: Permission '그리고 이것과 비슷하게 보일 것입니다 :

{ 
    "Version": "2012-10-17", 
    "Id": "default", 
    "Statement": [ 
    { 
     "Sid": "<optional>", 
     "Effect": "Allow", 
     "Principal": { 
     "Service": "s3.amazonaws.com" 
     }, 
     "Action": "lambda:InvokeFunction", 
     "Resource": "<ArnToYourFunction>", 
     "Condition": { 
     "StringEquals": { 
      "AWS:SourceAccount": "<YourAccountId>" 
     }, 
     "ArnLike": { 
      "AWS:SourceArn": "arn:aws:s3:::<YourBucketName>" 
     } 
     } 
    } 
    ] 
}