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 |
