삽질특기생

다음에 삽질 덜하려고 만든 블로그

0%

AWS S3에서 bucket의 cors를 활성화하는 방법(awscli 사용)

회사에서 ceph object storage를 사용 중인데, object 업로드를 위해 frontend단에서 http OPTIONS가 성공하는지를 체크한다고 한다.
이 options가 성공하려면 bucket에 대해 cors를 활성화해주어야 하고, 이를 aws cli로 하면 간단하게 성공했지만 java 코드로 성공하기까지 매우 힘들었다.
(아직도 의문인 점은, 굳이 cors를 활성화하지 않아도 object 업로드는 된다는 점이다. options만 실패할 뿐…)
aws cli로 시도했을 때 –debug로 나온 결과가 실제 aws 가이드와 약간 다르기도 했고, aws signature 버전이 올라가면서 authorization을 생성하는 과정이 매우매우 복잡해졌기 때문이었다.
혹시나 이것 때문에 골치 아플 미래의 분을 위해 내가 며칠 동안 조사하고 테스트한 내용을 기록해두고자 한다.

우선 이번 포스팅에서는 aws s3, object storage, bucket, cors 등등의 개념을 간단간단하게 설명하고,
put bucket cors를 awscli로 하는 방법에 대해 설명하도록 하겠다.
원래는 AWSv4 Authorization 생성 방법까지 다루려 했는데, 쓰다보니 너무 길어져서 이건 다음에 포스팅해야겠다.

AWS S3란

AWS(Amazon Web Service)에서 제공하는 Object Storage로, Simple Storage Service를 줄여 S3 서비스라고 한다.
Object Storage는 rest api를 사용하여 object를 key-value로 관리하는 저장소라고 생각하면 된다.
Amazon에서는 S3에 대해 rest api와 각종 sdk, command line으로 조작하는 aws cli도 제공하고 있다.
sdk는 내부적으로 rest api를 사용하므로 다를 바가 없고, cli도 –debug로 확인해보면 별반 다르지 않음을 알 수 있다.
그러니까 결론은 편의성을 위해 여러 방법이 제공되지만 모든 조작은 rest api로 가능하다는 것이다.

Bucket이란

AWS S3의 경우 user당 object storage가 만들어지고, 각 object storage당 access key와 secret key가 발급된다.
이 때 두 key는 각각 id와 pw격으로 사용되며, aws authorization string을 생성할 때 필요하다.
Object storage를 생성했다고 해서 바로 object를 업로드할 수 있는 건 아니다.
물론 object storage는 원래 object를 flat하게 관리하지만, aws에는 bucket이라는 layer가 있다.
즉, object storage에 여러 개의 bucket을 만들고, 이 bucket에 object에 업로드하는 구조이다.

CORS란

CORS(Cross-Origin Resource Sharing)은 다른 도메인에 있는 서버의 url을 호출할 수 있도록 접근을 허용하는 것이다.
그러니까 cors를 설정하지 않았다면 원래는 같은 도메인에서만 접근이 가능하고, 다른 도메인에 접근하려면 보안 이슈가 발생하는 것이다.
aws의 경우 bucket에 대해 cors 활성화를 해주어야 다른 도메인에서도 접근할 수 있다.

Put bucket cors 방법

AWS cli를 사용하는 방법

  1. aws cli를 설치한다.

    1
    $ apt-get install --no-install-recommends awscli
  2. access key와 secret key를 설정한다.

    1
    2
    3
    4
    5
    $ aws configure
    AWS Access Key ID [None]: ${access-key}
    AWS Secret Access Key [None]: ${secret-key}
    Default region name [None]:
    Default output format [None]: json

    region은 설정 안해도 된다. aws configure 상에서는 공란으로 되어있지만, 실제 authorization 생성 시 default는 us-east-1로 사용한다.
    output format은 자유.

  3. bucket을 생성한다.

    1
    $ aws s3api create-bucket --endpoint-url ${endpoint-url} --bucket testbucket

    endpoint-url은 ceph의 object storage gateway ip를 적으면 된다.
    이걸 생략할 경우 s3.amazonaws.com으로 rest api를 전송한다.
    아 물론 region이 설정되어있을 경우 url이 달라질 수 있다.

  4. cors rule 지정

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ vi cors.json
    {
    "CORSRules": [
    {
    "AllowedOrigins": ["*"],
    "AllowedHeaders": ["*"],
    "AllowedMethods": ["PUT", "GET", "DELETE"],
    "MaxAgeSeconds": 3000,
    "ExposeHeaders": ["x-amz-server-side-encryption"]
    }
    ]
    }

    PUT, GET, DELETE method에 대해 활성화해놓도록 지정하였다.
    object는 multipart upload가 아닌 이상 post를 사용하지 않기 때문이다.

  5. testbucket의 cors를 활성화시킨다.

    1
    $ aws s3api put-bucket-cors --bucket testbucket --cors-configuration file://cors.json --endpoint-url ${endpoint-url}

    이제 testbucket에 object를 업로드하고, 업데이트하고, 다운로드하고, 삭제할 수 있다.

AWSv4 Authorization 생성하는 방법과 이걸로 http request를 날려서 bucket cors를 활성화하는 방법은 다음 포스팅에…!
To be Continued…