AWS CLI를 이용한 S3 버킷 업로드

YoungJoon Suh·2022년 4월 29일
0

지금까지는 S3를 이용한 정적 웹 사이트 배포는 AWS 콘솔을 이용했습니다. 하지만 CLI에서도 S3 버킷 업로드 작업을 진행할 수 있습니다.
AWS CLI 도구를 이용하면, 거의 대부분의 AWS 기능을 터미널에서 작업할 수 있습니다.

CLI 버킷 업로드
Why?
AWS 콘솔에 접속할 필요가 없음
npm 스크립트와 같이 사용할 수 있음
객체 업로드, 정적 웹 호스팅, 버킷 정책 변경, 접근 권한 변경등의 작업을 CLI에서 진행할 수 있습니다.
CLI 명령어를 이용하는 만큼 NPM 스크립트를 작성하여 필요할 때 객체를 업로드하고, 정책을 변경할 수도 있습니다.

필요한 AWS 서비스, 툴
AWS IAM
AWS CLI

AWS IAM을 이용하여 버킷을 관리할 수 있는 권한을 취득해야 합니다.
1. IAM 계정 발금
2. CLI 툴을 설치
3. 로컬 터미널에서 정적 웹 호스팅까지 완료

AWS IAM (Identity and Access Management)
사용자 권한 부여, 리소스 접근 제어
1. AWS 계정에 대한 공유 액세스
2. 세분화된 권한 부여
3. 자격 증명 연동
4. AWS 서비스들과 연동
5. 멀티 팩터 인증
6. 무료 사용

IAM은 다른 사용자들이 본인의 AWS에 로그인하고 작업에 사용할 수 있는 특정 권한만 가진 계정을 발급할수도 있으며 프로그래밍 방식(CLI, SDK)를 통해 AWS 외부에서 서비스를 사용할 수 있는 계정도 만들수 있습니다.
페이스북, 구글의 자격증명을 연동하여 해당 서비스의 아이디로 AWS에 접근 가능하게 할수도 있습니다.
또한 OTP와 같은 이중보안을 사용할수 있으며 서비스 자체는 무료로 사용할수 있습니다.

  • 제한된 권한의 계정을 생성하는 이유
    공용 계정 공유의 문제점
    전화, 메일등의 방법은 보안에 취약
    로그인 추적, 관리의 어려움

  • 왜 IAM을 사용해야 할까요?
    권한을 세분화 하지 않는경우 모든 리소스에 접근하기 위한 계정을 여러 인원들이 공유할수도 있습니다.
    하지만 일부 인원들은 이런 계정이 그렇게 까지 필요하지 않을수도 있습니다.
    이런 인원들에게 모든 리소스에 접근할수 있는 계정은 너무 과한 권한 부여일수도 있습니다.

권한을 세분화하는 다른 이유?
세밀한 관리가 필요한 매우 중요한 서비스, 리소스들이 적당한 예이다.
대체로 이런 서비스, 리소스들은 권한을 가지지 못한 사람들이 접근할수 없습니다.
만약 이런 서비스, 리소스를 대상으로한 공격이 있다 하더라도 특정 권한이 없는 한 공격이 성사될수 없습니다.

이러한 이유로 권한을 세분화하여 특정 그룹, 특정 사용자들만 특정 리소스에 접근할수 있도록 하는것이 일반적입니다.

AWS IAM
그룹 만들기
1. 그룹명 명시
2. 그룹 정책 작성
정책연결 필터 부분에서 AdministratorAccess 를 검색하고 체크 합니다. 이후 설정이 필요한 부분은 존재하지 않습니다.
이때 모든 권한 대신 특정 권한만 부여 하려는 경우 AdministratorAccess 대신 다른 정책을 선택합니다.

사용자 만들기 & 그룹 추가
1. 사용자 이름 명시
2. 액세스 유형 선택
액세스 유형은 AWS CLI, SDK를 사용할 때 필요한 프로그래밍 방식과 AWS 관리자 콘솔에 접속할때 사용하는 방식 2가지로 나뉘어 있습니다.
콘솔에 액세스하는 방식은 다른 사용자와 같은 계정을 공유할 때 필요한 방식입니다.
액세스 키 ID, 비밀 액세스 키는 AWS CLI에서 사용합니다.

  1. 그룹에 사용자 추가

