SFDC DataCloud에 AWS의 Redshift를 연결하려고 했는데

한참동안 권한 등 문제가 발생했지만 해결은 생각보다 간단했다.

일반적인 것들을 제외하고 문제가 됐던 부분은 ip 대역폭이었는데

당연히 서울 근처 지역이라고 생각하고 북동아시아 ip 대역폭을 다 열어뒀었는데

DataCloud용 Demo Org의 경우에는 CAD라는 리전이었기 때문에 캐나다쪽 ip 대역폭을 열어줘야 했고

생각보다 너무 허무하게 바로 연결되어버렸다.

이후에는 Redshift의 테이블을 SFDC에서 조작할 수 있어야 헀는데

이 부분은 갑자기 그리스 문자에서나 들어봤던 람다라는걸 써야 한다고 하는데

파이썬도 안써봤고 이상한 기능도 처음이라 다시 또 처음 redshift 등을 들어봤을 때처럼 당황스러웠다.

Salesforce(Apex) ──HTTP──▶ API Gateway ──▶ Lambda ──(Redshift Data API)──▶ Redshift (POST /updateRecord) ▲ └── UPDATE 실행, updated_at 갱신

일단 람다에 파이썬으로 코드를 생성해주고 테스트를 진행한 다음

redshift에서 정상적으로 업데이트 된 부분을 볼 수 있었지만

막상 데이터의 날짜가 이상해서 일부 수정해서

updated_at = DATEADD(hour, 9, GETDATE()) 방식으로 현재 시간이 제대로 들어가게 만들었다.

import json, os
import boto3

rsd = boto3.client('redshift-data')

WORKGROUP = os.environ['WORKGROUP']
DATABASE  = os.environ['DATABASE']
SECRET_ARN = os.environ['SECRET_ARN']

def lambda_handler(event, context):
    try:
        body = event.get('body')
        if isinstance(body, str):
            body = json.loads(body)
        elif body is None:
            body = {}

        record_id = body.get('id')
        status    = body.get('status')

        if record_id is None or status is None:
            return _res(400, {"ok": False, "error": "id and status are required"})

        # 한국 시간(UTC+9)으로 updated_at 저장
        sql = """
        UPDATE public.sfdc_test_data
           SET status = :status,
               updated_at = DATEADD(hour, 9, GETDATE())
         WHERE id = :id
        """

        resp = rsd.execute_statement(
            WorkgroupName=WORKGROUP,
            Database=DATABASE,
            SecretArn=SECRET_ARN,
            Sql=sql,
            Parameters=[
                {"name": "status", "value": str(status)},
                {"name": "id",     "value": str(record_id)}
            ]
        )

        return _res(200, {"ok": True, "statementId": resp["Id"]})
    except Exception as e:
        return _res(500, {"ok": False, "error": str(e)})

def _res(code, body):
    return {
        "statusCode": code,
        "headers": {"Content-Type": "application/json"},
        "body": json.dumps(body)
    }
{
  "body": "{\\"id\\":2, \\"status\\":\\"Active\\"}"
}

날짜 필드까지 연결하고나니 드디어 RedShift를 사용하는 목적을 볼 수 있었는데

증분 필드가 있어서 해당 필드 기준으로 레코드를 반영할 수 있는 것 같다.

 

 

일단 연결을 완료하고 이 부분은 S3와의 연결에도 가능한지 확인은 해봐야 할 것 같은데

사실 연결 자체는 S3로 하고

S3에 게이트를 Redshift로 열어준 다음 API로 업데이트 진행만 하는게 제대로 된 방식이라고 추측되긴 한다.

Remote Site Setting에 주소를 추가한 다음

아래와 같이 게이트웨이로 통신을 시도하니 정상적으로 code 200을 받을 수 있었다.

HttpRequest req = new HttpRequest();
req.setEndpoint('<https://주소값.execute-api.ap-northeast-2.amazonaws.com/prod/update>'); // 네 API Gateway URL
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');

// 변경할 레코드 ID와 상태
String body = '{"id":2, "status":"Inactive"}';
req.setBody(body);

Http http = new Http();
HTTPResponse res = http.send(req);

System.debug('Status: ' + res.getStatusCode());
System.debug('Body: ' + res.getBody());

 

이후 SFDC 연결까지는 진행했는데 증분식 업데이틍가 딜레이가 있어서 내일 추가 진행하기로 했다.

 

 

(1).백준 13580번 Andando no tempo는 앞, 뒤로 이동할 수 있는 수치 3개를 제공해줄 때

원래 자리로 돌아올 수 있는지를 묻는 문제였다.

 

최대 1번씩 사용하고 사용하지 않을 수 있기 때문에 오름차순 정렬 후 작은 것 두개가 큰 것과 같거나

같은게 있는지 a,b b,c 비교를 통해서 같은 경우 S를 출력하고 아닌 경우 N을 출력하는 방식으로 해결했다.

const [a,b,c] = `31 110 79`.split(' ').map(Number).sort((a,b) => a-b)

if(a ==b || b == c || a+b == c){
    console.log('S')
}
else{
    console.log('N')
}

'회고' 카테고리의 다른 글

[개발일지] - 773(광복절)  (0) 2025.08.15
[개발일지] - 772  (3) 2025.08.14
[개발일지] - 769  (0) 2025.08.11
[개발일지] - 768(주말)  (0) 2025.08.10
[개발일지] - 767(주말)  (0) 2025.08.09

+ Recent posts