Google Chat으로 Gemini AI 챗봇 만들기 구글 인사이트 by Miyeon. Jo 2024년 04월 11일 구글 PS2팀 채영욱목차Apps script 기반 Chat App 개요Google cloud platform 프로젝트 생성 및 구성템플릿으로 Chat App 구현 및 배포Google cloud platform에서 Chat App 게시Gemini api를 구현하여 Chatbot에 연동하기1. Apps script 기반 Chat App 개요apps script는 Google Workspace에서 제공하는 제품으로 간단한 코드를 개발해서 서비스 할 수 있는 환경입니다. https://script.google.com 사이트에서 신규 프로젝트를 생성하고, 채팅 앱을 개발하여 빌드합니다. 채팅 아키텍처는 아래 그림과 같이 사용자가 구글 챗을 통해 메시지를 전송하면 구글 클라우드의 Apps script 채팅 앱이 메시지를 수신하고 처리합니다. 처리한 메시지는 다시 구글 챗으로 응답을 보내서 사용자가 수신을 하는 패턴입니다.Apps script 채팅 아키텍처 패턴2. Google cloud platform 프로젝트 생성 및 구성채팅 앱을 구현하기 위해서는 구글 클라우드의 프로젝트가 필요합니다. 구글 클라우드 프로젝트는 구글 계정을 생성하고, Google Cloud Console 에서 프로젝트를 생성 할 수 있습니다. 프로젝트를 생성하면 Chat API 사용을 설정하고 OAuth 동의 화면을 구성합니다.API 사용 설정 GCP 콘솔에서 Chat API를 API 사용하기로 설정합니다.OAuth 동의 화면 구성 절차Google Cloud 콘솔에서 메뉴 menu > API 및 서비스 > OAuth 동의 화면으로 이동합니다.앱의 사용자 유형을 선택한 다음 만들기 버튼을 클릭합니다.앱 등록 양식을 작성한 다음 저장 후 계속 버튼을 클릭합니다.지금은 범위 추가를 건너뛰고 저장 후 계속을 클릭해도 됩니다. 앞으로 Google Workspace 조직 외부에서 사용할 앱을 만들 때는 앱에 필요한 승인 범위를 추가하고 확인해야 합니다.사용자 유형으로 외부를 선택한 경우 테스트 사용자를 추가합니다.테스트 사용자에서 사용자 추가를 클릭합니다.이메일 주소 및 승인된 다른 테스트 사용자를 입력한 다음 저장하고 계속하기를 클릭합니다.앱 등록 요약을 검토합니다. 변경하려면 수정을 클릭합니다. 앱 등록이 확인되면 대시보드로 돌아가기를 클릭합니다.3. 템플릿으로 Chat App 구현 및 배포Apps script에서 제공하는 Chat App 템플릿을 사용하여 프로젝트를 생성한 다음 테스트 배포를 통해 앱 게시를 준비합니다.스크립트 설정Apps Script 시작하기 로 이동합니다.하단의 채팅 앱 템플릿을 클릭합니다.편집기 상단의 제목을 AI Chatbot으로 변경하고, 왼쪽 하단의 프로젝트 설정() 프로젝트 설정 아이콘을 클릭합니다.Google Cloud Platform(GCP) 프로젝트에서 프로젝트 변경 버튼을 클릭합니다.GCP 프로젝트에서 프로젝트 번호를 복사하여 Google Cloud 프로젝트 번호를 붙여넣고 프로젝트 설정 버튼을 클릭합니다.앱 게시를 위해서 App 배포가 필요합니다. 채팅 앱 Apps Script 프로젝트에서 오른쪽 상단 배포 버튼에서 배포 테스트를 클릭합니다.이후 단계에서 사용하기 위해 배포 ID를 복사하고 완료를 클릭합니다.4. Google cloud platform에서 Chat App 게시Chat App 게시하기Google Cloud 콘솔에서 Google Chat API를 검색하고 Google Chat API를 클릭하고, 관리 버튼을 클릭합니다.구성 버튼을 클릭하고 채팅 앱에서 다음과 같이 설정합니다.앱 이름 필드에 AI Chatbot을 입력합니다.아바타 URL 필드에 https://developers.google.com/chat/images/quickstart-app-avatar.png를 입력합니다.설명 필드에 AI Chatbot을 입력합니다.기능에서 1:1 메시지 수신 및 스페이스 및 그룹 대화 참여를 선택합니다.연결 설정에서 Apps Script 프로젝트를 선택하고 배포 ID를 필드에 붙여넣습니다.공개 상태에서 내 도메인의 특정 사용자 및 그룹을 선택하고 이메일을 입력합니다.저장을 클릭하고 페이지를 새로고침합니다.상단 앱 상태를 활성 – 사용가능 설정하고 저장합니다.Chat App 테스트Chat을 열고 새 채팅에서 AI Chatbot을 선택합니다..대화창에 ‘Thank you for adding me to 스페이스 이름’이 표시됩니다.메시지창에 글을 입력하면 입력한 내용으로 Chatbot이 응답합니다.5. Gemini api를 구현하여 Chatbot에 연동하기Apps script에서 Google cloud에서 제공하는 Gemini api 호출을 하기 위해 OAuth 인증을 설정하고 API를 호출하는 코드를 구현한 다음 Chat 코드와 연동합니다.Gemini API 구현 및 Chat 연동Apps script에서 파일 추가(+) 버튼을 클릭하고 스크립트를 선택한다음 파일명을 gemini로입력합니다.gemini API를 호출하는 함수를 다음과 같이 구현합니다.function callGeminiAIP(message){ // oAuth 인증 정보 조회 const geminiService = oAuth(); if (!geminiService.hasAccess()) { Logger.log("Credential Error: "+ geminiService.getLastError()); } // GCP 프로젝트 정보 const API_ENDPOINT="asia-northeast3-aiplatform.googleapis.com" const PROJECT_ID="GCP 프로젝트명" const MODEL_ID="gemini-1.0-pro-vision-001" const LOCATION_ID="asia-northeast3" const apiUrl = 'https://'+API_ENDPOINT+'/v1/projects/' + PROJECT_ID + '/locations/'+LOCATION_ID+'/publishers/google/models/' + MODEL_ID + ':streamGenerateContent'; // Http Header 구성 const headers = { Authorization: `Bearer ${geminiService.getAccessToken()}`, 'Content-Type': 'application/json' }; // 요청 본문 구성 const requestData = { 'contents': [ { 'role': 'user', 'parts': [ { 'text': message } ] } ], 'generation_config': { "maxOutputTokens": 2048, "temperature": 0.4, "topP": 1, "topK": 32 }, 'safetySettings': [ { 'category': 'HARM_CATEGORY_HATE_SPEECH', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' }, { 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' }, { 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' }, { 'category': 'HARM_CATEGORY_HARASSMENT', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' } ] }; // Gemini 응답 결과 const response = UrlFetchApp.fetch(apiUrl, { 'method': 'post', 'headers': headers, 'muteHttpExceptions': true, 'payload': JSON.stringify(requestData) }); // 응답 결과에서 답변 추출 후 전달 const responseData = JSON.parse(response.getContentText()); return responseData[0].candidates[0].content.parts[0].text; } OAuth 인증을 위해 라이브러리 등록이 필요하며, 왼쪽 메뉴의 라이브러리(+)를 클릭하고 스크립트 ID에 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF 를 입력후 조회하고 추가합니다.Apps script에서 파일 추가(+) 버튼을 클릭하고 스크립트를 선택한다음 파일명을 oauth로 입력합니다.OAuth 인증을 위한 코드를 아래와 같이 구현합니다. GCP 서비스 계정은 구글 클라우드 공식 문서에서 확인 할 수 있습니다.// GCP service key const CREDENTIALS_PALM = { PRIVATE_KEY: "-----BEGIN PRIVATE KEY--GCP의 서비스 계정에 대한 키 정보 ---END PRIVATE KEY-----\n", CLIENT_EMAIL: "서비스 계정 정보" } // OAuth 인증 정보 조회 function oAuth() { return ( OAuth2.createService("vertexai") .setTokenUrl("https://accounts.google.com/o/oauth2/token") .setPrivateKey(CREDENTIALS_PALM.PRIVATE_KEY) .setIssuer(CREDENTIALS_PALM.CLIENT_EMAIL) .setPropertyStore(PropertiesService.getScriptProperties()) .setCache(CacheService.getUserCache()) .setLock(LockService.getUserLock()) .setScope(["https://www.googleapis.com/auth/cloud-platform"]) ) }gemini API 호출을 위해 Code.gs의 onMessage 함수에서의 아래 내용을 다음과 같이 변경합니다.var message = name + " said \"" + event.message.text + "\""; 아래와 같이 변경 var message = callGeminiAIP(event.message.text);AI 챗봇 서비스 테스트 위 과정은 Gemini API의 기본 설정을 통해 Chatbot을 구현하였습니다. 다시 Google Chat 의 AI Chatbot 메시지창에 입력하고 질문을 하면 아래 화면과 같이 Gemini를 통한 답변을 받을 수 있습니다. 출처 https://blog.g-gen.co.jp/entry/create-direct-workload-identity-for-gha-terraform 2024년 04월 11일
GCP, ‘구글 워크스페이스용 제미나이’ 기능 공개 구글 인사이트 by Miyeon. Jo 2024년 03월 28일 구글 1사업부 장근택 제미나이 비즈니스 월 20달러·제미나이 엔터프라이즈 구독 월 30달러 일반 사용자용 ‘AI 프리미엄 플랜’ 월 2만9천원 구글 워크스페이스를 위한 듀엣AI’를 ‘구글 워크스페이스용 제미나이’로 변경한 구글클라우드(GCP)가 새로운 기능을 공개하고, 업무보조 인공지능(AI) 시장 공략을 본격화하기 시작했다. 구글 워크스페이스용 기업용 제미나이는 구글 워크스페이스의 추가 기능으로 제공된다.제미나이는 데이터를 조사하거나 요약할 때, 혹은 복잡한 데이터셋에서 비즈니스 트렌드를 찾을 때, 공감을 불러일으킬 수 있는 인상적인 카피 문구를 작성할 때와 같이 업무 수행을 보조하는 AI 도구다.예를 들어 마케팅 관리자는 제미나이로 업계 트렌드, 제품 개발, 경쟁사의 메시지 등을 분석해 이메일 마케팅 캠페인 주제를 선정하는 데 도움을 받을 수 있다. 분석한 트렌드를 제품과 연결하는 카피 문구를 작성하고, 혜택을 강조하는 제목을 제시해 이메일 열람율을 높일 수 있다.또 비즈니스 이용자를 위한 새로운 독립형 채팅 환경도 제공돼 안전하게 보안을 유지하면서 가장 강력한 제미나이 모델인 ‘제미나이 어드밴스드’를 활용할 수 있다. 사용자는 범용 모델인 ‘제미나이 1.0 울트라’를 통해 제미나이 AI와 협업해 업무를 지원받을 수 있다. 구글 워크스페이스 구독 요금제[source=google] 구글 워크스페이스용 제미나이는 ‘제미나이 비즈니스’와 ‘제미나이 엔터프라이즈’로 구성됐다. 이용료는 각각 월 20달러, 월 30달러(1년 약정 기준)로 책정됐다.이용 중인 이용 중인 구글 워크스페이스 구독료에 제미나이 비용이 추가되는 것으로, 구글 워크스페이스 비즈니스 플러스(월 18달러) 이용 고객이 제미나이 엔터프라이즈를 추가하면, 총 구독료는 월 48달러가 된다.제미나이 비즈니스는 지메일·독스·슬라이드·스프레드시트·미트 등 모든 구글 워크플레이스 애플리케이션에서 활용할 수 있으며 엔터프라이즈급 보안과 개인정보보호 기능을 제공한다.제미나이 엔터프라이즈는 제미나이 비즈니스의 모든 기능에 더해 15개 이상의 언어로 번역된 캡션이 제공되는 고급 회의 기능 등이 추가 제공된다. GCP는 제미나이 엔터프라이즈의 번역 지원을 100개 이상 언어로 확대하고 회의록까지 작성 가능한 AI 기반 회의 기능을 추가하는 등 지속적으로 기능을 확대할 방침이다한편, 일반 사용자의 경우 AI 프리미엄 플랜 가입을 통해 월 19.99달러에 2TB의 스토리지 등 구글 원 멤버십의 모든 혜택과 함께 제미나이를 이용할 수 있도록 했다.구글 워크스페이스의 추가 기능으로 제공되는 기업 버전과 달리 구글 원 멤버십의 추가 기능이 아닌 제미나이를 사용할 수 있는 구글 원 멤버십의 새로운 구독 옵션으로 선보인 것이다.단, 연간 구독 시 16%의 할인이 제공되는 구글 원 요금제와 달리 AI 프리미엄 플랜은 연간 구독이 옵션 없이 월 청구 모델로만 이용할 수 있다. 구글 원 구독 요금제와 AI 프리미엄 플랜 요금제 [source=google] 국내에서는 월 2만9000원에 구글 원 멤버십과 AI 프리미엄 플랜을 이용할 수 있다. 미국의 구독 가격인 19.99달러보다는 다소 높은 가격이다.월 구독 시 1만1900원에 제공되는 구글 원(2TB 스토리지 포함)과 비교하면, 제미나이 이용료는 월 1만7100원으로 볼 수 있다. 구글 원 연간 구독자라면 연간 구독 옵션이 없는 AI 프리미엄 플랜의 비용부담은 크게 느껴질 수 있다. GCP는 첫 2개월 사용을 무료 제공해 제미나이를 체험할 수 있게 하는 프로모션도 진행한다. 출처IT비즈뉴스(ITBizNews)(https://www.itbiznews.com) 2024년 03월 28일
베스핀글로벌, ‘Control Tower with Bespin Global’ 상품 출시… 최대 60% 빠르게 AWS 컨트롤 타워 도입 가능 by Miyeon. Jo 2024년 03월 27일 ETNEWS / 2024-03-07 / 박두호 기자 / [기사 전문 보기] 보안 및 거버넌스 요건 충족과 다중 계정 체계를 동시에 구현하는 ‘AWS 컨트롤 타워’ 채택 기업 증가 ‘Control Tower with Bespin Global’, AWS 컨트롤 타워 구축 기간 최대 60% 감소… 합리적인 도입 비용 제시도 눈길 베스핀글로벌, AWS 컨트롤 타워 서비스 파트너 인증 획득… 높은 전문성은 물론, 검증된 전문 인력 및 다수의 랜딩 존 성공 사례 차별점 <이미지 설명 : 베스핀글로벌이 ‘Control Tower with Bespin Global(컨트롤 타워 위드 베스핀글로벌)’ 상품을 새롭게 출시했다.> 멀티 클라우드 운영 관리 전문 기업 베스핀글로벌(https://www.bespinglobal.com/)이 AWS 컨트롤 타워(AWS Control Tower)를 낮은 비용으로 신속하게 도입하여 구축·운영할 수 있도록 지원하는 ‘Control Tower with Bespin Global(컨트롤 타워 위드 베스핀글로벌)’ 상품을 새롭게 출시한다고 7일 밝혔다.AWS 컨트롤 타워는 조직의 보안 및 규정 준수 요구 사항을 유지하면서 사용자를 대신해 여러 아마존웹서비스(Amazon Web Services, 이하 AWS)의 서비스를 오케스트레이션할 수 있도록 지원하는 서비스이다. AWS 컨트롤 타워를 활용하면 잘 설계된 다중 계정 환경을 30분 이내에 설정할 수 있고, 기본 제공 거버넌스를 통해 AWS 계정 생성을 자동화할 수 있으며, 사전 구성된 제어를 통해 모범 사례, 표준, 규제 요구 사항을 적용할 수 있다. 또한 규모에 맞게 타사 소프트웨어를 원활하게 통합해 AWS 환경을 개선하는 것도 가능하다. 시장과 기술 변화에 빠르게 대응하고자 클라우드를 더욱 통합적이고 안전하게 관리할 수 있는 AWS 컨트롤 타워 서비스를 채택하려는 기업이 늘어나고 있다.베스핀글로벌이 새롭게 선보인 ‘Control Tower with Bespin Global’은 베스핀글로벌의 전문성을 바탕으로 소요 기간을 기존보다 최대 60% 이상 절감하여 2달 내에 AWS 컨트롤 타워를 도입할 수 있다. ▲보안 인증 획득 ▲보안 체계 구축·관리 ▲클라우드 환경에서의 IT 개발 및 운영 체계 구축 ▲서비스 확장 관리 ▲애플리케이션 현대화 등 다양한 요구에 효과적으로 대응할 수 있도록 설계되었다. 합리적인 도입 비용을 제시하여 기업의 재정적 부담을 크게 감소시키는 것도 특징이다.베스핀글로벌은 지난 2022년, AWS 컨트롤 타워 서비스 딜리버리 파트너 인증을 획득했다. 또한 AWS 마이그레이션 컴피턴시(AWS Migration Competency) 파트너로서 랜딩 존에서 컨트롤 타워로의 마이그레이션 사례를 수행하는 등 다수의 성공 사례를 자랑한다. AWS의 클라우드 보안 진단 프로그램인 ECSA(Enhanced Cloud Security Assessment) 인증과 함께 다양한 프로젝트를 통해 검증된 전문 인력 역시 확보하고 있다.‘Control Tower with Bespin Global’’의 출시를 담당한 베스핀글로벌의 유형준 상품 기획 총괄 실장은 “새롭게 선보이는 Control Tower with Bespin Global은 클라우드 환경의 복잡성 해결과 동시에, 비용 효율성 극대화에 초점을 두었다”고 설명하며, “베스핀글로벌은 기업이 보다 신속하고 저렴하게 다중 계정 체계를 구축 및 관리할 수 있도록 지원한다. AWS 컨트롤 타워 서비스 파트너인 베스핀글로벌이야말로, 컨트롤 타워 서비스 도입을 위한 가장 이상적인 파트너”고 강조했다.‘Control Tower with Bespin Global’에 대한 자세한 내용은 베스핀글로벌 공식 웹사이트 내 서비스 소개 페이지나 공식 문의처(Contact Us)를 통해 확인할 수 있다.참고) 베스핀글로벌 공식 웹사이트 내 ‘Control Tower with Bespin Global’ 소개 페이지: https://www.bespinglobal.com/controltower-with-bespin 문의하기 2024년 03월 27일
AlloyDB 쿼리 성능 비교 구글 인사이트 by Miyeon. Jo 2024년 03월 12일 구글 PS2팀 윤영훈목차AlloyDBIntelligent, database-aware storageColumnar Engine성능 비교결과 분석1. AlloyDBAlloyDB는 구글 클라우드에서 제공하는 완전히 관리형 PostgreSQL 호환 데이터베이스 서비스로 ACID – atomicity, consistency, isolation, and durability – 호환 트랜잭션을 지원합니다.AlloyDB의 성능은 아래와 같이 소개되고 있는데, 해당 성능을 구성되게 하는 AlloyDB의 특징을 설명하고, 테스트 환경을 구성하여 쿼리 실행 성능을 비교 측정합니다.트랜잭션 워크로드에서 표준 PostgreSQL보다 4배 빠른 속도.분석 워크로드에서 표준 PostgreSQL보다 최대 100배 빠른 속도.2. Intelligent, database-aware storageAlloyDB는 컴퓨팅과 스토리지를 분리하여 I/O 병목 현상을 줄이고, LPS(Log processing service)를 사용하여 많은 데이터베이스 작업을 스토리지 계층으로 오프로드합니다.LPS(Log processing service)는 WAL 레코드를 처리하고 데이터베이스 블록을 생성하는 AlloyDB의 내부 서비스입니다. 컴퓨팅 레이어는 WAL 레코드를 스토리지 계층에 전달하기만 하여 블록 쓰기는 필요하지 않습니다.3. Columnar EngineAlloyDB의 Columnar Engine 기능을 활성화하면, row 기반의 저장 데이터를 ML/AI 기반으로 column 형식 데이터로 자동으로 구성합니다. 최적의 table/column을 지능적으로 선택하고 이 데이터를 메모리에 자동으로 유지합니다. 성능 비교를 위해서 Columnar Engine을 활성화하는 경우 먼저 ‘warm-up’ 쿼리를 실행한 후 성능을 측정합니다.Columnar Engine은 데이터 스캔 결과를 구체화하지 않고, 관련된 column에서 직접 집계 작업을 수행하며, 스캔속도를 높이기 위해서 최소 및 최대 값과 같은 column별 메타데이터를 활용하여 알고리즘을 최적화합니다.Columnar Engine을 활성화된 상태라면, 쿼리의 실행 계획에서 ‘columnar scan’이라고 표시된 내용을 확인할 수 있습니다.Columnar Engine 비활성화 상태Columnar Engine 활성화 상태4. 성능 비교성능 비교를 위하여 18,608,748개의 row를 포함한 5GB 정도의 데이터를 구글 클라우드의 Cloud SQL, Alloy DB, Alloy DB + Columnar Engine, BigQuery 서비스에 동일하게 구성합니다. 각 데이터베이스에서 해당 데이터를 조회 및 집계하는, 동일한 쿼리를 실행하여 처리시간을 비교합니다.각 데이터베이스에서 동일한 쿼리를 실행한 결과는 아래와 같습니다.서비스Cloud SQLAlloy DBAlloy DB + Columnar EngineBigQuery실행시간(초)89572975. 결과 분석쿼리 성능의 비교 결과에서 처리 속도가 가장 우수한 데이터베이스는 BigQuery이지만, BigQuery는 데이터 스캔 크기에 따라 조회비용이 추가로 과금되기 때문에 조회 빈도가 높은 경우 BigQuery 비용이 과도하게 발생할 수 있음을 유의해야 합니다.또한 Cloud SQL과 AlloyDB의 비용을 비교하는 경우, 컴퓨팅 리소스 및 스토리지 조건에 따라 Cloud SQL이 비용면에서 효율적일 수 있습니다. 아래는 스토리지 용량이 클수록 Alloy DB를 선택하는 것이 비용이 절감되는 예시입니다. 출처Compare Analytical Queries Performance of AlloyDB with BigQueryAlloyDB under the hood: Replication gets closer to real-timeBenchmarking for AlloyDB and how to do itAlloyDB for PostgreSQL under the hood: Intelligent, database-aware storageConfigure the columnar engineManage column store content using auto-columnarization 2024년 03월 12일
개인정보처리방침 by Miyeon. Jo 2024년 03월 11일 개인정보처리방침 ‘베스핀글로벌 주식회사’’(이하 ‘회사’)는 「개인정보 보호법」 제30조에 따라 정보주체의 개인정보를 보호하고 이와 관련한 고충을 신속하고 원활하게 처리할 수 있도록 하기 위하여 다음과 같이 개인정보 처리방침을 수립·공개합니다.○ 이 개인정보처리방침은 2024년 3월 11일부터 적용됩니다. 제1조(개인정보의 처리 항목, 목적, 보유기간)① 회사는 다음의 목적을 위하여 개인정보를 처리합니다. 처리하고 있는 개인정보는 다음의 목적 이외의 용도로는 이용되지 않으며 이용 목적이 변경되는 경우에는 「개인정보 보호법」 제18조에 따라 별도의 동의를 받는 등 필요한 조치를 이행할 예정입니다.② 회사는 법령에 따른 개인정보 보유·이용기간 또는 정보주체로부터 개인정보를 수집 시에 동의받은 개인정보 보유·이용기간 내에서 개인정보를 처리·보유 후 파기합니다.③ 개인정보 보유기간의 경과, 처리목적 달성 등 개인정보가 불필요하게 되었을 때에는 지체없이 해당 개인정보를 파기합니다.④ 각각의 개인정보 처리 항목, 목적 및 보유 기간은 다음과 같습니다.구분처리 항목처리목적보유 기간베스핀글로벌홈페이지고객문의(Contact Us)[필수] 문의 분야, 문의 경로, 문의 내용, 성명, 회사명, 산업군, 이메일, 부서명, 휴대전화번호문의사항 상담, 서비스 관련 민원처리 및 처리결과 고지3년베스핀 뉴스레터 구독[필수] 성명, 회사명, 이메일홍보성 뉴스레터 제공뉴스레터 수신거부 신청 시컨텐츠 다운로드[필수] 성명, 직함, 부서명, 회사명, 산업군, 휴대전화번호, 이메일홍보성 기술자료 제공6개월프로모션(이벤트),무료 컨설팅 신청[필수] 성명, 직함, 회사명, 부서명, 이메일, 휴대전화번호, 산업군, 회사 규모(인원)[선택] 문의사항홍보성 교육(세미나, 웨비나) 및 문의사항 상담1년홍보 및 마케팅 동의 고객[필수] 휴대전화번호 또는 이메일(1가지 이상)신규 서비스 및 제품, 이벤트, 프로모션 안내수신 동의 철회 시기술지원고객지원[필수] 요청자 이메일, 회사명, 기술지원 요청 사항서비스의 기술지원, 서비스 관련 불만처리3년빌링포탈[필수] 담당자 ID(이메일 ID), 비밀번호, 회사명, 이메일[선택] 계좌번호(CMS 등록), 또는 카드 정보계약서·청구서 발송, 요금결제·정산, 채권추심, 법인 회원 식별회원 탈퇴 후 6개월채용채용 지원자[필수] 이메일, 휴대폰번호, 비밀번호, 본인 인증시 본인확인값(CI, DI), 이름, 지원분야, 생년월일, 영문이름, 추천인, 지원경로, 사진, 주소, 연락처, 병역사항, 고등학교, 대학교, 대학원, 직장경력, 경험 및 경력기술서, 포트폴리오 첨부, 경력기술서 첨부, 공인외국어시험, 자격증, 자기소개서[선택 – 민감정보] 국적, 장애여부, 보훈여부인재 채용 전형의 진행 및 전형 단계별 안내해당 채용건의 종료 후 6개월채용 지원 중 문의[필수] 성명, 전화번호, 이메일, 문의내용문의사항 접수 시 민원처리 및 처리결과 고지3년채용 합격자채용 지원 시 수집 정보 외[필수] 통장사본[필수 – 고유식별정보] 주민등록등본(주민등록번호), 외국인등록번호[선택 – 고유식별정보]피부양자 등록 시 가족관계증명서(주민등록번호), 외국인등록번호급여 및 복리후생 제공, 4대보험, 경력확인, 인사 서비스 제공퇴사 후 5년 제2조(개인정보의 보존) ① 정보주체로부터 동의받은 개인정보 보유기간이 경과하거나 처리목적이 달성되었음에도 불구하고 다른 법령에 따라 개인정보를 계속 보존하여야 하는 경우에는, 해당 개인정보를 별도의 데이터베이스(DB)로 옮기거나 보관장소를 달리하여 보존합니다. 근거법령 보존 항목 보존기간 상법 상업장부와 영업에 관한 중요서류 10년 전표 또는 이와 유사한 서류 5년 전자상거래 등에서의 소비자 보호에 관한 법률 계약 또는 청약철회 등에 관한 기록 5년 대금결제 및 재화 등의 공급에 관한 기록 5년 소비자의 불만 또는 분쟁처리에 관한 기록 3년 표시/광고에 관한 기록 6개월 국세기본법 세법이 규정하는 모든 거래에 관한 장부 및 증빙서류 5년 통신비밀보호법 서비스 방문 기록 3개월 ② 개인정보 파기의 절차 및 방법은 다음과 같습니다. 1. 파기절차 회사는 파기 사유가 발생한 개인정보를 선정하고, 회사의 개인정보 보호책임자의 승인을 받아 개인정보를 파기합니다. 2. 파기방법 전자적 파일 형태의 정보는 기록을 재생할 수 없는 기술적 방법을 사용합니다. 종이에 출력된 개인정보는 분쇄기로 분쇄하거나 소각을 통하여 파기합니다. 제3조(개인정보의 제3자 제공) 회사는 개인정보를 제1조(개인정보의 처리 목적)에서 명시한 범위 내에서만 처리하며, 정보주체의 동의, 법률의 특별한 규정 등 「개인정보 보호법」 제17조 및 제18조에 해당하는 경우에만 개인정보를 제3자에게 제공합니다. 제4조(개인정보처리 위탁) ① 회사는 원활한 개인정보 업무처리를 위하여 다음과 같이 개인정보 처리업무를 위탁하고 있습니다. 수탁사 처리위탁 업무 내용 스파크플러스 사무실 관리 메이크플로우 빌링 포털의 개발 유지보수 옵스나우 주식회사 고객 문의 및 안내 관리 플랫폼 인증 토스페이먼츠 카드결제서비스 효성에프앰에스 자동이체서비스 제공 및 자동이체 동의 사실 통지 나이스평가정보 고객 본인 확인 서비스 Freshworks Inc. 고객 문의 및 안내 관리 플랫폼 운영 Salesforce.com inc CRM 플랫폼 운영 (주)마이다스인 채용홈페이지 및 채용관리 전산시스템의 운영 및 관련 민원처리 베네피아 복지몰 위탁 운영 휴넷 임직원 교육 위탁 운영 ② 개인정보처리 위탁 중 국외에서 처리하는 위탁업무는 아래와 같습니다. 수탁업체 정보관리책임자 및 연락처 이전목적 이전되는 개인정보 항목 이전되는 국가 이전일시 및 방법 개인정보이용기간 Salesforce.com inc. Data Protection Officer / privacy@salesforce.com 홍보 및 마케팅 관리 도구 사용 성명, 회사명, 산업군, 이메일, 부서명, 직함, 휴대 전화 번호, 산업군, 회사 규모, 문의사항/td> 일본 서비스 이용 시점에 네트워크를 통한 전송 뉴스레터 수신거부 신청 시까지 Freshworks Inc. Data Protection Officer / dpo@freshworks.com 서비스의 기술 지원, 서비스 관련 불만처리 도구 사용 이메일, 회사명, 휴대 전화 번호, 기술지원 요청 사항 미국 서비스 이용 시점에 네트워크를 통한 전송 위탁업무 종료 시까지 ③ 회사는 위탁계약 체결시 「개인정보 보호법」 제26조에 따라 위탁업무 수행목적 외 개인정보 처리금지, 기술적․관리적 보호조치, 재위탁 제한, 수탁자에 대한 관리․감독, 손해배상 등 책임에 관한 사항을 계약서 등 문서에 명시하고, 수탁자가 개인정보를 안전하게 처리하는지를 감독하고 있습니다. ④ 위탁업무의 내용이나 수탁자가 변경될 경우에는 지체없이 본 개인정보 처리방침을 통하여 공개하도록 하겠습니다. 제5조(정보주체와 법정대리인의 권리•의무 및 그 행사방법) ① 정보주체는 회사에 대해 언제든지 개인정보 열람·정정·삭제·처리정지 요구 등의 권리를 행사할 수 있습니다. ② 제1항에 따른 권리 행사는 회사에 대해 「개인정보 보호법」 시행령 제41조제1항에 따라 서면, 전자우편, 모사전송(FAX) 등을 통하여 하실 수 있으며 회사는 이에 대해 지체 없이 조치하겠습니다. ③ 제1항에 따른 권리 행사는 정보주체의 법정대리인이나 위임을 받은 자 등 대리인을 통하여 하실 수 있습니다.이 경우 “개인정보 처리 방법에 관한 고시(제2020-7호)” 별지 제11호 서식에 따른 위임장을 제출하셔야 합니다. ④ 개인정보 열람 및 처리정지 요구는 「개인정보 보호법」 제35조 제4항, 제37조 제2항에 의하여 정보주체의 권리가 제한될 수 있습니다. ⑤ 개인정보의 정정 및 삭제 요구는 다른 법령에서 그 개인정보가 수집 대상으로 명시되어 있는 경우에는 그 삭제를 요구할 수 없습니다. ⑥ 회사는 정보주체 권리에 따른 열람의 요구, 정정·삭제의 요구, 처리정지의 요구 시 열람 등 요구를 한 자가 본인이거나 정당한 대리인인지를 확인합니다. 제6조(개인정보의 안전성 확보 조치)회사는 개인정보의 안전성 확보를 위해 다음과 같은 조치를 취하고 있습니다. 1. 정기적인 자체 감사 실시개인정보 처리 관련 안정성 확보를 위해 정기적으로 자체 감사를 실시하고 있습니다. 2. 개인정보 처리 직원의 최소화 및 교육개인정보를 처리하는 직원을 지정하고 담당자에 한정시켜 최소화 하여 개인정보를 관리하는 대책을 시행하고 있습니다. 3. 내부관리계획의 수립 및 시행개인정보의 안전한 처리를 위하여 내부관리계획을 수립하고 시행하고 있습니다. 4. 해킹 등에 대비한 기술적 대책회사는 해킹이나 컴퓨터 바이러스 등에 의한 개인정보 유출 및 훼손을 막기 위하여 보안프로그램을 설치하고 주기적인 갱신·점검을 하며 외부로부터 접근이 통제된 구역에 시스템을 설치하고 기술적/물리적으로 감시 및 차단하고 있습니다. 5. 개인정보의 암호화이용자의 개인정보는 비밀번호는 암호화 되어 저장 및 관리되고 있어, 본인만이 알 수 있으며 중요한 데이터는 파일 및 전송 데이터를 암호화 하거나 파일 잠금 기능을 사용하는 등의 별도 보안기능을 사용하고 있습니다. 6. 접속기록의 보관 및 위변조 방지개인정보처리시스템에 접속한 기록을 최소 1년 이상 보관, 관리하고 있으며,다만, 5만명 이상의 정보주체에 관하여 개인정보를 추가하거나, 고유식별정보 또는 민감정보를 처리하는 경우에는 2년이상 보관, 관리하고 있습니다. 또한, 접속기록이 위변조 및 도난, 분실되지 않도록 보안기능을 사용하고 있습니다. 7. 개인정보에 대한 접근 제한개인정보를 처리하는 데이터베이스시스템에 대한 접근권한의 부여,변경,말소를 통하여 개인정보에 대한 접근통제를 위하여 필요한 조치를 하고 있으며 침입차단시스템을 이용하여 외부로부터의 무단 접근을 통제하고 있습니다. 8. 문서보안을 위한 잠금장치 사용개인정보가 포함된 서류, 보조저장매체 등을 잠금장치가 있는 안전한 장소에 보관하고 있습니다. 9. 비인가자에 대한 출입 통제개인정보를 보관하고 있는 물리적 보관 장소를 별도로 두고 이에 대해 출입통제 절차를 수립, 운영하고 있습니다. 제7조(개인정보 자동 수집 장치의 설치•운영 및 거부에 관한 사항) ① 회사는 이용자에게 개별적인 맞춤서비스를 제공하기 위해 이용정보를 저장하고 수시로 불러오는 ‘쿠키(cookie)’를 사용합니다. ② 쿠키는 웹사이트를 운영하는데 이용되는 서버(http)가 이용자의 컴퓨터 브라우저에게 보내는 소량의 정보이며 이용자들의 PC 컴퓨터내의 하드디스크에 저장되기도 합니다. 가. 쿠키의 사용 목적 : 이용자가 방문한 각 서비스와 웹 사이트들에 대한 방문 및 이용형태, 인기 검색어, 보안접속 여부, 등을 파악하여 이용자에게 최적화된 정보 제공을 위해 사용됩니다. 나. 쿠키의 설치•운영 및 거부 : Chrome 웹 브라우저 오른쪽 상단의 더보기 > 설정 > 개인정보 보호 및 보안 > 쿠키 및 기타 사이트 데이터 Edge 웹 브라우저 오른쪽 상단의 설정 및 기타 > 설정 > 쿠키 및 사이트 권한 > 쿠키 및 저장된 데이터 Safari Safari > 환경설정 > 개인 정보 보호 > 쿠키 및 웹 사이트 데이터 쿠키 저장을 거부할 경우 맞춤형 서비스 이용에 어려움이 발생할 수 있습니다. ③정보주체에 보다 나은 서비스의 제공을 위하여 구글(Google)에서 제공하는 웹로그 분석 도구인 구글 애널리틱스, Salesforce 및 카카오(KaKao)에서 제공하는 웹로그 수집 도구인 픽셀(Pixel)을 이용하고 있습니다. 구글 애널리틱스, Salesforce, 카카오 픽셀은 쿠키(Cookie)를 통하여 당사 웹사이트 이용자의 행태정보를 수집하게 되며, 이 경우 이용자 개인을 식별할 수 없는 비식별정보 만이 수집됩니다. 그럼에도 이용자는 부가기능 설치 또는 웹브라우저의 쿠키 설정 거부를 통해 구글 애널리틱스, Salesforce, 카카오 픽셀의 쿠키 이용을 거부할 수 있습니다. 구글 애널리틱스 차단 브라우저 부가기능의 설치(https://tools.google.com/dlpage/gaoptout) Salesforce 내 광고 설정 변경 또는 옵트아웃 프로그램 활용(https://optout.aboutads.info/?c=2&lang=EN) 카카오 쿠키 이용거부 설정(Internet Explorer: 도구 → 인터넷옵션 → 개인정보/Chrome: 설정 → 개인정보 및 보안) 제8조 (개인정보 보호책임자) ① 회사의 개인정보 처리에 관한 업무를 총괄해서 책임지고, 개인정보 처리와 관련한 정보주체의 불만처리 및 피해구제 등을 위하여 아래와 같이 개인정보 보호책임자를 지정하고 있습니다. ▶ 개인정보 보호책임자 성명 이학진 직책 CPO / CISO 직급 실장 연락처 1668-1280, security_bgk@bespinglobal.com ※ 개인정보 보호 담당부서로 연결됩니다. ② 정보주체께서는 회사의 서비스(또는 사업)을 이용하시면서 발생한 모든 개인정보 보호 관련 문의, 불만처리, 피해구제 등에 관한 사항을 개인정보 보호책임자 및 담당부서로 문의하실 수 있습니다. 회사는 정보주체의 문의에 대해 지체 없이 답변 및 처리해드릴 것입니다. 제9조(개인정보 열람청구) 정보주체는 「개인정보 보호법」 제35조에 따른 개인정보의 열람 청구를 아래의 부서에 할 수 있습니다. 회사는 정보주체의 개인정보 열람청구가 신속하게 처리되도록 노력하겠습니다. ▶ 개인정보 열람청구 접수·처리 부서 부서명 정보보호팀 연락처 1668-1280, security_bgk@bespinglobal.com 제10조(권익침해 구제방법) 정보주체는 개인정보침해로 인한 구제를 받기 위하여 개인정보분쟁조정위원회, 한국인터넷진흥원 개인정보침해신고센터 등에 분쟁해결이나 상담 등을 신청할 수 있습니다. 이 밖에 기타 개인정보침해의 신고, 상담에 대하여는 아래의 기관에 문의하시기 바랍니다. 1. 개인정보분쟁조정위원회 : (국번없이) 1833-6972 (www.kopico.go.kr) 2. 개인정보침해신고센터 : (국번없이) 118 (privacy.kisa.or.kr) 3. 대검찰청 : (국번없이) 1301 (www.spo.go.kr) 4. 경찰청 : (국번없이) 182 (ecrm.cyber.go.kr) 「개인정보보호법」제35조(개인정보의 열람), 제36조(개인정보의 정정·삭제), 제37조(개인정보의 처리정지 등)의 규정에 의한 요구에 대 하여 공공기관의 장이 행한 처분 또는 부작위로 인하여 권리 또는 이익의 침해를 받은 자는 행정심판법이 정하는 바에 따라 행정심판을 청구할 수 있습니다. ※ 행정심판에 대해 자세한 사항은 중앙행정심판위원회(www.simpan.go.kr) 홈페이지를 참고하시기 바랍니다. 제11조(개인정보 처리방침 변경)① 이 개인정보처리방침은 2024년 3월 11일부터 적용됩니다.② 이전의 개인정보 처리방침은 아래에서 확인하실 수 있습니다.– 이전 이력보기(2023.09.13) 2024년 03월 11일
Google Gemini API 사용하기 with Python 구글 인사이트 by Miyeon. Jo 2024년 02월 19일 구글사업2팀 정용민새로운 기술이 나오면 ‘어떻게 활용할 수 있을까?’ 고민해 보게 됩니다.인간처럼 소통할 수 있는 멀티모달 모델 제미나이(Google Gemini)의 다양한 강점을 활용하면 놀라운 사례들이 나올 수 있을 것 같은데요, 저도 소박한 아이디어가 떠올라 Gemini API를 활용하여 테스트해 보았습니다. 아이디어 = 식당 메뉴 이미지와 맥락 전달로 메뉴 추천 받기 식당 메뉴 “(텍스트가 포함된)이미지” 전달> 날씨, 기분, 예산 등의 “텍스트” 정보 전달> Gemini에게 메뉴 추천 받기테스트는 Gemini Pro API를 활용했고 우리에게 익숙한 Python으로 진행했습니다.Gemini Pro API를 고객용 서비스에 적합하게, 더 정교하게, 활용도 높은 UI에서 사용하고 싶으시다면 단연 Google Cloud Vertex AI를 사용하시는 것을 추천합니다.이번엔 제미나이와 조금 친해지기 위한 과정이니, 웹 브라우저에서 파이썬 코드를 빠르게 테스트해 볼 수 있는 Google Colab을 이용하였습니다.참고) Google Colab을 사용하시면 웹 브라우저에서 사전 구성이나 별도의 설치 없이 파이썬 스크립트를 작성하고 실행할 수 있습니다. (Pandas, TensorFlow, PyTorch, NumPy 등)Gemini API 활용에 관심 있으신 분들께 이 글이 조금이나마 도움이 되시길 바랍니다.1. 구글 클라우드 콘솔 접속 > 계정 생성 > 결제 수단 등록2. 새 프로젝트 생성 > 프로젝트 ID 확인3. Vertex AI API 활성화[API 및 서비스] > [사용설정된 API 및 서비스] > API 라이브러리에서 “Vertex AI API”를 검색 후 클릭 > [사용] 버튼 클릭 > 활성화 완료4. Google Colab 접속 > 새 노트북5. Google Cloud 인증 진행!pip install “google-cloud-aiplatform>=1.38”!gcloud auth login #링크 클릭 후 아래 이미지와 같이 Copy하여 코드 입력란에 입력6. Google Gemini API 사용을 위한 패키지와 라이브러리 Importfrom google.colab import auth auth.authenticate_user()7. vertex AI 라이브러리 사용을 위한 설치, 프로젝트 ID / 로케이션 초기화import io import http.client import typing import urllib.request import base64 from PIL import Image as PILImage import matplotlib.pyplot as plt import vertexai import vertexai.preview from google.cloud import aiplatform from vertexai.preview.generative_models import GenerativeModel, Image vertexai.init(project="google-cloud-project-id", location="google-cloud-location")“google-cloud-project-id”와 “google-cloud-location”를 각각 개인 프로젝트 정보에 맞게 대체하여 입력해 주세요. 저는 위에서 확인한 제 프로젝트 ID를 넣었고, 위치는 ‘asia-northeast3’로 설정했습니다.8. Gemini API를 사용을 위한 함수 선언프롬프트를 프로세스와 결과 출력을 위한 함수를 정의합니다.def load_and_encode_images(prompts): encoded_prompts = [] prompt_details = [] image_count = 0 for item in prompts: prompt_detail = {"prompt": item} if item.startswith('http'): response = typing.cast(http.client.HTTPResponse, urllib.request.urlopen(item)) image_data = response.read() pil_image = PILImage.open(io.BytesIO(image_data)) encoded_image = Image.from_bytes(image_data) encoded_prompts.append(encoded_image) prompt_detail["type"] = "image" prompt_detail["pil_image"] = pil_image image_count += 1 elif item.split('.')[-1].lower() in ['jpg', 'jpeg', 'png']: with open(item, "rb") as image_file: image_data = image_file.read() pil_image = PILImage.open(io.BytesIO(image_data)) encoded_image = Image.from_bytes(image_data) encoded_prompts.append(encoded_image) prompt_detail["type"] = "image" prompt_detail["pil_image"] = pil_image image_count += 1 else: encoded_prompts.append(item) prompt_detail["type"] = "text" prompt_details.append(prompt_detail) return encoded_prompts, prompt_details, image_count def display_response(prompt_details, response_text): for prompt_detail in prompt_details: if prompt_detail["type"] == "image": plt.imshow(prompt_detail["pil_image"]) plt.axis('off') plt.show() print("Prompt: {} (type: {})".format(prompt_detail['prompt'], prompt_detail['type'])) for candidate in response_text.candidates: for part in candidate.content.parts: print("Gemini:{}".format(part.text)) def chat_gemini(prompts): encoded_prompts, pil_images, image_count = load_and_encode_images(prompts) if image_count > 0: model_name = "gemini-pro-vision" else: model_name = "gemini-pro" model = GenerativeModel(model_name) response = model.generate_content(encoded_prompts) print(f"Loaded {image_count} images using the '{model_name}' model.") display_response(pil_images, response)9. 테스트를 위한 이미지 업로드Colab 파일 경로에 테스트 이미지를 업로드해주세요. 얼마 전에 하와이에서 다녀온 식당의 주류 메뉴판 이미지를 포함하여 여러 이미지를 업로드 했습니다. (각각의 파일은 [우클릭] > [경로 복사] 를 통해 코드에 입력해 주실 수 있습니다.)10. (자 이제 드디어!) 프롬프트 선언을 해봅니다.prompts = ["/content/photo2.jpeg", "Describe this image."] chat_gemini(prompts)11. 결과 확인영문으로 이미지 설명 요청 > 아래와 같은답변을 받았습니다. (메뉴판에 없는 식당 이름까지 정확히 알려주네요…!)Prompt: Describe this image. Gemini: This image is a drink menu from a restaurant called ULU Ocean Grill and Sushi Lounge. The menu is divided into cocktails, mocktails, beer, sake, and wine. The cocktails are further divided into Island Inspired Cocktails and Classic Cocktails. The mocktails are divided into Virgin and Non-Alcoholic. The beers are divided into Draft and Bottled. The sakes are divided into Junmai, Honjozo, and Ginjo. The wines are divided into Red, White, and Sparkling.‘WAIPIO LOOKOUT’이라는 팻말이 있는 사진을 주고 설명을 요청했습니다.Prompt: 이 곳의 이름과 역사를 설명해줘 Gemini: 와이피오 계곡은 미국 하와이 섬 북부 해안에 위치한 계곡입니다. 와이피오 계곡은 하와이에서 가장 신성한 장소 중 하나로 여겨지며, 많은 전설과 신화가 전해집니다. 와이피오 계곡은 또한 하와이에서 가장 아름다운 계곡 중 하나로 여겨지며, 많은 관광객들이 찾는 곳입니다. 계곡은 1,000피트(300m)이 넘는 높이에서 바다로 떨어지는 절벽으로 둘러싸여 있으며, 계곡 바닥에는 타로 밭과 열대 우림이 있습니다. 와이피오 계곡은 하와이 원주민 문화가 잘 보존되어 있는 곳으로, 하와이 원주민들이 전통적인 생활 방식을 유지하고 있습니다. 계곡에는 약 1,200명의 사람들이 살고 있으며, 대부분이 하와이 원주민입니다. 와이피오 계곡은 하와이의 자연美와 문화를 동시에 볼 수 있는 곳으로, 많은 사람들이 찾는 곳입니다.Prompt: 이 케이크를 만드려면 어떤 재료가 필요할까? Gemini: * 계란 * 설탕 * 버터 * 우유 * 바나나 * 밀가루 * 베이킹파우더 * 소금 자 그럼 이제 메뉴를 추천 받겠습니다.12. 메뉴 추천 받기 (국문 사용)Prompt: 이 이미지(식당 메뉴 사진)를 설명해줘 Gemini: 이미지는 울루(ULU)라는 레스토랑의 음료 메뉴입니다. 칵테일, 모크테일, 맥주, 사케 등 다양한 음료가 있습니다. 칵테일은 알라 울라, 팔로마 파카, 비치 니즈, 그린 슈림프, 알로하 아미고스, 배럴 에이지드 네그로니가 있습니다. 모크테일은 라즈베리 모히토, 스파클링 레몬 에이드가 있습니다. 맥주는 코나 롱보드 라거, 코나 빅 웨이브 골든 에일, 코나 파이어 록 파인애플 위트, 아사히, 사포로, 히타치노 화이트 에일, 히타치노 레드 라이스 에일이 있습니다. 사케는 준마이 긴조, 다이긴죠 냉주, 게케칸 호린, 긴가 슈진후, 오와자 슈조 사와후네 쥰마이 긴조, 와카타케 오로시노 데몬 슬레이어 쥰마이 다이긴죠 등이 있습니다.Prompt: 메뉴에서 추천을 받고 싶어, 지금은 여름이고, 생선 요리와 어울리는 음료가 필요해, 가격은 중간 정도가 적당할 것 같아. Gemini: 모히토가 좋을 것 같습니다. 모히토는 럼, 라임, 민트, 설탕, 소다수로 만든 칵테일로, 여름에 시원하게 마시기에 좋습니다. 특히 생선 요리와 함께 먹으면 더욱 맛있습니다. 모히토의 가격은 15달러입니다.이로서 마무리를 해보았습니다! 중간 중간 시간이 걸리는 부분이 있었지만 재미있는 과정이었습니다.조금 더 정교하게 만든다면, 유저 데이터를 활용해서 더 건강하게 먹을 수 있도록 도와주는 주치의봇 같은 내용도 만들어 볼 수 있지 않을까 싶네요.추가로 위와 같은 Gemini Pro API 테스트는 Vertex AI Studio에서는 코드 작성 없이도 더 수월하고 강력한 기능과 함께 진행실 수 있습니다. 더 정교한 프로토타이핑을 원하신다면 > 바로가기 : Vertex AI Gemini API 사용해 보기아이디어가 있다면 바로바로 테스트해 보는 게 AI 모델 활용에 재미가 아닐까 합니다. 이 글이 Gemini Pro 모델의 얼리 어답터 분들의 아이디어와 경험이 풍부해 지는 계기가 되었으면 좋겠습니다. 출처Medium : https://medium.com/@simin5/google-gemini-api-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0-with-python-e071dca13ed8 2024년 02월 19일
istio 사용하기 구글 인사이트 by Miyeon. Jo 2024년 02월 07일 PS1팀 조웅기목차istio 사용하기이스티오(Istio)란?이스티오가 제공하는 기능들이스티오의 아키텍처istio 테스트테스트 환경 구성istio 모니터링 하기Prometheus (로그 메트릭 수집)Grafana (모니터링)Kiali (모니터링)istio 사용하기이스티오(Istio)란?서비스 메쉬 오픈소스기존의 응용프로그램 위에 레이어링되어 다양한 동작들을 수행GCP에서는 이를 완전 관리해주는 서비스를 Anthos라고 함서비스 메쉬 설명 전 마이크로서비스란?소프트웨어를 구축하기 위한 아키텍처이자 하나의 접근 방식으로, 애플리케이션을 상호 독립적인 최소 구성 요소로 분할하는 방식모든 요소를 하나의 애플리케이션에 구축하는 전통적인 접근 방식 대신 마이크로서비스에서는 모든 요소가 독립적이며 연동되어 테스크를 수행이러한 각각의 구성 요소 또는 프로세스가 마이크로 서비스그렇다면 서비스 메쉬란 무엇인가?마이크로 서비스를 위한 인프라 계층레거시 코드의 변경 없이 각 서비스에 대해 가시성, 트래픽 관리, 보안 기능 등을 추가복잡하고 방대한 규모의 마이크로서비스에 대한 관리 용이마이크로서비스를 적용한 시스템의 내부 통신이 Mesh 네트워크 형태를 띄는 것에 빗대어 서비스 메쉬라고 말하고 있음서비스 간의 통신을 추상화를 통해 복잡한 내부 구조를 제어, 추적, 내부 네트워크 관련 로직을 추가함으로써 안정성, 신뢰성, 탄력성, 표준화, 가시성, 보안성 등을 확보Service Mesh 는 URL 경로, 호스트 헤더, API 버전 또는 기타 응용 프로그램 수준 규칙을 기반으로 하는 계층 7 네트워크 LayerService Mesh 의 구현체인 경량화 Proxy를 통해 다양한 Routing Rules, Circuit breaker 등 공통기능을 설정할 수 있습니다.이는 서비스 간 통신에 연관된 기능 뿐만 아니라, 서비스의 배포 전략에도 도움을 줍니다.이스티오가 제공하는 기능들클러스터 내부에서 TLS 암호화를 이용한 서비스간 안전한 통신 제공HTTP, gRPC, WebSocket 및 TCP 트래픽에 대한 로드 밸런싱재시도, 다양한 라우팅 규칙, fault injection 등을 통해 세부 트래픽 동작을 제어클러스터 내의 모든 트래픽에 대한 메트릭 수집과 로그 추적이스티오의 아키텍처<Istio 활용 전 아키텍쳐)<Istio 활용 후 아키텍쳐)데이터 플레인데이터 플레인은 데이터 전송과 처리를 담당하는 부분각 서비스를 Envoy proxy와 함께 배포(사이드카 패턴 방식)각 서비스 앞단에 프록시 서버를 두어 서비스로 또는 서비스로부터 나가는 모든 네트워크 패킷을 변환, 전달 및 모니터링Envoy proxy란?클라우드 네이티브용으로 Lyft 사에서 C++로 개발해서 2016년 12월 14일 공개한 L7 프록시2017년 5월에 Google, Lyft, IBM에서 공동으로 개발해서 내놓은 Service Mesh 오픈소스인 Istio의 메인 프록시가 됨주요 기능OUT OF PROCESS ARCHITECTUREEnvoy proxy는 그 자체로 메모리사용량이 적은 고성능의 서버입니다.모든 프로그래밍 언어, 프레임워크와 함께 실행될 수 있습니다.이는 다양한 언어,프레임워크를 함께 사용하는 Architecture에 유용히 사용될 수 있습니다.HTTP/2(1) AND gRPC SUPPORTHTTP/1.1은 물론 HTTP/2도 지원합니다.이는 HTTP/1.1과 HTTP/2 클라이언트와 서버간 모든 조합을 연결할 수 있음을 의미합니다.권장하는 구조는 모든 Envoy간에 HTTP/2를 사용하는 것입니다.또한 gRPC를 지원하여 HTTP/2기능을 보완할 수 있습니다.L3/L4 Architecture : Envoy의 주요 기능은 L7이지만 핵심은 L3/L4 네트워크 프록시 입니다. TCP프록시, HTTP프록시, TLS인증과 같은 다양한 작업을 지원합니다.L7 Architecture : 버퍼링, 속도제한, 라우팅/전달 등과 같은 다양한 작업을 수행할 수 있게 합니다.ADVANCED LOAD BALANCING자동 재시도, circuit break, 외부 속도 제한 서비스를 통한 글로벌 속도제한, 이상치 탐지 등의 기능을 제공합니다.APIS FOR CONFIGURATION MANAGEMENTEnvoy는 구성을 동적으로 관리하기 위한 강력한 API를 제공합니다.OBSERVABILITYL7 트래픽의 심층 관찰 성, 분산 추적에 대한 기본 지원, MongoDB, DynamoDB 등의 와이어 수준 관찰성을 제공합니다.사이드카 패턴이란?사이드카 패턴은 원래 사용하려고 했던 기본 컨테이너의 기능을 확장하거나 보조하는 용도의 컨테이너를 추가하는 패턴즉, 기본 컨테이너와 독립적으로 동작하는 별도의 컨테이너를 붙이는 패턴이기 때문에 어플리케이션 컨테이너의 변경이나 수정 없이 독립적으로 동작하는 컨테이너를 붙였다 뗐다 할 수 있다.컨트롤 플레인컨트롤 플레인은 네트워크의 제어와 관리를 담당하는 부분회로 차단, 로드 밸런싱, 타임아웃 등의 기본 구성 정보를 저장기본 구성 정보에 맞게 각 서비스의 프록시를 동istio 테스트테스트 환경 구성1. 테스트용 이미지 생성$ dotnet --version # 닷넷 기반 테스트 이미지 생성을 위한 설치 확인 $ dotnet new mvc -o HelloWorldAspNetCore # 닷넷 기반 웹 응용 프로그램 생성 $ vim Dockerfile # 도커 파일 생성 # Use Microsoft's official build .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-sdk/ FROM mcr.microsoft.com/dotnet/sdk:7.0-alpine AS build WORKDIR /app # Install production dependencies. # Copy csproj and restore as distinct layers. COPY *.csproj ./ RUN dotnet restore # Copy local code to the container image. COPY . ./ WORKDIR /app # Build a release artifact. RUN dotnet publish -c Release -o out # Use Microsoft's official runtime .NET image. # https://hub.docker.com/_/microsoft-dotnet-core-aspnet/ FROM mcr.microsoft.com/dotnet/aspnet:7.0-alpine AS runtime WORKDIR /app COPY --from=build /app/out ./ # Make sure the app binds to port 8080 ENV ASPNETCORE_URLS http://*:8080 # Run the web service on container startup. ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"] # 아래 코드 실행하기 전 Artifact Registry 저장소 생성 $ docker build -t asia-northeast3-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/<생성한 저장소 이름>/hello-dotnet:v1 . $ docker push asia-northeast3-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/<생성한 저장소 이름>/hello-dotnet:v12. GKE 생성$ gcloud services enable container.googleapis.com # GKE API 설정 gcloud container clusters create istio-test \ --cluster-version=latest \ --machine-type=n1-standard-2 \ --num-nodes=1 \ --region asia-northeast33. Istio 클라이언트 다운$ curl -L https://istio.io/downloadIstio | sh - # cli 창에서 뜬 istio 버전의 디렉토리가 생성됨 (테스트 현재 기준 istio-1.20.0) $ cd istio-1.20.0 # istioctl을 사용하기 위해 환경 변수 지정 $ export PATH="$PATH:/home//istio-1.20.0/bin"4. Istio 클라이언트 상태 확인# 생성한 gke 연결 후 $ gcloud container clusters get-credentials istio-test --region asia-northeast3 --project iistio $ istioctl x precheck # 환경 확인 (정상이면 아래와 같이 나옴) No issues found when checking the cluster. Istio is safe to install or upgrade! $ istioctl install --set profile=demo # 테스트를 위한 demo 프로필 사용 후 설치 $ kubectl label namespace default istio-injection=enabled # 자동 사이드카 매칭 $ kubectl get namespace -L istio-injection # 사이드카 확인 # 정상 설치 확인 (아래 3개 존재 확인) $ kubectl get svc -n istio-system istio-egressgateway ClusterIP 10.104.3.223 <none> 80/TCP,443/TCP 102s istio-ingressgateway LoadBalancer 10.104.9.211 34.64.230.54 15021:32493/TCP,80:31798/TCP,443:32556/TCP,31400:30436/TCP,15443:30945/TCP 102s istiod ClusterIP 10.104.14.127 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 103s $ kubectl get pods -n istio-system (아래 3개 존재 확인) istio-egressgateway-56c5f9b7cc-s2xbk 1/1 Running 0 6m25s istio-ingressgateway-678fd6f6b9-xv8js 1/1 Running 0 6m25s istiod-664dc95b55-dfpv4 1/1 Running 0 6m25s5. 애플리케이션 배포aspnetcore.yamlapiVersion: v1 kind: Service metadata: name: aspnetcore-service labels: app: aspnetcore spec: ports: - port: 8080 name: http selector: app: aspnetcore --- apiVersion: apps/v1 kind: Deployment metadata: name: aspnetcore-v1 spec: replicas: 1 selector: matchLabels: app: aspnetcore version: v1 template: metadata: labels: app: aspnetcore version: v1 spec: containers: - name: aspnetcore image: asia-northeast3-docker.pkg.dev//hello-dotnet/hello-dotnet:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 8080$ kubectl apply -f aspnetcore.yaml $ kubectl get pods6. 테스트용 게이트웨이 및 가상 서비스 배포aspnetcore-gateway.yamlapiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: aspnetcore-gateway spec: selector: istio: ingressgateway # use istio default controller servers: - port: number: 80 name: http protocol: HTTP hosts: - "*"aspnetcore-virtualservice.yamlapiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service7. 정상 동작 테스트kubectl get svc istio-ingressgateway -n istio-system export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}') export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/<서비스 접속 확인)8. 신규 버전 배포vim aspnetcore2.yamlapiVersion: apps/v1 kind: Deployment metadata: name: aspnetcore-v2 spec: replicas: 1 selector: matchLabels: app: aspnetcore version: v2 template: metadata: labels: app: aspnetcore version: v2 spec: containers: - name: aspnetcore image: asia-northeast3-docker.pkg.dev/iistio/hello-dotnet/hello-dotnet:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 8080v1와 v2배포가 모두 동일한 Kubernetes 서비스( aspnetcore-service) 뒤에 노출되고 이전 실습( )에서 생성한 VirtualService가 aspnetcore-virtualservice해당 서비스를 호스트로 사용하여 새로 고침을 하였을 때 각각 다르게 나옵니다.9. 서비스 새 버전으로 고정DestinationRule은 해당 대상 호스트의 명명된 버전을 의미하는 주소 지정 가능한 하위 집합도 정의하며 특정 버전의 서비스로 트래픽을 보낼 때 VirtualService 경로 사양에 사용본 서버(v1) 업데이트 시에 임시 서버(v2)를 바라보게 셋팅 가능 추측aspnetcore-destinationrule.yamlapiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: aspnetcore-destinationrule spec: host: aspnetcore-service trafficPolicy: tls: mode: ISTIO_MUTUAL subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2 # VirtualService에서 사용할 수 있는 두 개의 하위 집합(v1 및 v2)이 생성$ kubectl apply -f aspnetcore-destinationrule.yamlaspnetcore-virtualservice.yaml 수정apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service **subset: v2 # 이렇게 서브셋을 지정해줌**$ kubectl apply -f aspnetcore-virtualservice.yaml10. 버전 간 트래픽 분할테스트나 과부화를 위한 트래픽 분할 가능 : 예를 들어 트래픽의 75%를 v1로 보내고 트래픽의 25%를 v2 버전의 서비스로 보낼 수 있음카나리 배포로 사용aspnetcore-virtualservice.yaml 수정apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service subset: v1 weight: 75 - destination: host: aspnetcore-service subset: v2 weight: 25$ kubectl apply -f aspnetcore-virtualservice-weights.yaml11. 지연 및 에러 코드 발생 시키기트래픽에 오류나 지연을 삽입하고 서비스가 이에 응답하여 어떻게 작동하는지 확인 가능aspnetcore-virtualservice-fault-abort.yamlapiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: ## fault를 추가하면 에러 코드를 반환시킬 수 있다. 400 코드를 50% 반환 abort: percentage: value: 50 httpStatus: 400 route: - destination: host: aspnetcore-service subset: v1 # 버전 1에 대해 에러 400 반환$ kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml지연이 필요한 경우 아래와 같이 설정할 수 있습니다.aspnetcore-virtualservice-fault-delay.yamlapiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: delay: # 지연 fixedDelay: 5s # 5초 percentage: value: 100 # 100프로의 확률로 route: - destination: host: aspnetcore-service subset: v1 # v1에 대해$ kubectl apply -f aspnetcore-virtualservice-fault-delay.yamlIstio 모니터링 하기Prometheus (로그 메트릭 수집)# 설치 $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml # 설치 확인 $ kubectl get svc prometheus -n istio-system # 확인을 위한 포트 포워딩 $ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090Grafana (모니터링)# 설치 $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml # 설치 확인 kubectl get svc grafana -n istio-system # 확인을 위한 포트 포워딩 kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000Kiali (모니터링)# 설치 $ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/kiali.yaml # 설치 확인 kubectl get svc grafana -n istio-system # 확인을 위한 포트 포워딩 kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=kiali -o jsonpath='{.items[0].metadata.name}') 8080:20001 출처 https://istio.io/latest/docs/ops/deployment/architecture/ 2024년 02월 07일
BigQuery Table의 Copy vs. Clone vs. Snapshot 구글 인사이트 by Miyeon. Jo 2024년 01월 24일 PS1팀 문경미목차BQ Table Copy 소개BQ Table Clone 소개BQ Table Snapshot 소개Copy, Clone, Snapshot 차이점BigQuery의 기존 Table에서 사본 Table을 만들기 위해서 Copy, Clone, Snapshot 방법이 있습니다. 모두 사본 테이블을 만든다는 것은 동일하나 사용 목적과 사용 사례가 다릅니다.1. BQ Table Copy 소개기존 테이블의 데이터를 새로운 테이블로 복사하는 작업을 의미합니다. 기본적으로 데이터의 복사뿐만 아니라 원본 테이블의 구조 및 스키마도 동일하게 복사되며 새로운 독립 테이블을 생성되어 데이터에 변경 및 삭제 작업에서 소스 테이블의 영향을 받지 않습니다.[ 사용 사례 ]테이블 Backup테이블 구조의 및 데이터의 완전한 복사가 필요한 경우[ 생성 방법 ]CREATE TABLE Copy 문을 사용하여 source table 테이블을 destination table 이라는 새 테이블에 복사합니다.CREATE TABLE destination_dataset.destination_table Copy source_dataset.source_table ; [ 보관 비용 ]새로운 독립적인 테이블이 생성되었기 때문에 기존 테이블과 동일한 모든 레코드에 대해 전체 스토리지 비용이 청구됩니다.2. BQ Table Clone 소개Copy 와 동일하게 기존 테이블의 데이터를 새로운 테이블로 복사하는 작업을 의미합니다. 데이터의 복사뿐만 아니라 원본 테이블의 구조 및 스키마도 동일하게 복사되며 새로운 독립 테이블을 생성합니다.[ 사용 사례 ]개발 및 테스트에 사용할 수 있는 운영 테이블 Backup모든 데이터 복사가 아닌 특정 자체 분석 및 데이터 조작용이 필요한 경우[ 생성 방법 ]CREATE TABLE Clone 문을 사용하여 source table 테이블을 destination table 이라는 새 테이블에 복제합니다.CREATE TABLE destination_dataset.destination_table Clone source_dataset.source_table ;[ 보관 비용 ]Clone의 테이블의 데이터 변경이 일어난 경우에만 요금이 청구되므로 처음에는 테이블 Clone에 대한 스토리지 비용이 발생하지 않습니다. 소스 테이블과 Clone 테이블간 변경된 데이터에 대해서만 비용이 청구 됩니다. Clone 테이블에는 존재하지만 소스 테이블의 데이터 변경 및 삭제되는 경우 Clone 스토리지에 대한 요금이 청구됩니다.[ 이미지 1. 기본 테이블과 Clone 테이블의 가격 책정 차이점 ]3. BQ Table Snapshot 소개특정 기간의 테이블에 포함된 데이터를 보존합니다. 현재 테이블의 Snapshot을 저장하거나 이전 7일 이내에서 특정 시점의 테이블의 Snapshot을 만들 수 있으며 Snapshot의 만료 시간을 지정할 수 있습니다. 테이블 Snapshot은 읽기 전용으로 데이터 변경 및 삭제가 불가합니다.[ 사용 사례 ]읽기 전용의 사본 테이블이 필요한 경우특정 시점의 데이터를 보존하고 나중에 참조하고자 하는 경우[ 생성 방법 ]CREATE SNAPSHOT TABLE 사용하여 source table 테이블을 Snapshot 테이블을 생성합니다.CREATE SNAPSHOT TABLE destination_dataset.destination_table Clone source_dataset.source_table OPTIONS ( expiration_timestamp = TIMESTAMP 'TIMESTAMP_VALUE');[ 보관 비용 ]테이블 Snapshot을 만들면 처음에는 테이블 Snapshot에 대한 스토리지 비용이 발생하지 않으며 테이블 Snapshot이 생성된 후에 새 데이터를 기본 테이블에 추가하는 경우 테이블 Snapshot의 해당 데이터 스토리지에 대한 요금이 청구되지 않습니다. 테이블 Snapshot에도 존재하는 데이터가 기본 테이블에서 변경되거나 삭제되면 변경 또는 삭제된 데이터의 테이블 Snapshot 스토리지에 대한 요금이 청구됩니다.[ 이미지2. 기본 테이블과 Snapshot 테이블의 가격 책정 차이 ]4. Copy, Clone, Snapshot 차이점세 개의 복사 방법과 용도에 따라 사용 사례가 다르며 사용자의 환경과 요구에 따라 다르게 사용되어야 합니다.[ 비교 ]CopyCloneSNAPSHOTMutabilityMutableMutableImmutableTime TravelYesYesYesStorageFully allocatedDifferentialDifferentialReplaceYesYesNo 출처https://cloud.google.com/BigQuery/docs/managing-tables?hl=ko#sql_2https://cloud.google.com/BigQuery/docs/table-Clones-intro?hl=kohttps://cloud.google.com/BigQuery/docs/table-snapshots-intro?hl=ko 2024년 01월 24일
GKE에서 GatewayAPI 사용하기 구글 인사이트 by Miyeon. Jo 2024년 01월 11일 구글 TS2팀 이병준목차Gateway API란?GatewayAPI 실습하기Apache Deployment 추가 배포GKE gatewayAPI에서 궁금해 하실 만한 내용을 간단하게 말씀 드리겠습니다.정리1.Gateway API란?안녕하세요. 이번 블로그에서는 여러분들과 함께 GKE에서 Gateway API에 대해서 알아보고 간단하게 배포해 보려 합니다.그런데 그전에 먼저 GatewayAPI가 뭔지 알아야 겠네요. GatewayAPI가 뭘까요? API Gateway는 들어본거 같은데, 그거랑 비슷한거 아니야? 하실 수 있지만, 오히려 기존의 Kuberntest의 Ingress랑 비슷한 개념입니다.GKE의 공식문서에서는 GatewayAPI를 다음과 같이 표현하고 있습니다.Gateway API는 서비스 네트워킹을 위한 오픈소스 표준입니다. GatewayAPI는 다음과 같은 방법으로 인그레스 리소스를 발전시키고 개선합니다.역할 중심: 게이트웨이는 클러스터 운영자, 개발자, 인프라 제공업체에 해당하는 API 리소스로 구성됩니다. 그 결과 클러스터 운영자가 팀간 조정이 없는 여러 개발자팀에서 공유 인프라를 사용하는 방법을 정의할 수 있습니다.이동성: Gateway API는 여러 구현이 포함된 오픈소스 표준입니다. 이 API는 해당 환경 및 구현의 기본 기능을 지원하기 위해 유연성 및 확장성을 아직 갖고 있는 이동성이 뛰어난 코어 API(인그레스)를 촉진하는 유연한 규정 준수 개념을 사용하여 설계되었습니다. 그 결과 구현 및 환경 간에 개념 및 핵심 리소스의 일관성을 높이고 복잡성은 줄이면서 사용자 친숙성을 늘릴 수 있습니다.표현성: Gateway API 리소스는 헤더 기반 일치, 트래픽 가중, 커스텀 주석을 통해 인그레스에서만 가능한 기타 기능을 위한 기본 제공 기능을 제공합니다.출처 : 게이트웨이 | Google Kubernetes Engine(GKE)그러나 이 문서만 가지고는 내용을 충분히 이해하기 어렵습니다. 제가 느낀 바로는 ingress와 비슷하지만, ingress는 LB를 생성하면서 URL 라우팅을 작성해야 하는 반면, GatewayAPI는 LB 리소스와 URL 라우팅을 분리하여 개발자가 인프라 담당자에게 의존하지 않고 라우팅을 수행할 수 있는 장점이 있습니다.더 자세한 내용은 아래의 예제를 통해 확인할 수 있습니다.Ingress.yaml 예제apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /* pathType: ImplementationSpecific backend: service: name: my-products port: number: 60000 - path: /discounted pathType: ImplementationSpecific backend: service: name: my-discounted-products port: number: 80그러나 Gateway API는 다릅니다.GatewayAPI 및 HTTProute 예제gatewayapi.yamlkind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: internal-http spec: gatewayClassName: gke-l7-rilb listeners: - name: http protocol: HTTP port: 80httproute.yamlkind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: store spec: parentRefs: - kind: Gateway name: internal-http hostnames: - "store.example.com" rules: - backendRefs: - name: store-v1 port: 8080 - matches: - headers: - name: env value: canary backendRefs: - name: store-v2 port: 8080 - matches: - path: value: /de backendRefs: - name: store-german port: 8080이렇게 두 개의 파일을 작성합니다. 이 후, 개발자는 URL을 추가하거나, 필요에 따라 수정이 필요하면 인프라 엔지니어와 상의 없이 httproute.yaml 파일만 수정하여 배포할 수 있습니다. 간단한 구성도는 아래와 같습니다.– Ingress 구성도– GatewayAPI 구성도이제 차이가 느껴지시나요? httproute.yaml 파일만 수정하면 되므로 관리와 운영이 더 간편해질 것입니다.GatewayAPI에 대한 자세한 설명은 이 링크를 참고하세요.2. GatewayAPI 실습하기2.1 GKE를 배포합니다.여기서는 GKE 배포가 주된 내용이 아니니 링크만 드리고 넘어가겠습니다. GKE 는 노드 구성이 필요없는 autopilot 모드를 제공하고있습니다. 해당 모드로 생성하는 것을 추천드립니다.2.2 GatewayAPI배포클러스터가 배포되면 별도의 설치 없이 GKE gatewayClass를 확인할 수 있습니다.kubectl get gatewayclass이제 GatewayAPI를 배포해보겠습니다. 외부에서 접근 가능한 GatewayAPI를 만들기 위해 아래와 같이 gateway.yaml 파일을 만듭니다.kind: Gateway apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: external-http spec: gatewayClassName: gke-l7-global-external-managed listeners: - name: http protocol: HTTP port: 80gatewayClassName: gke-l7-global-external-managed : 이 게이트웨이에 GatewayClass를 지정합니다. 이 게이트웨이 클래스는 전역 외부 애플리케이션 부하 분산기를 사용합니다.protocol : http : 게이트웨이가 http, 80 포트를 수신합니다.배포하려면 다음을 실행합니다. kubectl create -f gateway.yaml.배포가 되었는지 확인합니다. kubectl get gatewaygateway.yaml에 대한 자세한 설명은 아래 링크를 참고해주세요.2.3 Demo 어플리케이션 배포먼저 Nginx를 배포한 후 Apache를 배포하여 httproute만으로 URL 라우팅이 이루어지는 것을 살펴보겠습니다.2.3.1 nginx 배포Nginx 어플리케이션을 배포하려면 nginx.yaml 파일을 작성합니다.apiVersion: v1 kind: Service metadata: name: nginx-service spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80pod 와 서비스 배포를 확인합니다.kubectl get podkubectl get svc2.4 Httproute를 배포합니다.httproute.yaml 을 작성합니다.kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: nginx-route spec: parentRefs: - kind: Gateway name: external-http rules: - backendRefs: - port: 80 name: nginx-service배포하려면 다음을 실행합니다.kubectl create -f httproute.yaml이제 브라우저를 열고 GatewayIP로 접근하여 결과를 확인합니다.예: http://34.117.176.68(IP 확인)3. Apache Deployment 추가 배포Nginx에 접근하는 것과 동일한 방식으로 간단하게 Apache를 배포하면서 LB 설정 변경 없이 HTTProute 설정만 변경해보겠습니다.3.1 Apache 배포httpd.yaml 파일은 아래와 같이 작성 후 배포합니다.apiVersion: v1 kind: Service metadata: name: httpd-service spec: selector: app: httpd ports: - protocol: TCP port: 80 targetPort: 80 --- apiVersion: apps/v1 kind: Deployment metadata: name: httpd-deployment spec: replicas: 1 selector: matchLabels: app: httpd template: metadata: labels: app: httpd spec: containers: - name: httpd-container image: httpd:latest command: ["/bin/bash", "-c"] args: ["echo 'Hello, this is /httpd path' > /usr/local/apache2/htdocs/httpd; apachectl -D FOREGROUND"] ports: - containerPort: 803.2 HTTProute 업데이트기존의 httproute.yaml 파일을 아래와 같이 수정합니다.kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1beta1 metadata: name: nginx-route spec: parentRefs: - kind: Gateway name: external-http rules: - backendRefs: - port: 80 name: nginx-service - matches: - path: value: /httpd backendRefs: - port: 80 name: httpd-service수정한 내용을 배포합니다.kubectl apply -f httproute.yaml초록색 글자를 보면, path에 /httpd를 추가하였고, httpd-service 서비스 리소스를 연결하였습니다. 배포 한번 해보고 다시 테스트 결과를 볼까요?보시는 바와 같이 /httpd 경로로 apache가 배포된 것을 확인 할 수 있습니다.추후에 다른 리소스가 배포된다면, LB 구성은 건들지 않고 httproute.yaml 만 수정해서 언제든지 배포할 수 있습니다.인프라엔지니어 눈치를 볼 필요가 없겠죠?이렇게 GKE에서 GatewayAPI를 배포해 봤습니다. 여기 나온 내용들은 아래 링크에서 더 자세하게 확인 할 수 있습니다. 게이트웨이 배포 | Google Kubernetes Engine(GKE)4. GKE gatewayAPI에서 궁금해 하실 만한 내용을 간단하게 말씀 드리겠습니다.4.1 SSL 인증서 연동이 가능한지?물론 가능합니다. 해당 방법에 대한 자세한 설명은 다음 링크를 참고 부탁드립니다. 게이트웨이 보호 | Google Kubernetes Engine(GKE)4.2 Cloud Armor 와 연동이 가능한지네 가능합니다. 해당 방법에 대한 자세한 설명은 다음 링크를 참고 부탁드립니다. 정책을 사용하여 게이트웨이 리소스 구성 | Google Kubernetes Engine(GKE)5. 정리이 문서에서는 GKE에서 Gateway API를 사용하는 방법과 간단한 예제를 다루었습니다. 여기서 몇 가지 주요 포인트를 정리하겠습니다.5.1. Gateway API의 장점역할 중심 구성: Gateway는 클러스터 운영자, 개발자, 인프라 제공 업체에 해당하는 API 리소스로 구성되어 팀 간 조정 없이 여러 개발자팀에서 공유 인프라를 사용하는 방법을 정의할 수 있습니다.이동성: GatewayAPI는 여러 구현이 포함된 오픈소스 표준으로, 유연성과 확장성을 갖고 있습니다. 기본 기능을 지원하여 구현 및 환경 간에 일관성을 높이고 복잡성을 줄이면서 사용자 친화성을 늘릴 수 있습니다.표현성: GatewayAPI 리소스는 헤더 기반 일치, 트래픽 가중, 커스텀 주석을 통해 인그레스에서만 가능한 기타 기능을 위한 기본 제공 기능을 제공합니다.5.2. GatewayAPI와 Ingress의 차이Ingress vs. GatewayAPI: Ingress는 LB 생성과 URL 라우팅을 동시에 작성해야하지만, GatewayAPI는 LB 리소스와 URL 라우팅을 분리하여 개발자가 라우팅을 더 유연하게 조절할 수 있습니다.5.3. 추가 기능과 연동SSL 인증서 연동 및 Cloud Armor와의 연동이 가능하며, 자세한 내용은 다음을 참고하세요.5.4. 최종 결론지금까지 GKE에서 GatewayAPI를 테스트해보았습니다. Ingress에서 분리된 URL 라우팅은 관리와 운영을 더 효율적으로 만들 수 있으며, 앞으로 더 다양한 기능이 추가될 예정입니다. 출처https://cloud.google.com/BigQuery/docs/managing-tables?hl=ko#sql_2https://cloud.google.com/BigQuery/docs/table-Clones-intro?hl=kohttps://cloud.google.com/BigQuery/docs/table-snapshots-intro?hl=ko 2024년 01월 11일
Firestore의 PITR(point-in-time-recovery) 살펴보기 구글 인사이트 by Miyeon. Jo 2023년 12월 13일 구글 PS2팀 이지영Firestore란?Firestore는 NoSQL 문서 중심의 데이터베이스입니다. SQL Database와 달리 테이블이나 행이 없으며, 컬렉션으로 정리되는 문서에 데이터를 저장합니다. 각 문서에는 키-값 쌍이 있습니다. Firestore는 작은 문서가 많이 있는 컬렉션을 저장하는 데 최적화되어 있습니다. 모든 문서는 컬렉션에 저장되어야 합니다. 문서는 하위 컬렉션과 중첩 개체를 포함할 수 있으며, 둘 다 모두 문자열과 같은 기본형 필드나 목록과 같은 복합 객체를 포함할 수 있습니다. 컬렉션과 문서는 Firestore에서 암시적으로 생성됩니다. 데이터를 컬렉션 내의 문서에 할당하기만 하면 됩니다. 컬렉션이나 문서가 없으면 Firestore가 이를 자동으로 만듭니다.PITR(point-in-time-recovery) 소개Firestore PITR(point-in-time recovery)은 실수로 인한 삭제 또는 쓰기를 방지합니다. PITR은 이전 타임스탬프의 문서 버전을 일관되게 유지합니다. 예를 들어 개발자가 잘못된 데이터, 실수로 인한 삭제 또는 쓰기를 푸시하는 경우 PITR을 통해 과거의 특정 시점(최대 7일)의 데이터를 원활하게 복구할 수 있습니다.PITR 활성화 후에, Firestore는 PITR 데이터에 대한 보관을 시작합니다. PITR 데이터는 PITR 기간(window) 중 7일 동안 보관됩니다. PITR이 사용 설정된 시간을 기반으로 타임스탬프의 데이터를 읽을 수 있습니다.PITR 사용 설정 상태사용 가능한 가장 이른 PITR 데이터사용 중지됨일기 요청 시간 1시간 전7일 이내에 사용 설정됨PITR이 사용 설정되기 1시간 전7일 이전에 사용 설정됨읽기 요청 시간 7일 전분당 단일 버전이 PITR 기간에 보관됩니다. 1분 타임스탬프를 사용하여 분 단위로 문서를 읽을 수 있습니다. 쓰기가 여러 개인 경우 문서 버전 하나만 유지됩니다. 예를 들어 문서에 2023-05-30 09:00:00AM(제외) 및 2023-05-30 09:01:00AM(포함) 타임스탬프 사이에 v1, v2, … vk에 이르는 여러 개의 쓰기가 있는 경우, 타임스탬프 2023-05-30 09:01:00AM의 읽기 요청이 문서의 vk 버전을 반환합니다.PITR 기간 중 생성된 데이터를 읽을 수 있습니다. 데이터는 분 단위로 저장되며 동일한 단위로 데이터를 복구할 수 있습니다. Firestore PITR 기능은 기본적으로 중지되어 있습니다.데이터를 복구하는 방법에는 두 가지가 있습니다.데이터베이스의 일부를 복구하려면 쿼리 조건을 지정하거나 이전의 타임스탬프와 함께 직접 키 조회를 사용하여 비활성 읽기를 수행합니다. 그런 다음 결과를 다시 실시간 데이터베이스에 기록합니다. 이는 일반적으로 실시간 데이터베이스의 소위 외과적 수술을 위해 사용됩니다. 예를 들어 특정 문서를 실수로 삭제하거나 데이터 하위 집합을 잘못 업데이트한 경우 이와 같은 방법으로 복구할 수 있습니다.전체 데이터베이스를 복구하려면 이전의 타임스탬프를 지정하여 데이터베이스를 내보낸 후 새 데이터베이스로 가져옵니다. 데이터베이스를 내보내는 데 몇 시간이 걸릴 수 있습니다. 타임스탬프가 지난 1시간 이내의 1분 타임스탬프이지만 earliestVersionTime 이후의 일관된 PITR 데이터만 내보낼 수 있습니다.PITR(point-in-time-recovery) 설정(참고) PITR 설정을 관리하려면 다음 권한이 필요합니다.데이터베이스를 만들 때 PITR 사용 설정: datastore.databases.create기존 데이터베이스에서 PITR 설정 업데이트: datastore.databases.update,datastore.databases.listPITR 데이터에서 읽기 수행: datastore.databases.get,datastore.entities.get,datastore.entities.listPITR 데이터 내보내기: datastore.databases.exportPITR 데이터 가져오기: datastore.databases.importPITR(point-in-time-recovery)를 사용하기 위해 “재해복구” 페이지에서 “수정” 아이콘을 선택합니다.“point-in-time-recovery 사용 설정”의 체크박스를 선택하고 “저장” 버튼을 누릅니다.이제 “재해 복구” 페이지에 “가장 빠른 버전 시간”과 “보존 기간”이 포함된 것을 확인할 수 있습니다.여기까지가 Firesotre에서 PITR을 설정하는 방법이었으며, 이제부터 데이터 저장이 시작됩니다.요약지금까지 Firestore에 추가된 PITR기능에 대하여 알아보았습니다. Firestore는 이미 높은 가용성을 제공하고 있지만, PITR를 통하여 우발적인 삭제 또는 쓰기로부터 데이터를 확실히 보호 받을 수 있게 제공하게 되었습니다. 출처https://cloud.google.com/firestore?hl=kohttps://cloud.google.com/firestore/docs/data-model?hl=kohttps://cloud.google.com/firestore/docs/pitr?hl=kohttps://cloud.google.com/blog/products/databases/firestore-adds-point-in-time-recovery-and-scheduled-backups?hl=en 2023년 12월 13일