AWS CLI
AWS 서비스와 상호 작용이 가능한 오픈소스 툴
터미널에서 AWS Management 콘솔 기능 사용

IAM 사용자 발급 및 권한 부여 필요
오픈 소스 설치 및 초기 구성 필요

해당 사용자의 ID, 키를 바탕으로 CLI를 이용할수 있습니다.
CLI를 사용하기 위해서는 권한을 부여받은 IAM 사용자의 정보가 필요하며 운영체제에 맞는 AWS CLI를 설치해야 합니다.

aws s3 ls: 버킷의 목록을 조회하는 명령어이다.

aws s3 mb: 버킷을 생성하는 명령어, 버킷 이름은 모든 사용자가 사용하지 않는 이름이어야 합니다.
aws s3 mb 비킷이름

aws s3 rb: 버킷을 삭제하는 명령어이다. 버킷이 완전히 비어 있어야 삭제 가능합니다.
aws s3 rb 버킷이름

aws s3 sync {로컬파일 경로} {버킷이름} : 오브젝트를 동기화 할때 사용한다. 목적지에 없는 오브젝트들을 복사하여 저장하게 됩니다. 따라서 오브젝트 업로드에 사용할 수 있습니다. 원본파일을 제거하지 않습니다.

aws s3 mv {로컬폴더 경로/ 버킷 주소} {옮길 대상 주소} - recursive 명령어로도 오브젝트를 업로드 할수 있습니다. 다만 sync 명령어와 다르게 파일이 목적지로 옮겨지게 됩니다. 원본 파일이 옮겨지는 만큼원본 파일을 더이상 확인할 수 없습니다.

aws s3 ls: 명령어에 버킷 주소를 입력하면 버킷내부의 오브젝트를 확인할 수 있습니다.

aws s3 rm s3://{버킷이름/오브젝트/경로}를 입력하면 해당되는 오브젝트를 버킷에서 제거합니다.

aws s3 rm s3://{버킷이름} - recursive: 버킷 내부의 모든 오브젝트를 제거하는 명령어

aws s3 website s3://{버킷이름} --index-document {기본 제공할 파일} --error-document {페이지 에러 상황에 제공할 파일}: 웹 호스팅을 구성
기본적으로 index.html 파일을 제공하며 에러 상황에 error.html 파일을 제공하기 위해서는
기본 제공할 파일에 index.html을 넣고 페이지 에러 상황에 제공할 파일에는 error.html을 넣는다.

aws s3api delete-bucket-website --bucket {버킷이름}: 정적 웹 호스팅을 종료하는 명령어, 이때 s3://와 같은 주소 대신 버킷 이름만 명시해야 합니다.

버킷에 접근이 가능하도록 퍼블릭 리드 정책을 버킷에 부여 해야합니다.

첫번째 명령어에서 버전 정보는 날짜 정보가 아닙니다. AWS가 사용하는 정책 이름입니다.
반드시 해당 버전을 이용해야 버킷 정책을 업데이트를 할 수 있습니다.

퍼블릭 읽기 권한을 제거하려면 "Effect": "Allow"부분을 "Effect": "Deny"로 수정한다음 다시 정책을 업로드 합니다.

이후 http://{버킷이름}.s3-website.{리전이름}.amazonaws.com 으로 접속하면 배포된 클라이언트를 확인할 수 있습니다.

앞선 과정들은 CLI 에서 진행되는 만큼 NPM 스크립트에서 활용될수 있습니다.

이런 명령어들을 NPM 스크립트로 작성한다면 AWS 관리 콘솔에 접속하지 않아도 s3 버킷에 빌드 결과물을 업로드하고 오브젝트를 갱신할수 있습니다.

CLI 명령어
정책 파일을 바탕으로 정책을 버킷에 업로드한다면 file URL을 이용해서 파일을 불러오고 업로드합니다.

file URL 일반적으로 자신의 컴퓨터 내에서 파일을 검색하는데 사용됩니다.
file URL은 다음과 같은 형태를 가지고 있습니다.

file://host/path
이때 호스트는 당연히 로컬호스트를 의미합니다.
호스트를 생략하여 file:///과 같은 형식으로 사용할 수도 있습니다.

file URL은 루트(/)를 기준으로 작동합니다.
절대 주소를 사용하기 때문에 운영체제에 따라 사용하는 방법이 조금 달라질 수도 있습니다.

profile
저는 서영준 입니다.

0개의 댓글