2017-12-22 40 views
0

FaaS에서 Node + aws-sdk를 사용하면 파일을 S3 버킷에 업로드 할 수 있도록 미리 지정된 URL을 얻으려고합니다. 파일을 업로드하면 다음과 같은 응답이 표시됩니다.노드/타이프 스크립트를 사용하여 서명 된 S3 URL을 얻으려면 어떻게해야합니까?

InvalidAccessKeyId 제공하신 AWS 액세스 키 ID가 Google 기록에 없습니다.

// getUploadUrl 
import { FunctionEvent } from 'graphcool-lib' 
import * as AWS from 'aws-sdk' 

const BUCKET = process.env['BUCKET']; 
const AWS_ACCESS_KEY_ID = process.env['AWS_ACCESS_KEY_ID']; 
const AWS_SECRET_ACCESS_KEY = process.env['AWS_SECRET_ACCESS_KEY']; 

const signedUrlExpiresSeconds = 60*10; 

AWS.config.update({ 
    accessKeyId: AWS_ACCESS_KEY_ID, 
    secretAccessKey: AWS_SECRET_ACCESS_KEY, 
    region: 'eu-west-2' 
}); 

const s3 = new AWS.S3({ apiVersion: "2006-03-01" }) 

interface EventData { 
    fileName: string 
} 

export default async (event: FunctionEvent<EventData>) => { 

    if (!event.context.auth || !event.context.auth.nodeId) { 
    return { error: 'No user logged in.' } 
    } 

    try { 
    const { fileName } = event.data; 

    // Pre-signing a putObject (asynchronously) 
    const params = { Bucket: BUCKET, Key: fileName, Expires: signedUrlExpiresSeconds } 
    const uploadUrl: string = await s3.getSignedUrl('putObject', params) 

    if (!uploadUrl) { 
     return { error: 'Unable to get presigned upload URL from S3' } 
    } 



    return { data: { uploadUrl } } 
    } catch (e) { 
    console.log(e) 
    return { error: 'An unexpected error occured during password change.' } 
    } 
} 

여기가 파일

curl -v -T test.pdf presignedUrl 

어떤 아이디어를 업로드하려면 다음을 사용하고

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "VisualEditor0", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:PutObject", 
       "s3:GetObject" 
      ], 
      "Resource": "arn:aws:s3:::bucket-name/*" 
     } 
    ] 
} 

AWS IAM 내 권한은?

는 여기가 (마이클에 의해 지적) AWS_ACCESS_KEY_ID, 자동으로 process.ENV에서 AWS_SECRET_ACCESS_KEY 데리러 갈게 나는이 AWS.config.update({ region: 'eu-west-2' });에 AWS의 설정을 업데이트 생성 된 경로

"https://my-aws-s3-domain.s3.eu-west-2.amazonaws.com/test.pdf?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=XXXXXXX1222%2Feu-west-2%2Fs3%2Faws4_request&X-Amz-Date=20171222T153846Z&X-Amz-Expires=600&X-Amz-Signature=XXXXXX-268d&X-Amz-SignedHeaders=host" 

입니다.

나는 다시 시도하고 난에 IAM 정책을 변경, 그래서 나는 Access denied 응답을 얻었다 :

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "VisualEditor0", 
      "Effect": "Allow", 
      "Action": "s3:*", 
      "Resource": "arn:aws:s3:::my-s3-bucket-name" 
     } 
    ] 
} 

하고 여전히 액세스 거부 오류를주고있다.

+0

생성 된 URL이 어떻게 보이는지 보여주십시오. 경로, 서명, 토큰 및 키의 내용을 수정할 수 있지만 액세스 키 ID의 처음 4 문자는 컨텍스트 ('AKIA'와'ASIA')에 중요하므로이를 볼 필요가 있습니다. –

+0

@ Michael-sqlbot 감사합니다. Michael - 제가 위의 경로를 추가합니다. – Blackstone4

+0

'X-Amz-Credential' - 처음에는 AKIA 또는 ASIA가 있습니까? –

답변

1

Graphcool의 환경 변수에 AWS 키가 업데이트되지 않았다는 버그가있었습니다. 이 문제와 관련된 가능한

: https://github.com/graphcool/framework/issues/799

편집 - Graphcool에서 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 환경 변수를 보호됩니다. 따라서 사용할 수 없습니다.