How-to guides
사용자는 Samsung Cloud Platform Console을 통해 Cloud Functions의 필수 정보를 입력하고, 상세 옵션을 선택하여 해당 서비스를 생성할 수 있습니다.
Cloud Functions 생성하기
모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
Service Home 페이지에서 Cloud Functions 생성 버튼을 클릭하세요. Cloud Functions 생성 페이지로 이동합니다.
Cloud Functions 생성 페이지에서 서비스 생성에 필요한 정보들을 입력하세요.
| 구분 | 필수 여부 | 상세 설명 |
|---|
| Funtion 명 | 필수 | 생성할 Funtion 이름 입력- 영문 소문자 시작하며 영문 소문자, 숫자, 특수문자(
-)를 이용하여 3 ~ 64자 이내로 입력
|
| Runtime | 필수 | Runtime 생성 방법 선택- Blueprint로 시작하기: 서비스에서 제공하는 Runtime 소스코드 활용하여 작성
|
| Runtime & Vesion | 필수 | Runtime 및 버전 선택- 새로 작성을 선택한 경우
- Java 런타임의 경우, UI 코드 편집을 지원하지 않으며, Object Storage에서 Jar파일을 가져와서 실행 가능
- Blueprint로 시작하기를 선택한 경우
- 해당 Runtime & Version의 소스코드 보기 버튼을 클릭하여 소스코드 예시 확인 가능
|
표. Cloud Functions 서비스 정보 입력 항목
요약 패널에서 생성한 상세 정보와 예상 청구 금액을 확인하고, 생성 버튼을 클릭하세요.
- 생성이 완료되면, Cloud Functions 목록 페이지에서 생성한 자원을 확인하세요.
Cloud Functions 상세정보 확인하기
Cloud Functions 상세 페이지는 상세 정보, 모니터링, 로그, 코드, 구성, 트리거, 태그, 작업이력 탭으로 구성되어 있습니다.
Cloud Functions 서비스의 상세 정보를 확인하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 상세 정보를 확인할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- Function 상세 페이지에는 상태 정보 및 부가 기능 정보가 표시되며, 상세 정보, 모니터링, 로그, 코드, 구성, 트리거, 태그, 작업이력 탭으로 구성됩니다.
| 구분 | 상세 설명 |
|---|
| Cloud Functions 상태 | Cloud Functions의 상태 정보- Ready: 녹색 아이콘, 정상적인 함수 호출이 가능한 상태
- Not Ready: 회색 아이콘, 정상적인 함수 불가능한 상태
- Deploying: 황색 아이콘, 함수 생성 또는 변경 중인 상태로써 다음 동작으로 발동
- Running: 청색 아이콘, 정상적인 함수 호출이 가능하고 콜드 스타트 방지 정책이 적용된 상태
|
| 서비스 해지 | 서비스를 해지하는 버튼 |
표. Cloud Functions 상태 정보 및 부가 기능
상세 정보
Function 목록 페이지에서 선택한 자원의 상세 정보를 확인하고, 필요한 경우 정보를 수정할 수 있습니다.
| 구분 | 상세 설명 |
|---|
| 서비스 | 서비스명 |
| 자원 유형 | 자원 유형 |
| SRN | Samsung Cloud Platform에서의 고유 자원 ID |
| 자원명 | 자원 이름- Cloud Functions 서비스에서는 Funtion 이름을 의미
|
| 자원 ID | 서비스의 고유 자원 ID |
| 생성자 | 서비스를 생성한 사용자 |
| 생성 일시 | 서비스를 생성한 일시 |
| 수정자 | 서비스를 수정한 사용자 |
| 수정 일시 | 서비스를 수정한 일시 |
| Function명 | Cloud Function의 이름 |
| Runtime | Runtime 종류 및 버전 |
| LLM Endpoint | 이용 가이드를 클릭하여 LLM Endpoint 정보 및 사용 방법 확인 가능 |
표. Cloud Functions 상세 - 상세 정보 탭 항목
참고
AIOS를 연계하여 LLM을 활용하는 방법에 대한 자세한 내용은
AIOS 연계하기 를 참고하시길 바랍니다.
모니터링
Function 목록 페이지에서 선택한 자원의 Cloud Functions 사용 정보를 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|
| 호출수 | 단위 시간 동안 해당 Function이 호출된 평균 횟수(건) |
| 실행시간 | 단위 시간 동안 해당 Function을 실행한 평균 실행 시간(초) |
| 메모리 사용량 | 해당 Function 실행하는 중 중 단위 시간 동안 사용한 평균 메모리 사용량(kb) |
| 현재 작업수 | 함수가 동시에 여러 번 호출될 경우, 동시 처리를 위해 단위 시간 동안 생성된 작업의 평균 횟수(건) |
| 성공 호출수 | 함수 호출 시 단위 시간 동안 런타임 코드가 정상적으로 동작하여 응답 코드를 전달한 평균 횟수(건) |
| 실패 호출수 | 함수 호출 시 단위 시간 동안 오류가 발생한 평균 호출 횟수- 응답 시간 초과 및 로직 오류에 의한 런타임 포함
|
표. Cloud Functions 상세 - 모니터링 탭 항목
로그
Function 목록 페이지에서 선택한 자원의 Cloud Functions 로그를 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|
| 단위 기간 | Cloud Functions의 로그 정보를 확인할 기간 선택- 시간 단위(1시간, 3시간, 12시간)로 선택하거나 사용자가 직접 설정 가능
|
| 로그 메시지 | 최근 발생 함수부터 순서대로 표시됩니다. |
표. Cloud Functions 상세 - 로그 탭 항목
참고
로그 메시지는 최근 발생 메시지를 기준으로 이전 1,000개의 메시지까지 확인이 가능합니다.
코드
Function 목록 페이지에서 선택한 자원의 Cloud Functions 코드를 확인하고 수정할 수 있습니다.
참고
사용 Runtime에 따라 소스 코드 확인 및 편집 방식이 달라집니다.
- 인라인 편집기: Node.js, Python, PHP, Go
- 압축파일(.jar/.zip) 실행: Java
| 구분 | 상세 설명 |
|---|
| 소스 코드 | 인라인 편집기 방식 |
| 코드 정보 | 코드 정보를 표시 |
| 수정 | 수정 버튼을 클릭한 후, 인라인 편집기에서 코드 수정 가능 |
표. Cloud Functions 상세 - 코드 탭 내 인라인 편집기 항목
| 구분 | 상세 설명 |
|---|
| 소스 코드 | 압축파일(.jar/.zip) 실행 방식 |
| 코드 정보 | 압축 파일 정보 표시- Java Runtime: Java Runtime 버전 정보
- Handler 정보: 실행 Class와 Method 정보
- 압축파일명(.jar/.zip)명: 현재 설정된 압축 파일의 이름
- 파일 업로드 일시: 현재 설정된 압축 파일의 업로드 일시
|
| 수정 | Jar 파일 변경 가능- Function 코드 수정 페이지에서 Object Storage에서 가져오기 버튼을 클릭하여 변경 가능
- 가져올 Object Storage 버킷 내 파일의 Private URL을 입력
- 압축 파일 변경에 대한 자세한 내용은 [Java Runtime 코드 변경하기](#java-runtime 코드 변경하기) 참고
|
표. Cloud Functions 상세 - 코드 탭 내 압축파일(.jar/.zip) 실행 항목
참고
- Java Runtime의 경우 UI 코드 편집 기능을 제공하지 않으며, Object Storage 서비스의 버킷에서 압축파일(.jar/.zip) 파일을 선택해야 합니다.
- Object Storage 서비스의 인증키가 생성되지 않은 사용자의 경우, Object Storage에서 가져오기를 실행할 수 없으므로, 사전에 인증키를 생성해야 합니다.
- Cloud Functions 서비스에 대한 Object Storage 버킷의 접근제어를 허용 상태로 변경해야 합니다.
구성
Function 목록 페이지에서 선택한 자원의 Cloud Functions 구성을 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|
| 일반 구성 | Cloud Function의 메모리와 제한 시간 설정- 메모리: Function당 최대로 사용할 수 있는 메모리 제한값
- 제한시간: Function당 호출을 대기하는 최대 시간
- 수정 버튼을 클릭하여 일반 구성 설정 변경 가능
|
| 환경 변수 | 런타임 환경 변수를 설정- 환경 변수 사용 시 코드를 업데이트하지 않고 함수의 동작을 조정 가능
- 수정 버튼을 클릭하여 환경 변수 추가 또는 수정 가능
|
| 함수 URL | 함수에 접근 가능한 HTTPS URL 주소 발급- 수정 버튼을 클릭하여 활성화 여부와 인증 유형, 접근 허용 IP 설정 가능
- IAM 유형으로 인증하여 함수를 호출하는 경우, 반드시 헤더 내 “
x-scf-access-key”, “x-scf-secret-key” 포함 필요. 이 경우, 정책과 인증키의 IP 접근 제어는 미적용
|
| Private 연결 구성 | PrivateLink Service와 연계하여 사용 가능 |
표. Cloud Functions 상세 - 구성 탭 항목
주의
접근 제어 사용을 해제하는 경우, 등록된 접근 정보가 삭제되어 함수 접근 제어가 불가능하므로 외부 스캔, 해킹 등의 보안 공격에 노출될 수 있습니다.
참고
- 일반 구성의 메모리 할당량에 비례하는 CPU 코어 갯수가 자동으로 할당됩니다.
- 일반 구성의 실행 최소 수가 1이상 일 경우 Cold Start가 방지 되지만, 지속적으로 비용이 부과됩니다.
트리거
Function 목록 페이지에서 선택한 자원의 트리거 정보를 확인하고 설정할 수 있습니다. 트리거를 설정하면 이벤트 발생 시 Function을 자동으로 실행할 수 있습니다.
| 구분 | 상세 설명 |
|---|
| Cronjob | Cronjob을 트리거로 사용- 시간 또는 일정 주기에 따라 함수를 자동으로 호출
- 수정 버튼을 클릭하여 반복 빈도와 시간대 변경 가능
|
| API Gateway | API Gateway를 트리거로 사용- API Gateway 이름과 상세 정보를 확인할 수 있습니다.
|
표. Cloud Functions 상세 - 트리거 탭 항목
주의
Cronjob 트리거를 함수 제한 시간 전에 호출할 경우, 함수가 중첩 실행되어 실행 횟수와 시간이 증가하게 됩니다. 따라서 지속적으로 추가 비용이 발생하여 높은 비용이 발생할 수 있으므로 주의하세요.
참고
- Deploying 상태일 경우, 수정할 수 없습니다.
- 트리거 설정에 대한 트리거 설정하기를 참고하세요.
태그
태그 탭에서 자원의 태그 정보를 확인하고, 추가하거나 변경 또는 삭제할 수 있습니다.
| 구분 | 상세 설명 |
|---|
| 태그 목록 | 태그 목록- 태그 입력 시 기존에 생성된 Key와 Value 목록을 검색하여 선택
|
표. Cloud Functions 상세 - 태그 탭 항목
작업 이력
작업 이력 페이지에서 자원의 작업 이력을 확인할 수 있습니다.
| 구분 | 상세 설명 |
|---|
| 작업 이력 목록 | 자원 변경 이력- 작업 내역, 작업 일시, 자원 유형, 자원명, 작업 결과, 작업자 정보 확인 가능
- 작업 이력 목록 리스트에서 해당하는 자원을 클릭하면 작업 이력 상세 팝업창이 열림
|
표. Cloud Functions 상세 - 작업 이력 탭 항목
Java Runtime 코드 변경하기
Java Runtime을 사용하는 경우, 코드를 직접 수정할 수 없으므로 Object Storage 서비스의 버킷에서 압축 파일(.jar/.zip)을 선택하여 변경해야 합니다.
압축 파일을 변경하는 방법은 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 코드 내 압축 파일을 변경할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- Function 상세 페이지의 코드 탭에서 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- Object Storage에서 가져오기 버튼을 클릭하세요. Object Storage에서 가져오기 팝업창이 열립니다.
| 구분 | 상세 설명 |
|---|
| Java Runtime | Java Runtime 정보 |
| Handler 정보 | Handler 정보- 실행 Class: 압축파일(.jar/.zip) 설정 시 자동으로 입력
- 실행 Method: 압축파일(.jar/.zip) 설정 시 자동으로 입력
|
| 압축파일(.jar/.zip) | 변경할 압축 파일을 설정- 압축파일명(.jar/.zip): 압축 파일의 이름을 표시. Object Storage에서 가져오기 설정 후, 자동으로 입력
- Object Storage에서 가져오기: 압축파일(.jar/.zip)을 가져올 Object Storage 설정
|
표. Cloud Functions 상세 - Function 코드 수정 항목
- Object Storage URL에 압축 파일을 가져올 Object Storage의 URL 정보를 입력한 후, 확인 버튼을 클릭하세요. 알림 팝업창이 열립니다.
- URL 정보는 가져올 Object Storage의 상세 페이지의 폴더 리스트 탭에서 파일 정보 > Private URL 항목에서 확인할 수 있습니다.
- 확인 버튼을 클릭하세요. Function 코드 수정 페이지의 **압축파일명(.jar/.zip)**에 가져온 압축 파일의 이름이 표시됩니다.
- 저장 버튼을 클릭하세요.
주의
- 인증키가 생성되지 않은 사용자의 경우, Object Storage에서 가져오기를 실행할 수 없습니다.
- URL이 존재하지 않거나 압축 파일이 다음에 해당하는 경우, 변경할 수 없습니다.
- 지원하지 않는 확장자를 사용하는 경우
- 압축 파일 내 유해한 파일이 있는 경우
- 지원 가능한 크기를 초과한 경우
Cloud Functions 해지하기
Cloud Functions 서비스를 해지하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 해지할 자원을 클릭하고 서비스 해지 버튼을 클릭하세요.
- 해지가 완료되면 Function 목록 페이지에서 자원이 해지되었는지 확인하세요.
1 - 트리거 설정하기
트리거 설정하기
참고
- 기본적으로 모든 트리거는 Cloud Functions에서 추가할 수 있습니다.
- 만약 특정 상품에서 트리거할 경우, Cloud Functions에 전달해야 합니다.
Cronjob 트리거 설정하기
Cronjob 트리거를 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요.로 설정하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류에서 Cronjob을 선택하세요. 하단에 필수 정보 입력 영역이 나타납니다.
| 구분 | 상세 설명 |
|---|
| Cronjob 설정 | 트리거의 반복 빈도를 설정- 분, 시간, 일, 월, 요일 단위로 설정 가능
|
| Timezone 설정 | 트리거의 기준 시간대를 설정 |
표. Cronjob 트리거 필수 정보 항목
- 필수 정보를 입력한 후, 확인 버튼을 클릭하세요.
- 추가를 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
API Gateway 트리거 설정하기
API Gateway 트리거를 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요.로 설정하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류에서 API Gateway을 선택하세요. 하단에 필수 정보 입력 영역이 나타납니다.
| 구분 | 상세 설명 |
|---|
| API명 | API 선택- 기존에 생성된 API를 선택하거나 새로 생성 가능
|
| 스테이지 | 배포 대상 선택- 기존에 생성된 스테이지를 선택하거나 새로 생성 가능
|
표. API Gateway 트리거 필수 정보 항목
- 필수 정보를 입력한 후, 확인 버튼을 클릭하세요.
- 추가를 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
멀티 트리거 설정하기
하나의 함수에 여러개의 트리거를 연결하여 사용할 수 있습니다.
트리거 수정하기
추가된 트리거를 수정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 수정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 목록에서 설정값을 수정할 트리거의 수정 버튼을 클릭하세요. 트리거 수정 팝업창이 열립니다.
- 트리거 수정 팝업창에서 설정값을 수정한 후, 확인 버튼을 클릭하세요.
- 수정을 알리는 팝업창이 열리면 확인을 클릭하세요.
트리거 삭제하기
트리거를 삭제하려면 다음 절차를 따르세요.
주의
특정 상품과 연계한 트리거는, 해당 상품에서 연계 시점에 전달한 상품만 관리하며, Functions 해지 시 해당 상품에 삭제 상태를 전달해야 합니다.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭의 트리거 목록에서 삭제할 트리거를 선택한 후, 삭제 버튼을 클릭하세요.
- 트리거 삭제를 알리는 팝업창이 열리면 확인 버튼을 클릭하세요.
2 - AIOS 연계하기
AIOS 연계하기
Cloud Functions와 AIOS를 연계하여 LLM을 활용할 수 있습니다.
AIOS LLM 프라이빗 엔드포인트
AIOS LLM 프라이빗 엔드포인트의 URL은 다음과 같습니다.
참고
AIOS 서비스의 리전별 제공 여부와 제공 모델에 대한 자세한 내용은 다음을 참조하세요.
Blueprint 소스코드 변경하기
Cloud Functions와 AIOS를 연계하려면 각 리전 내 사용하는 LLM Endpoint에 맞춰 Blueprint에 있는 URL 주소를 변경해야 합니다.
Blueprint 소스코드를 변경하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Cloud Functions 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 URL로 호출할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 코드 탭을 클릭하여 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- Python, Node.js, Go Runtime 소스코드를 사용하여 Blueprint를 변경한 후, 저장 버튼을 클릭하세요.
- Python 소스코드
import json
import requests
def handle_request(params):
# User writing area (Function details)
url = "{AIOS LLM 프라이빗 엔드포인트}/{API}" # Destination URL
data = { "model": "openai/gpt-oss-120b"
, "prompt" : "Write a haiku about recursion in programming."
, "temperature": 0
, "max_tokens": 100
, "stream": False
}
try:
response = requests.post(url, json=data, verify=True)
return {
'statusCode': response.status_code,
'body': json.dumps(response.text)
}
except requests.exceptions.RequestException as e:
return str(e)
import json
import requests
def handle_request(params):
# User writing area (Function details)
url = "{AIOS LLM 프라이빗 엔드포인트}/{API}" # Destination URL
data = { "model": "openai/gpt-oss-120b"
, "prompt" : "Write a haiku about recursion in programming."
, "temperature": 0
, "max_tokens": 100
, "stream": False
}
try:
response = requests.post(url, json=data, verify=True)
return {
'statusCode': response.status_code,
'body': json.dumps(response.text)
}
except requests.exceptions.RequestException as e:
return str(e)
Python 소스코드 - Node.js 소스코드
const request = require('request');
/**
* @description User writing area (Function details)
*/
exports.handleRequest = async function (params) {
return await sendRequest(params);
};
async function sendRequest(req) {
return new Promise((resolve, reject) => {
url = "{AIOS LLM 프라이빗 엔드포인트}/{API}"
data = { model: 'openai/gpt-oss-120b'
, prompt : 'Write a haiku about recursion in programming.'
, temperature: 0
, max_tokens: 100
, stream: false
}
const options = {
uri: url,
method:'POST',
body: data,
json: true,
strictSSL: false,
rejectUnauthorized: false
}
request(options, (error, response, body) => {
if (error) {
reject(error);
} else {
resolve({
statusCode: response.statusCode,
body: JSON.stringify(body)
});
}
});
});
}
const request = require('request');
/**
* @description User writing area (Function details)
*/
exports.handleRequest = async function (params) {
return await sendRequest(params);
};
async function sendRequest(req) {
return new Promise((resolve, reject) => {
url = "{AIOS LLM 프라이빗 엔드포인트}/{API}"
data = { model: 'openai/gpt-oss-120b'
, prompt : 'Write a haiku about recursion in programming.'
, temperature: 0
, max_tokens: 100
, stream: false
}
const options = {
uri: url,
method:'POST',
body: data,
json: true,
strictSSL: false,
rejectUnauthorized: false
}
request(options, (error, response, body) => {
if (error) {
reject(error);
} else {
resolve({
statusCode: response.statusCode,
body: JSON.stringify(body)
});
}
});
});
}
Node.js 소스코드 - GO 소스코드
package gofunction
import (
"bytes"
"net/http"
"encoding/json"
"io/ioutil"
)
type PostData struct {
Model string `json:"model"`
Prompt string `json:"prompt"`
Temperature int `json:"temperature"`
MaxTokens int `json:"max_tokens"`
Stream bool `json:"stream"`
}
func HandleRequest(r *http.Request)(string, error) {
url := "{AIOS LLM 프라이빗 엔드포인트}/{API}"
data := PostData {
Model: "openai/gpt-oss-120b",
Prompt: "Write a haiku about recursion in programming.",
Temperature: 0,
MaxTokens: 100,
Stream: false,
}
jsonData, err := json.Marshal(data)
if err != nil {
panic(err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 응답 본문 읽기
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
return string(body), nil
}
package gofunction
import (
"bytes"
"net/http"
"encoding/json"
"io/ioutil"
)
type PostData struct {
Model string `json:"model"`
Prompt string `json:"prompt"`
Temperature int `json:"temperature"`
MaxTokens int `json:"max_tokens"`
Stream bool `json:"stream"`
}
func HandleRequest(r *http.Request)(string, error) {
url := "{AIOS LLM 프라이빗 엔드포인트}/{API}"
data := PostData {
Model: "openai/gpt-oss-120b",
Prompt: "Write a haiku about recursion in programming.",
Temperature: 0,
MaxTokens: 100,
Stream: false,
}
jsonData, err := json.Marshal(data)
if err != nil {
panic(err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
// 응답 본문 읽기
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
return string(body), nil
}
GO 소스코드
3 - Blueprint 상세 가이드
Blueprint 개요
Cloud Functions 생성 시 Blueprint를 설정하여 Cloud Functions에서 제공하는 Runtime 소스코드를 활용할 수 있습니다.
Cloud Functions에서 제공하는 Blueprint 항목은 다음을 참조하세요.
Hello World
Hello World 응답 받기 설정 및 함수 호출 예시(함수 URL 이용)를 설명합니다.
Hello World 설정하기
Hello World를 설정하려면 다음 절차를 따르세요.
모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
Function 목록 페이지에서 URL로 호출할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
구성 탭을 클릭한 후, 함수 URL 항목의 수정 버튼을 클릭하세요. 함수 URL 수정 팝업창이 열립니다.
함수 URL 수정 팝업창에서 활성화 여부를 사용으로 설정한 후, 확인 버튼을 클릭하세요.
| 구분 | 상세 설명 |
|---|
| 활성화 여부 | 함수 URL의 사용 여부를 설정 |
| 인증 유형 | 함수 URL에 대한 요청 시 IAM 인증 사용 여부 선택 |
| 접근 제어 | 접근 가능한 IP를 추가하여 관리 가능- 사용으로 설정한 후, 퍼블릭 접근 IP 입력 및 추가 가능
|
표. 트리거 추가 시 필수 입력 항목
코드 탭으로 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
성공 및 실패 케이스에 대한 처리 로직을 추가한 후, 저장 버튼을 클릭하세요.
- Node.js 소스코드
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
const response = {
statusCode: 200,
body: JSON.stringify('Hello Serverless World!'),
};
return response;
};
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
const response = {
statusCode: 200,
body: JSON.stringify('Hello Serverless World!'),
};
return response;
};
Hello World - Node.js 소스코드 - Python 소스코드
import json
def handle_request(params):
# User writing area (Function details)
return {
'statusCode': 200,
'body': json.dumps('Hello Serverless World!')
}
import json
def handle_request(params):
# User writing area (Function details)
return {
'statusCode': 200,
'body': json.dumps('Hello Serverless World!')
}
Hello World - Python 소스코드 - PHP 소스코드
<?php
function handle_request() {
# User writing area (Function details)
$res = array(
'statusCode' => 200,
'body' => 'Hello Serverless World!',
);
return $res;
}
?>
<?php
function handle_request() {
# User writing area (Function details)
$res = array(
'statusCode' => 200,
'body' => 'Hello Serverless World!',
);
return $res;
}
?>
Hello World - PHP 소스코드
함수 호출 확인하기
Function 상세 페이지의 구성 탭에서 함수 URL을 호출한 후, 응답을 확인합니다.
Hello Serverless World!
Execution after timeout
제한시간 이후 함수 실행(Execution after timeout) 설정 및 함수 호출 예시(함수 URL 사용)를 설명합니다.
Execution after timeout 설정하기
Execution after timeout을 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류 항목을 선택한 후, 하단에 표시되는 필수 정보를 입력하고 확인 버튼을 클릭하세요.
- 필수 정보는 트리거 종류에 따라 달라집니다.
| 트리거 종류 | 입력 항목 |
|---|
| API Gateway | - API명: 기존에 생성된 API를 선택하거나 새로 생성 가능
- 스테이지: 기존에 생성된 스테이지를 선택하거나 새로 생성 가능
|
| Cronjob | - 예시를 참고하여 트리거의 반복 빈도(분, 시, 일, 월, 요일)를 입력
- Timezone 설정: 적용할 기준 시간대를 선택
|
표. 트리거 추가 시 필수 입력 항목
- 코드 탭으로 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- 성공 및 실패 케이스에 대한 처리 로직을 추가한 후, 저장 버튼을 클릭하세요.
- Node.js 소스코드
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
console.log("Hello world 3");
await delay(3000);
const response = {
statusCode: 200,
body: JSON.stringify('Hello Serverless World!'),
};
return response;
};
const delay = (ms) => {
return new Promise(resolve=>{
setTimeout(resolve,ms)
})
}
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
console.log("Hello world 3");
await delay(3000);
const response = {
statusCode: 200,
body: JSON.stringify('Hello Serverless World!'),
};
return response;
};
const delay = (ms) => {
return new Promise(resolve=>{
setTimeout(resolve,ms)
})
}
Execution after timeout - Node.js 소스코드
함수 호출 확인하기
Function 상세 페이지의 구성 탭에서 함수 URL을 호출하고 일정 시간이 지난 후, 응답을 확인합니다.
Hello Serverless World!
HTTP request body
Request Body 파싱하기 설정 및 함수 호출 예시(함수 URL 사용)를 설명합니다.
HTTP request body 설정하기
HTTP request body를 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류 항목을 선택한 후, 하단에 표시되는 필수 정보를 입력하고 확인 버튼을 클릭하세요.
- 필수 정보는 트리거 종류에 따라 달라집니다.
| 트리거 종류 | 입력 항목 |
|---|
| API Gateway | - API명: 기존에 생성된 API를 선택하거나 새로 생성 가능
- 스테이지: 기존에 생성된 스테이지를 선택하거나 새로 생성 가능
|
| Cronjob | - 예시를 참고하여 트리거의 반복 빈도(분, 시, 일, 월, 요일)를 입력
- Timezone 설정: 적용할 기준 시간대를 선택
|
표. 트리거 추가 시 필수 입력 항목
- 코드 탭으로 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- 성공 및 실패 케이스에 대한 처리 로직을 추가한 후, 저장 버튼을 클릭하세요.
- Node.js 소스코드
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
const response = {
statusCode: 200,
body: JSON.stringify(params.body),
};
return response;
};
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
const response = {
statusCode: 200,
body: JSON.stringify(params.body),
};
return response;
};
Execution after timeout - Node.js 소스코드 - Python 소스코드
import json
def handle_request(params):
# User writing area (Function details)
return {
'statusCode': 200,
'body': json.dumps(params.json)
}
import json
def handle_request(params):
# User writing area (Function details)
return {
'statusCode': 200,
'body': json.dumps(params.json)
}
Execution after timeout - Python 소스코드
함수 호출 확인하기
Function 상세 페이지의 구성 탭에서 함수 URL을 호출한 후, Body 데이터와 요청 Body값, 응답 Body값을 확인합니다.
요청 Body값
{
"testKey" :"cloud-001",
"testNames": [
{
"name": "Son"
},
{
"name": "Kim"
}
],
"testCode":"test"
}
{
"testKey" :"cloud-001",
"testNames": [
{
"name": "Son"
},
{
"name": "Kim"
}
],
"testCode":"test"
}
요청 Body 값응답 Body값
{
"testKey" :"cloud-001",
"testNames": [
{
"name": "Son"
},
{
"name": "Kim"
}
],
"testCode":"test"
}
{
"testKey" :"cloud-001",
"testNames": [
{
"name": "Son"
},
{
"name": "Kim"
}
],
"testCode":"test"
}
응답 Body 값
Send HTTP requests
HTTP 요청하기 설정 및 함수 호출 예시(함수 URL 사용)를 설명합니다.
Send HTTP requests 설정하기
Send HTTP requests를 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류 항목을 선택한 후, 하단에 표시되는 필수 정보를 입력하고 확인 버튼을 클릭하세요.
- 필수 정보는 트리거 종류에 따라 달라집니다.
| 트리거 종류 | 입력 항목 |
|---|
| API Gateway | - API명: 기존에 생성된 API를 선택하거나 새로 생성 가능
- 스테이지: 기존에 생성된 스테이지를 선택하거나 새로 생성 가능
|
| Cronjob | - 예시를 참고하여 트리거의 반복 빈도(분, 시, 일, 월, 요일)를 입력
- Timezone 설정: 적용할 기준 시간대를 선택
|
| |
| 표. 트리거 추가 시 필수 입력 항목 | |
| |
- 코드 탭으로 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- 성공 및 실패 케이스에 대한 처리 로직을 추가한 후, 저장 버튼을 클릭하세요.
- Node.js 소스코드
const request = require('request');
/**
* @description User writing area (Function details)
*/
exports.handleRequest = async function (params) {
return await sendRequest(params);
};
async function sendRequest(req) {
return new Promise((resolve, reject) => {
// Port 80 and Port 443 are available
url = "https://example.com"; // Destination URL
const options = {
uri: url,
method:'GET',
json: true,
strictSSL: false,
rejectUnauthorized: false
}
request(options, (error, response, body) => {
if (error) {
reject(error);
} else {
resolve({
statusCode: response.statusCode,
body: JSON.stringify(body)
});
}
});
});
}
const request = require('request');
/**
* @description User writing area (Function details)
*/
exports.handleRequest = async function (params) {
return await sendRequest(params);
};
async function sendRequest(req) {
return new Promise((resolve, reject) => {
// Port 80 and Port 443 are available
url = "https://example.com"; // Destination URL
const options = {
uri: url,
method:'GET',
json: true,
strictSSL: false,
rejectUnauthorized: false
}
request(options, (error, response, body) => {
if (error) {
reject(error);
} else {
resolve({
statusCode: response.statusCode,
body: JSON.stringify(body)
});
}
});
});
}
Send HTTP requests - Node.js 소스코드 - Python 소스코드
import json
import requests
def handle_request(params):
# User writing area (Function details)
# Port 80 and Port 443 are available
url = "https://example.com" # Destination URL
try:
response = requests.get(url, verify=True)
return {
'statusCode': response.status_code,
'body': json.dumps(response.text)
}
except requests.exceptions.RequestException as e:
return str(e)
import json
import requests
def handle_request(params):
# User writing area (Function details)
# Port 80 and Port 443 are available
url = "https://example.com" # Destination URL
try:
response = requests.get(url, verify=True)
return {
'statusCode': response.status_code,
'body': json.dumps(response.text)
}
except requests.exceptions.RequestException as e:
return str(e)
Send HTTP requests - Python 소스코드
함수 호출 확인하기
Function 상세 페이지의 구성 탭에서 함수 URL을 호출한 후, 응답을 확인합니다.
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>
<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
함수 호출 응답 확인Print logs
Log 출력하기 설정 및 함수 호출 예시(함수 URL 사용)를 설명합니다.
Print logs 설정하기
Print logs 응답 받기를 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류 항목을 선택한 후, 하단에 표시되는 필수 정보를 입력하고 확인 버튼을 클릭하세요.
- 필수 정보는 트리거 종류에 따라 달라집니다.
| 트리거 종류 | 입력 항목 |
|---|
| API Gateway | - API명: 기존에 생성된 API를 선택하거나 새로 생성 가능
- 스테이지: 기존에 생성된 스테이지를 선택하거나 새로 생성 가능
|
| Cronjob | - 예시를 참고하여 트리거의 반복 빈도(분, 시, 일, 월, 요일)를 입력
- Timezone 설정: 적용할 기준 시간대를 선택
|
| |
| 표. 트리거 추가 시 필수 입력 항목 | |
| |
- 코드 탭으로 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- 성공 및 실패 케이스에 대한 처리 로직을 추가한 후, 저장 버튼을 클릭하세요.
- Node.js 소스코드
const winston = require('winston');
// Log module setting
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(info => info.timestamp + ' ' + info.level + ': ' + info.message)
),
transports: [
new winston.transports.Console()
]
});
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
const response = {
statusCode: 200,
body: JSON.stringify(params.body),
};
logger.info(JSON.stringify(response, null, 2));
return response;
};
const winston = require('winston');
// Log module setting
const logger = winston.createLogger({
format: winston.format.combine(
winston.format.timestamp(),
winston.format.printf(info => info.timestamp + ' ' + info.level + ': ' + info.message)
),
transports: [
new winston.transports.Console()
]
});
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
const response = {
statusCode: 200,
body: JSON.stringify(params.body),
};
logger.info(JSON.stringify(response, null, 2));
return response;
};
Print logs - Node.js 소스코드 - Python 소스코드
import json
import logging
# Log module setting
logging.basicConfig(level=logging.INFO)
def handle_request(params):
# User writing area (Function details)
response = {
'statusCode': 200,
'body': json.dumps(params.json)
}
logging.info(response)
return response
import json
import logging
# Log module setting
logging.basicConfig(level=logging.INFO)
def handle_request(params):
# User writing area (Function details)
response = {
'statusCode': 200,
'body': json.dumps(params.json)
}
logging.info(response)
return response
Print logs - Python 소스코드
함수 호출 확인하기
Function 상세 페이지의 구성 탭에서 함수 URL을 호출한 후, 로그 탭에서 로그를 확인합니다.
[2023-09-07] 12:06:23] "host": "scf-xxxxxxxxxxxxxxxxxxxxx",
[2023-09-07] 12:06:23] "ce-id": "xxxxxxxxxxxxxxxxxxxxx",
[2023-09-07] 12:06:23] "ce-source": "xxxxxxxxxxxxxxxxxxxxx",
[2023-09-07] 12:06:23] "host": "scf-xxxxxxxxxxxxxxxxxxxxx",
[2023-09-07] 12:06:23] "ce-id": "xxxxxxxxxxxxxxxxxxxxx",
[2023-09-07] 12:06:23] "ce-source": "xxxxxxxxxxxxxxxxxxxxx",
함수 호출 응답 확인Throw a custom error
커스텀 에러 발생(Throw a custom error) 설정 및 함수 호출 예시(함수 URL 사용)를 설명합니다.
Throw a custom error 설정하기
Throw a custom error를 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류 항목을 선택한 후, 하단에 표시되는 필수 정보를 입력하고 확인 버튼을 클릭하세요.
- 필수 정보는 트리거 종류에 따라 달라집니다.
| 트리거 종류 | 입력 항목 |
|---|
| API Gateway | - API명: 기존에 생성된 API를 선택하거나 새로 생성 가능
- 스테이지: 기존에 생성된 스테이지를 선택하거나 새로 생성 가능
|
| Cronjob | - 예시를 참고하여 트리거의 반복 빈도(분, 시, 일, 월, 요일)를 입력
- Timezone 설정: 적용할 기준 시간대를 선택
|
표. 트리거 추가 시 필수 입력 항목
- 코드 탭으로 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- 성공 및 실패 케이스에 대한 처리 로직을 추가한 후, 저장 버튼을 클릭하세요.
- Node.js 소스코드
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
throw new CustomError('This is a custom error!');
};
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
throw new CustomError('This is a custom error!');
};
Throw a custom error - Node.js 소스코드 - Python 소스코드
class CustomError(Exception):
def __init__(self, message):
self.message = message
def handle_request(parmas):
raise CustomError('This is a custom error!')
class CustomError(Exception):
def __init__(self, message):
self.message = message
def handle_request(parmas):
raise CustomError('This is a custom error!')
Throw a custom error - Python 소스코드 - PHP 소스코드
<?php
class CustomError extends Exception {
public function __construct($message) {
parent::__construct($message);
$this->message = $message;
}
}
function handle_request() {
throw new CustomError('This is a custom error!');
}
?>
<?php
class CustomError extends Exception {
public function __construct($message) {
parent::__construct($message);
$this->message = $message;
}
}
function handle_request() {
throw new CustomError('This is a custom error!');
}
?>
Throw a custom error - PHP 소스코드
함수 호출 확인하기
Function 상세 페이지의 구성 탭에서 함수 URL을 호출한 후, 로그 탭에서 에러 발생 여부를 확인합니다.
Using Environment Variable
환경 변수 사용(Using Environment Variable) 설정 및 함수 호출 예시(함수 URL 사용)를 설명합니다.
Using Environment Variable 설정하기
Using Environment Variable를 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 트리거를 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- 트리거 탭을 클릭한 후, 트리거 추가 버튼을 클릭하세요. 트리거 추가 팝업창이 열립니다.
- 트리거 추가 팝업창에서 트리거 종류 항목을 선택한 후, 하단에 표시되는 필수 정보를 입력하고 확인 버튼을 클릭하세요.
- 필수 정보는 트리거 종류에 따라 달라집니다.
| 트리거 종류 | 입력 항목 |
|---|
| API Gateway | - API명: 기존에 생성된 API를 선택하거나 새로 생성 가능
- 스테이지: 기존에 생성된 스테이지를 선택하거나 새로 생성 가능
|
| Cronjob | - 예시를 참고하여 트리거의 반복 빈도(분, 시, 일, 월, 요일)를 입력
- Timezone 설정: 적용할 기준 시간대를 선택
|
표. 트리거 추가 시 필수 입력 항목
- 코드 탭으로 이동한 후, 수정 버튼을 클릭하세요. Function 코드 수정 페이지로 이동합니다.
- 성공 및 실패 케이스에 대한 처리 로직을 추가한 후, 저장 버튼을 클릭하세요.
- Node.js 소스코드
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
return process.env.test;
};
exports.handleRequest = async function (params) {
/**
* @description User writing area (Function details)
*/
return process.env.test;
};
Using Environment Variable - Node.js 소스코드 - Python 소스코드
import json
import os
def handle_request(params):
# User writing area (Function details)
return os.environ.get("test")
import json
import os
def handle_request(params):
# User writing area (Function details)
return os.environ.get("test")
Using Environment Variable - Python 소스코드 - PHP 소스코드
import json
def handle_request(params):
# User writing area (Function details)
return os.environ.get("test")
import json
def handle_request(params):
# User writing area (Function details)
return os.environ.get("test")
Using Environment Variable - PHP 소스코드
- 구성 탭으로 이동한 후, 환경 변수 영역의 수정 버튼을 클릭하세요. 환경 변수 수정 팝업창이 열립니다.
- 환경 변수 정보를 입력한 후, 확인 버튼을 클릭하세요.
| 구분 | 상세 설명 |
|---|
| 이름 | Key값을 입력 |
| 값 | Value값을 입력 |
표. 환경 변수 입력 항목
함수 호출 확인하기
Function 상세 페이지의 구성 탭에서 함수 URL을 호출한 후, 로그 탭에서 환경 변수값을 확인합니다.
4 - PrivateLink 서비스 연계하기
Cloud Functions와 PrivateLink 서비스를 연계하여 Samsung Cloud Platform 내부의 VPC와 VPC, VPC와 서비스를 외부 인터넷 없이 연결할 수 있습니다.
데이터가 내부 네트워크만 이용하게되어 보안성이 높고, 퍼블릭 IP, NAT, VPN, 인터넷 게이트웨이 등이 필요하지 않습니다.
PrivateLink 서비스 활성화하기
PrivateLink Service를 연계하기 위해 서비스를 먼저 활성화해야 합니다.
PrivateLink 서비스를 활성화하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 PrivateLink를 연계할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- Function 상세 페이지에서 구성 탭을 클릭하세요.
- Private 연결 구성에서 PrivateLink Service의 수정 버튼을 클릭하세요. PrivateLink Service 수정 팝업창이 열립니다.
- PrivateLink Service 수정 팝업창에서 활성화 여부의 사용 항목을 체크한 후, 확인 버튼을 클릭하세요. 구성 탭의 Private 연결 구성에 PrivateLink Service 정보가 표시됩니다.
| 구분 | 상세 설명 |
|---|
| Private URL | PrivateLink Service URL 정보 |
| PrivateLink Service ID | PrivateLink Service ID 정보 |
| 요청 Endpoint 관리 | PrivateLink Service 연결을 요청한 PrivateLink Endpoint 목록- 승인 관리 버튼을 클릭하여 상태 변경 가능
- Requesting: 연결 요청 중인 Endpoint. 승인 또는 거부 버튼을 클릭하여 승인 여부 선택
- Active: 연결이 완료된 Endpoint. 차단 버튼을 클릭하여 연결 해제 가능
- Disconnected: 연결이 해제된 Endpoint. 재연결 버튼을 클릭하여 연결 가능
- Reject: 연결 요청 승인이 거부된 Endpoint
|
표. PrivateLink Service 상세 정보 항목
PrivateLink 서비스 연계하기
PrivateLink Service를 연계하여 함수를 다른 VPC에서 프라이빗하게 접근할 수 있도록 노출시킬 수 있습니다.
안내
PrivateLink Service를 먼저 활성화한 후, 연계 작업을 진행하세요.
PrivateLink 서비스를 연계하려면 다음 작업을 확인하세요.
PrivateLink Endpoint 생성하기
사용자 VPC의 PrivateLink Service에 접근하기 위한 Entry Point를 생성합니다.
주의
Endpoint 생성 시 추가 비용이 발생할 수 있습니다.
PrivateLink Endpoint를 생성하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 PrivateLink를 연계할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- Function 상세 페이지에서 구성 탭을 클릭하세요.
- Private 연결 구성에서 PrivateLink Endpoint의 추가 버튼을 클릭하세요. PrivateLink Endpoint 추가 팝업창이 열립니다.
- PrivateLink Service 추가 팝업창에서 PrivateLink Service ID와 Alias 정보를 입력한 후, 확인 버튼을 클릭하세요.
- 생성을 알리는 팝업창이 열리면 확인 버튼을 클릭하세요. 구성 탭의 Private 연결 구성에 PrivateLink Endpoint 정보가 표시됩니다.
| 구분 | 상세 설명 |
|---|
| PrivateLink Endpoint ID | PrivateLink Endpoint ID 정보 |
| PrivateLink Service ID | PrivateLink Service ID 정보 |
| Alias | PrivateLink Endpoint 접근을 위해 IP 주소 대신 사용 가능한 hostalias 정보 |
| 상태 | PrivateLink Endpoint의 승인 상태- Reject: 승인 거부. 재요청 버튼을 클릭하여 재요청 가능
|
표. PrivateLink Endpoint 상세 정보 항목
APIGW Private EPS 연계하기
SCF Endpoint와 APIGW Private Endpoint를 연결하려면 SCF Endpoint Alias에 APIGW EPS의 resource path를 대신하여 Private URL을 기재해야 합니다.
- Private URL 예시:
181b6126ef6d4e4b81370df5.apigw.private.kr-west1.s.samsungsdscloud.com/get/resourcepath
APIGW Private EPS 연계하려면 다음 코드를 참조하세요.
const request = require('request');
/**
* @description User writing area (Function details)
*/
exports.handleRequest = async function (params) {
return await sendRequest(params);
};
async function sendRequest(req) {
return new Promise((resolve, reject) => {
// Port 80 and Port 443 are available
url = "https://{alias}/{resource_path}"; // Destination URL
/**
{alias}는 함수 내에서 Endpoint 생성 시 입력한 alias명
{resoure_path}는 APIGW EPS의 Private URL에서 지정한 resource path (/get/resourcepath)
*/
const options = {
uri: url,
method:'GET',
json: true,
strictSSL: false,
rejectUnauthorized: false
}
request(options, (error, response, body) => {
if (error) {
reject(error);
} else {
resolve({
statusCode: response.statusCode,
body: JSON.stringify(body)
});
}
});
});
}
const request = require('request');
/**
* @description User writing area (Function details)
*/
exports.handleRequest = async function (params) {
return await sendRequest(params);
};
async function sendRequest(req) {
return new Promise((resolve, reject) => {
// Port 80 and Port 443 are available
url = "https://{alias}/{resource_path}"; // Destination URL
/**
{alias}는 함수 내에서 Endpoint 생성 시 입력한 alias명
{resoure_path}는 APIGW EPS의 Private URL에서 지정한 resource path (/get/resourcepath)
*/
const options = {
uri: url,
method:'GET',
json: true,
strictSSL: false,
rejectUnauthorized: false
}
request(options, (error, response, body) => {
if (error) {
reject(error);
} else {
resolve({
statusCode: response.statusCode,
body: JSON.stringify(body)
});
}
});
});
}
APIGW Private EPS 연계 코드5 - 리소스 기반 정책 가이드
리소스 기반 정책 개요
Cloud Functions의 리소스 기반 정책(Resource-based Policy)은 리소스에 부여되는 정책으로써 특정 자원에 대한 행동(Action)을 주체(Principal)에 한하여 허용하거나 거부(Effect)하도록 결정할 수 있습니다.
리소스 기반 정책을 활용하여 함수를 실행(Invoke)할 수 있는 주체를 직접 정의할 수 있습니다.
참고
일반적인 IAM 정책(Identity-based)이 사용자에게 권한을 주는 것이라면, 리소스 기반 정책은 함수 자체에 적용하여 외부의 접근을 허용하는 방식입니다.
리소스 기반 정책을 통해 다음을 정의하여 함수 호출을 허용할 수 있습니다.
- 지정된 Samsung Cloud Platform 계정의 사용자
- 지정된 소스 IP 주소 범위 또는 CIDR 블록
소스 정책은 지정된 보안 주체(보통 IAM 역할 또는 그룹)가 API를 호출할 수 있는지 여부를 제어하기 위해 API에 연결되는 JSON 정책 문서 형태로 정의됩니다.
| 구분 | 설명 | 예시 |
|---|
| 대상(Principal) | 함수를 호출할 주체 지정 | 특정 오브젝트 스토리지 버킷, API Gateway, 다른 Samsung Cloud Platform 계정 등 |
| 작업(Action) | 허용할 기능을 정의 | 대부분 scf:InvokeFunction |
| 조건(Condition) | 특정 상황에서만 허용하도록 제한 | “특정 SRN을 가진 버킷에서 온 요청만 허용” |
표. API 호출 여부를 제어하는 Entity
참고
- Cloud Functions의 리소스 기반 정책은 IAM의 리소스 기반 정책의 규칙을 활용합니다.
- JSON을 활용하여 정책을 생성하거나 수정하는 방법은 JSON 모드 활용 가이드를 참고하세요.
리소스 기반 정책 사용 시나리오
리소스 기반 정책의 주요 사용 시나리오는 다음과 같습니다.
리소스 기반 정책 시나리오
Cloud Functions의 기능이 동작할 때 활용되는 리소스 기반 정책 시나리오는 다음과 같습니다.
| 구분 | 설명 | 참고 예시 |
|---|
| 함수 URL - 인증타입 None | 함수의 URL을 생성하여 호출할 때 필요합니다.- 리소스 기반 정책이 없으면 인가에 실패하여 Public URL을 이용한 함수 호출이 불가능합니다.
| 함수 URL(인증타입 None) 예시 |
| 함수 URL - 인증타입 IAM | - 리소스 기반 정책으로 등록되어 있거나 자격 증명 권한이 필요합니다.
- 동일 Account의 자원인 경우: 리소스 기반 정책 또는 자격 증명 권한(InvokeFunctionUrl)이 있으면 호출할 수 있습니다.
- 타 Account의 자원인 경우: 리소스 기반 정책과 자격 증명 권한(InvokeFunction)이 모두 있어야 호출할 수 있습니다.
| 함수 URL(인증 타입 IAM) 예시 |
| API Gateway 트리거 | 외부 API 요청을 처리하기 위해 API Gateway가 Lambda를 호출할 때 필요합니다.- 리소스 기반 정책이 없으면 인가에 실패하여 API Gateway를 이용한 함수 호출이 불가능합니다.
| API Gateway 트리거 예시 |
| PrivateLink 연결 | PrivateLink Service를 연결해 함수를 다른 VPC에서 프라이빗하게 접근하도록 정의할 수 있습니다.- 리소스 기반 정책으로 등록되어 있거나 자격 증명 권한이 필요합니다.
- 동일 Account의 자원인 경우: 리소스 기반 정책 혹은 자격 증명 권한(InvokeFunction)이 있으면 호출할 수 있습니다.
- 타 Account의 자원인 경우: 리소스 기반 정책과 자격 증명 권한(InvokeFunction)이 모두 있어야 호출할 수 있습니다.
| PrivateLink 연결 예시 |
표. 리소스 기반 정책 시나리오
사용자 추가 활용 시나리오
Cloud Functions의 리소스 기반 정책으로 자동으로 등록되진 않지만 필요에 따라 사용자가 추가하여 활용할 수 있습니다.
사용자가 추가하여 활용할 수 있는 시나리오는 다음과 같습니다.
- 교차 계정 접근
- A 계정의 IAM 사용자가 B 계정의 Lambda를 실행하고 싶은 경우, B 계정 함수 정책에 A 계정을 등록합니다.
- 하이브리드 접근 제어
- 단순히 계정이나 IP만 제한하는 것이 아니라, 특정 사용자와 특정 IP 대역 두 조건이 동시에 만족해야 접근할 수 있도록 구성할 수 있습니다.
Cloud Functions의 리소스 기반 정책 관리
Cloud Functions의 리소스 기반 정책을 확인하고 설정하려면 다음 절차를 따르세요.
- 모든 서비스 > Compute > Cloud Functions 메뉴를 클릭하세요. Cloud Functions의 Service Home 페이지로 이동합니다.
- Service Home 페이지에서 Function 메뉴를 클릭하세요. Function 목록 페이지로 이동합니다.
- Function 목록 페이지에서 정책을 설정할 자원을 클릭하세요. Function 상세 페이지로 이동합니다.
- Function 상세 페이지의 구성 탭을 클릭하세요.
- 리소스 기반 정책 권한 항목의 수정 버튼을 클릭하세요. 리소스 정책 수정 팝업창이 열립니다.
- 리소스 정책 수정 팝업창에서 정책 템플릿을 선택한 후, 정책을 작성하세요.
- 작성이 완료되면 확인 버튼을 클릭하세요.
- 삭제 버튼을 클릭하면 등록된 정책이 삭제됩니다.
리소스 기반 정책 예시
사용자는 필요에 따라 리소스 기반 정책을 추가로 정의하거나 기존 정책을 수정하여 활용할 수 있습니다.
참고
- 일부 기능들의 경우에는 Cloud Functions에서 사용하려면 리소스 기반 정책(또는 자격 증명)이 등록되어 있어야 합니다.
- 이 가이드에서 설명하고 있는 리소스 기반 정책 예시의 경우, 각 기능들이 활성화되거나 연결될 때 예시의 리소스 기반 정책을 Cloud Functions가 자동으로 등록하고 있습니다.
함수 URL - 인증타입 None
Principal이 /*인 Public 호출을 허용하는 정책입니다.
정책 템플릿
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["NONE"]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "InvokeFunctionURLAllowPublicAccess"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["NONE"]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "InvokeFunctionURLAllowPublicAccess"
}
],
"Version": "2024-07-01"
}
함수 URL - 인증타입 None 정책 템플릿 예시정책 예시
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["NONE"]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
"Sid": "InvokeFunctionURLAllowPublicAccess"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["NONE"]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
"Sid": "InvokeFunctionURLAllowPublicAccess"
}
],
"Version": "2024-07-01"
}
함수 URL - 인증타입 None 정책 예시함수 URL - 인증타입 IAM
특정 사용자에게 Public URL 호출을 허용하는 정책입니다.
정책 템플릿
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["SCP_IAM"]
}
},
"Effect": "Allow",
"Principal": {
"scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
},
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "Statement1"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["SCP_IAM"]
}
},
"Effect": "Allow",
"Principal": {
"scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
},
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "Statement1"
}
],
"Version": "2024-07-01"
}
함수 URL - 인증타입 IAM 정책 템플릿 예시정책 예시
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["SCP_IAM"]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
"Sid": "accountID-iam-invokefunctionurl"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": ["scf:InvokeFunctionUrl"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": ["SCP_IAM"]
}
},
"Effect": "Allow",
"Principal": "*",
"Resource": ["srn:e::accountID:kr-west1::scf:cloud-function/functionsID"],
"Sid": "accountID-iam-invokefunctionurl"
}
],
"Version": "2024-07-01"
}
함수 URL - 인증타입 IAM 정책 예시API Gateway 트리거
Principal이 *인 Public 호출을 허용하는 정책입니다.
정책 템플릿
{
"Statement": [
{
"Action": ["scf:InvokeFunction"],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['x-scf-request-obj-srn']": ["{{ApiGatewayMethodSrn}}"]
}
},
"Effect": "Allow",
"Principal": {
"Service": ["apigateway.samsungsdscloud.com"]
},
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "Statement1"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": ["scf:InvokeFunction"],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['x-scf-request-obj-srn']": ["{{ApiGatewayMethodSrn}}"]
}
},
"Effect": "Allow",
"Principal": {
"Service": ["apigateway.samsungsdscloud.com"]
},
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "Statement1"
}
],
"Version": "2024-07-01"
}
API Gateway 트리거 정책 템플릿 예시정책 예시
{
"Statement": [
{
"Action": [
"scf:InvokeFunction"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['x-scf-request-obj-srn']": [
"srn:e::accountID:kr-west1::apigateway:method/MethodID/*/GET/test"
]
}
},
"Effect": "Allow",
"Principal": {
"Service": [
"apigateway.samsungsdscloud.com"
]
},
"Resource": [
"srn:e::accountID:kr-west1::scf:cloud-function/functionID"
],
"Sid": "999e9a9999de4d4683c9e10c74ee999z"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": [
"scf:InvokeFunction"
],
"Condition": {
"SrnLike": {
"scp:RequestAttribute/body['x-scf-request-obj-srn']": [
"srn:e::accountID:kr-west1::apigateway:method/MethodID/*/GET/test"
]
}
},
"Effect": "Allow",
"Principal": {
"Service": [
"apigateway.samsungsdscloud.com"
]
},
"Resource": [
"srn:e::accountID:kr-west1::scf:cloud-function/functionID"
],
"Sid": "999e9a9999de4d4683c9e10c74ee999z"
}
],
"Version": "2024-07-01"
}
API Gateway 트리거 정책 예시PrivateLink 연결
특정 사용자에게 Privatelink Endpoint를 통한 함수 호출을 허용하는 정책입니다.
정책 템플릿
{
"Statement": [
{
"Action": ["scf:InvokeFunction"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionPrivatelinkServiceAuthType": ["SCP_IAM"]
}
},
"Effect": "Allow",
"Principal": {
"scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
},
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "Statement1"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": ["scf:InvokeFunction"],
"Condition": {
"StringEquals": {
"scf:CloudFunctionPrivatelinkServiceAuthType": ["SCP_IAM"]
}
},
"Effect": "Allow",
"Principal": {
"scp": ["srn:{{Environment}}::{{AccountID}}:::iam:user/{{UserId}}"]
},
"Resource": ["{{CloudFunctionSrn}}"],
"Sid": "Statement1"
}
],
"Version": "2024-07-01"
}
PrivateLink 연결 정책 템플릿 예시정책 예시
{
"Statement": [
{
"Action": [
"scf:InvokeFunction"
],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": [
"SCP_IAM"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountID:::iam:user/userID"
]
},
"Resource": [
"srn:e::accountID:kr-west1::scf:cloud-function/functionID"
],
"Sid": "rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr-privatelink-invokefunction"
}
],
"Version": "2024-07-01"
}
{
"Statement": [
{
"Action": [
"scf:InvokeFunction"
],
"Condition": {
"StringEquals": {
"scf:CloudFunctionAuthType": [
"SCP_IAM"
]
}
},
"Effect": "Allow",
"Principal": {
"scp": [
"srn:e::accountID:::iam:user/userID"
]
},
"Resource": [
"srn:e::accountID:kr-west1::scf:cloud-function/functionID"
],
"Sid": "rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr-privatelink-invokefunction"
}
],
"Version": "2024-07-01"
}
PrivateLink 연결 정책 예시