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"
}
]
}
하고 여전히 액세스 거부 오류를주고있다.
생성 된 URL이 어떻게 보이는지 보여주십시오. 경로, 서명, 토큰 및 키의 내용을 수정할 수 있지만 액세스 키 ID의 처음 4 문자는 컨텍스트 ('AKIA'와'ASIA')에 중요하므로이를 볼 필요가 있습니다. –
@ Michael-sqlbot 감사합니다. Michael - 제가 위의 경로를 추가합니다. – Blackstone4
'X-Amz-Credential' - 처음에는 AKIA 또는 ASIA가 있습니까? –