【Laravel】Amazon S3에의 업로드가 「403 Access Denied」로 실패하는 원인과 대처 방법
소개
Laravel에서 Amazon S3에 이미지를 업로드하는 프로세스를 구현하고 가끔 업로드하려고했는데 다음 오류가 발생하여 실패했습니다.
Error executing "PutObject" on "https://minna-no-houteishiki.s3.ap-northeast-1.amazonaws.com/r1oJ01mYWVeol0m7jUTji7uef5lyG7MATNOqzl1A.png"; AWS HTTP error: Client error: `PUT https://minna-no-houteishiki.s3.ap-northeast-1.amazonaws.com/r1oJ01mYWVeol0m7jUTji7uef5lyG7MATNOqzl1A.png` resulted in a `403 Forbidden` response:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ABBC2D (truncated...)
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ABBC2D1C8E07A319</RequestId><HostId>ZvHZ5rneZGsSstZLX2jIoixQFaaFnRxFdtoiNE1Hd+0n17a09y4JKDckdlYsZOC/nMhiQuBb3fA=</HostId></Error>
PutObject
라는 명령을 실행하면 액세스가 거부된 것 같습니다.
원인
S3 버킷에 공개 액세스 설정 기능이 설정되어 있기 때문입니다. 퍼블릭 액세스 설정 기능은 버킷의 파일을 퍼블릭 액세스할 수 없도록 하는 설정입니다.
Amazon S3 보안에 대한 자세한 내용은 다음 기사가 매우 잘 정렬되어 있으므로 참조하십시오.
S3에서 잘못된 데이터 공개를 방지하는 공개 액세스 설정 기능이 추가되었습니다. | Developers.IO
즉, Amazon S3에 퍼블릭 액세스 설정 기능이 추가되어 기본적으로 퍼블릭 액세스를 사용할 수 없게 되었습니다.
그건 그렇고, Laravel의 구현은 다음과 같습니다.
$image = $request->file('image');
$path = Storage::disk('s3')->put('/', $image, 'public');
$post->image = Storage::disk('s3')->url($path);
put
메서드의 세 번째 인수에 public
를 지정하고 파일을 공용 파일로 업로드하려고합니다. public
를 지정하지 않고 업로드해도 업로드는 가능하지만 참조가 불가능하므로 의미가 없습니다.
해결 방법
AWS 관리 콘솔에 로그인하여 Amazon S3의 버킷 관리 화면에 액세스합니다.
공용 액세스 설정 기능을 다음과 같이 변경합니다.

Error executing "PutObject" on "https://minna-no-houteishiki.s3.ap-northeast-1.amazonaws.com/r1oJ01mYWVeol0m7jUTji7uef5lyG7MATNOqzl1A.png"; AWS HTTP error: Client error: `PUT https://minna-no-houteishiki.s3.ap-northeast-1.amazonaws.com/r1oJ01mYWVeol0m7jUTji7uef5lyG7MATNOqzl1A.png` resulted in a `403 Forbidden` response:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ABBC2D (truncated...)
AccessDenied (client): Access Denied - <?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>ABBC2D1C8E07A319</RequestId><HostId>ZvHZ5rneZGsSstZLX2jIoixQFaaFnRxFdtoiNE1Hd+0n17a09y4JKDckdlYsZOC/nMhiQuBb3fA=</HostId></Error>
S3 버킷에 공개 액세스 설정 기능이 설정되어 있기 때문입니다. 퍼블릭 액세스 설정 기능은 버킷의 파일을 퍼블릭 액세스할 수 없도록 하는 설정입니다.
Amazon S3 보안에 대한 자세한 내용은 다음 기사가 매우 잘 정렬되어 있으므로 참조하십시오.
S3에서 잘못된 데이터 공개를 방지하는 공개 액세스 설정 기능이 추가되었습니다. | Developers.IO
즉, Amazon S3에 퍼블릭 액세스 설정 기능이 추가되어 기본적으로 퍼블릭 액세스를 사용할 수 없게 되었습니다.
그건 그렇고, Laravel의 구현은 다음과 같습니다.
$image = $request->file('image');
$path = Storage::disk('s3')->put('/', $image, 'public');
$post->image = Storage::disk('s3')->url($path);
put
메서드의 세 번째 인수에 public
를 지정하고 파일을 공용 파일로 업로드하려고합니다. public
를 지정하지 않고 업로드해도 업로드는 가능하지만 참조가 불가능하므로 의미가 없습니다.해결 방법
AWS 관리 콘솔에 로그인하여 Amazon S3의 버킷 관리 화면에 액세스합니다.
공용 액세스 설정 기능을 다음과 같이 변경합니다.

솔직히 일본어를 이해하기 어렵기 때문에 어느 것을 끄면 좋은지 잘 모르겠습니다 ... 😅
공용 액세스 설정 기능은 보안을 높이는 설정이므로 끄는 것이 최소한으로 유지하는 것이 좋습니다.
제 경우에는 위와 같은 설정으로 업로드할 수 있습니다.
요약
Laravel에서 Amazon S3에 업로드하는 방법을 설명하는 기사는 많지만 모두 AWS 보안 설정이 변경되기 전의 기사이므로 단계별로 설정했는데 업로드 할 수 없다는 상황에 빠집니다. 많다고 생각합니다.
Amazon S3에 업로드할 수 없다는 사람은 참고해 주시면 좋겠습니다.
Reference
이 문제에 관하여(【Laravel】Amazon S3에의 업로드가 「403 Access Denied」로 실패하는 원인과 대처 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/whitia/items/271ce8485df2148702df
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【Laravel】Amazon S3에의 업로드가 「403 Access Denied」로 실패하는 원인과 대처 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/whitia/items/271ce8485df2148702df텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)