[AWS] S3에 xml 업로드 하기

채록·2021년 11월 3일
0

AWS&Docker

목록 보기
11/12
post-thumbnail

지난번 글 S3로 이미지 업로드 에 이어서 이번에는 S3에 xml업로드 하기이다.



들은바에 의하면 (?) 옛날 동작 방식으로 데이터를 xml형식으로 만들어 해당 데이터가 저장된 url로 api 통신을 하는 방법도 있다고 한다. 이번에 이런 방식을 사용해 데이터를 주고 받아야 하는 일이 있어서 지난번과 마찬가지로 버킷을 생성하고 정책설정을 해서 퍼블릭 접근이 가능하도록 하였다.


IAM

S3에 업로드, 다운로드, 읽기 등 모든 권한을 가진 역할자를 하나 만들어준다.

버킷 생성하기

버킷의 이름은 "test-for-xml-just-text"로 하였다. region도 아시아/서울로.
앞서 말했듯 퍼블릭 접근이 가능해야 하기 때문에 버킷을 생성하면서 "이 버킷의 퍼블릭 액세스 차단 설정"모든 퍼블릭 액세스 차단을 해제해 주었다.

다른건 건드릴것이 없어서 바로 생성하였다.


1. 버킷 정책 설정

이 버킷에 대한 정책을 설정한다. 버킷에 xml을 업로드하고, 업로드된 xml을 자유롭게 읽어올수 있어야 하기 때문이다.


"정책 생성기"를 통해 먼저 생성할 정책의 상태를 선언한다.
정확하게 사용할 actions 지정해도 되지만 번거로우므로 s3에 대한 모든 action들을 허용하도록 했다. 그리고 ARN에는 생성된 버킷의 ARN을 입력하면 된다.

설정한 후 "Add statement"를 누르면 정책json 예제가 생성되고 "Generate Policy"로 정책 내용을 확인하여 복사해둔다.

{
  "Id": "{정책번호}",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "{생성된 statement의 ID}",
      "Action": "s3:*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::test-for-xml-just-text",
      "Principal": "*"
    }
  ]
}

그리고 나서 버킷 정책 편집창에 붙여넣고 저장한다.
이때 에러가 난다면 에러 메세지를 잘 보고 해결하도록 한다!


2. CORS 설정

나의 경우 외부 사이트에서도 해당 객체 url을 호출하기 때문에 CORS 정책도 설정해야 한다.
모든 요청을 다 허용해 주면 된다.!

[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET",
            "PUT",
            "POST",
            "HEAD"
        ],
        "AllowedOrigins": [
            "*",
            "http://localhost:*"
        ],
        "ExposeHeaders": [
            "ETag"
        ],
        "MaxAgeSeconds": 3000
    }

객체 업로드 하기

먼저 AWS UI를 통해 객체를 업로드 해본다. 이때 업로드 하는 파일 목록 아래에 보면 "권한" 설정 탭이 있다. 여기서 "미리 정의된 ACL"에 프라이빗 으로 하면 url 호출 시 "Access denied"가 뜬다.

- 프라이빗 설정 시

따라서 "퍼블릭 읽기 액세스 권한 부여" 설정을 해준다.

- 퍼블릭 설정 시

그러면 업로드 된 파일의 객체 url을 호출하면 내용이 정상적으로 보인다.

이제 python 로직을 통해 객체 업로드를 진행해 보자!


xml 업로드 endpoint 작성

python 프로젝트로 작성하려고 한다. 이때 데이터를 구성할때부터 xml 형식으로하면 매우 까다로우므로 일단 dict 형식으로 작성후 xml로 converting 해주도록 한다.
이때 필요한 모듈은 "xmltodict"이다.

import boto3
import xmltodict

upload_dict = {
  "data": {
    "goods_data": {
    "goodsNm": "testgoods",
    "goodsprice": "1000"
    }
  }
}

def convert_xml_to_dict(target):
    return loads(dumps(target))

upload_xml = convert_xml_to_dict(target=xmltodict.parse(upload_dict))
profile
🍎 🍊 🍋 🍏 🍇

0개의 댓글