# Module 3. 서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ DB 사용 경험 ê°œì„ ì•žì„œ [Module 2. REST API 기반 서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜](https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module2/README.md) ì—서 간단한 서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 개발해봤습니다. ì´ ë•ŒëŠ” DB ì¸ì¦ ì •ë³´ë¥¼ Lambda í•¨ìˆ˜ì˜ ì½”ë“œ ìžì²´ì— ì§ì ‘ í¬í•¨í•´ ì ‘ê·¼í–ˆëŠ”ë° ì´ëŠ” ë³´ì•ˆìƒ ì•ˆì „í•œ ë°©ë²•ì€ ì•„ë‹™ë‹ˆë‹¤. ì´ëŸ° ë¬¸ì œë¥¼ 극복하기 위해서 권장ë˜ëŠ” ë°©ë²•ì€ [AWS Secrets Manager 를 활용해 Lambda í•¨ìˆ˜ì— DB í¬ë¦¬ë´ì…œ ì •ë³´ë¥¼ ì „ë‹¬](https://aws.amazon.com/blogs/security/rotate-amazon-rds-database-credentials-automatically-with-aws-secrets-manager/) 하는 것입니다. ë˜í•œ DB ì˜ ì»¤ë„¥ì…˜ì„ ëª¨ë‘ í•¨ìˆ˜ ë‚´ë¶€ì˜ Handler ì—서 처리했습니다. ì´ë ‡ê²Œ ê°œë°œí• ê²½ìš° Lambda 함수가 호출ë 때마다 DB ì— ì—°ê²°í•˜ê³ ì¢…ë£Œí•˜ëŠ” ê²ƒì´ ë°˜ë³µë˜ë¯€ë¡œ 실행 컨í…스트 재활용 측면ì—서 ì„±ëŠ¥ì— ì¢‹ì§€ ì•Šì€ ì˜í–¥ì´ ìƒê¸°ê²Œ ë©ë‹ˆë‹¤. 하지만 DB ì»¤ë„¥ì…˜ì„ ì „ì—으로 ì„ ì–¸í• ê²½ìš° 커넥션 ì¢…ë£Œì— ëŒ€í•œ ë¡œì§ ì²˜ë¦¬ê°€ ì–´ë ¤ì›Œ ê° DB 엔진ì´ì˜ 최대 ì—°ê²° 수를 초과하는 ë¬¸ì œê°€ ë°œìƒí• 수 있습니다. ì´ ë¬¸ì œëŠ” [Amazon RDS Proxy 를 통해 í’€ì„ ê´€ë¦¬](https://docs.aws.amazon.com/lambda/latest/dg/configuration-database.html) í•˜ê³ Lambda 함수ì—서 쿼리를 ë¦´ë ˆì´í•˜ë©´ í° ë³€ê²½ ì—†ì´ í•´ê²°ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. [서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜ì—는 ì‚¬ìš©í• ìˆ˜ 있는 다양한 DB 옵션](https://aws.amazon.com/blogs/compute/understanding-database-options-for-your-serverless-web-applications/) ì´ ì¡´ìž¬í•©ë‹ˆë‹¤. Module 3 ì—서는 ì´ ì¤‘ 가장 ë§Žì´ í™œìš©ë˜ëŠ” 형태 중 í•˜ë‚˜ì¸ ê´€ê³„í˜• ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 기준으로 ì•ˆì „í•˜ê²Œ DB ì— ì—°ê²°í•˜ê³ ì»¤ë„¥ì…˜ í’€ì„ íš¨ê³¼ì 으로 관리하기 위해 아래 아키í…처와 ê°™ì´ AWS Secrets Manager 와 Amazon RDS Proxy 를 í™œìš©í•´ë³´ê² ìŠµë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/module3_architecture.jpg"></img></div> ì´ë²ˆ ì‹¤ìŠµì€ ì•žì„œ Module 2 ì—서 ìƒì„±í•œ 서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜ì„ 그대로 활용합니다. ### Step 1. AWS Secrets Manager 구성 [AWS Secrets Manager](https://aws.amazon.com/secrets-manager/) 를 사용하면 ì• í”Œë¦¬ì¼€ì´ì…˜, 서비스, IT ë¦¬ì†ŒìŠ¤ì— ì•¡ì„¸ìŠ¤í• ë•Œ 필요한 보안 ì •ë³´ë¥¼ ë³´í•˜í• ìˆ˜ 있습니다. 특히 DB í¬ë¦¬ë´ì…œ ë¿ ì•„ë‹ˆë¼ API 키와 ê°™ì€ ë³´ì•ˆ ì •ë³´ë¥¼ ì†ì‰½ê²Œ êµì²´, 관리 ë° ê²€ìƒ‰í•˜ëŠ”ê²Œ 가능합니다. ì´ë¥¼ 사용하면 ì• í”Œë¦¬ì¼€ì´ì…˜ì€ Secrets Manager API 를 호출하여 í¬ë¦¬ë´ì…œ ì •ë³´ë¥¼ ì½ìœ¼ë¯€ë¡œ, 민ê°í•œ ì •ë³´ë¥¼ í‰ë¬¸ìœ¼ë¡œ í•˜ë“œì½”ë”©í• í•„ìš”ê°€ 없는 보안ìƒì˜ ì´ì ì´ ìžˆìŠµë‹ˆë‹¤. ì´ë²ˆ 단계ì—서는 앞서 ìƒì„±í•œ Lambda í•¨ìˆ˜ì— ì§ì ‘ 하드코딩 ë˜ì–´ìžˆëŠ” DB í¬ë¦¬ë´ì…œ ì •ë³´ë¥¼ Secrets Manager API 를 호출하여 불러오는 êµ¬ì„±ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤. 1. [AWS 콘솔](https://console.aws.amazon.com/) ì—서 AWS Secretes Manager 서비스로 ì´ë™í•©ë‹ˆë‹¤. 2. í™”ë©´ì˜ [Store a new secret] ë²„íŠ¼ì„ í´ë¦í•©ë‹ˆë‹¤. 3. Select secret type ì€ [Credential for RDS database] ì˜µì…˜ì„ ì„ íƒí•˜ê³ Module 2 ì—서 ìƒì„±í–ˆë˜ DB í¬ë¦¬ë´ì…œ ì •ë³´ë¥¼ ìž…ë ¥í•©ë‹ˆë‹¤. [User name] ì—는 `admin` [Password] ì—는 `Passw0rd` 를 ìž…ë ¥í•©ë‹ˆë‹¤. 아래 Select which RDS database this secret will access 옵션ì—서는 ì´ì „ì— ìƒì„±í•œ **serverless-app-rds** 를 ì„ íƒí•œ ë’¤ [Next] ë²„íŠ¼ì„ í´ë¦í•©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/1.png"></img></div> 4. [Secret name] ì—는 `serverless-app-rds-secret` ì„ ìž…ë ¥í•˜ê³ ë‚˜ë¨¸ì§€ëŠ” 기본 ì˜µì…˜ì„ ìœ ì§€í•œ 채 [Next] ë²„íŠ¼ì„ í´ë¦í•©ë‹ˆë‹¤. 5. [DB í¬ë¦¬ë´ì…œì„ ìžë™ìœ¼ë¡œ 로테ì´ì…˜](https://aws.amazon.com/blogs/security/rotate-amazon-rds-database-credentials-automatically-with-aws-secrets-manager/) í• ìˆ˜ë„ ìžˆìŠµë‹ˆë‹¤. ì´ë²ˆ 실습ì—서는 ì´ë¥¼ 활용하지는 않습니다. [Next] ë²„íŠ¼ì„ í´ë¦í•©ë‹ˆë‹¤. 6. ì„¤ì • ê°’ì„ ê²€í† í•œ ë’¤ í•˜ë‹¨ì˜ [Store] 를 ì„ íƒí•˜ì—¬ DB ì¸ì¦ ì •ë³´ ì €ìž¥ì„ ì™„ë£Œí•©ë‹ˆë‹¤. 7. Secrets Manager 를 사용하면 기본ì 으로는 í¼ë¸”ë¦ í†µì‹ ì„ í†µí•´ DB í¬ë¦¬ë´ì…œì„ ê°€ì ¸ì˜¤ê²Œ ë˜ì§€ë§Œ [VPC Endpoints](https://docs.aws.amazon.com/vpc/latest/privatelink/vpc-endpoints.html) 를 사용하면 프ë¼ì´ë¹— 엔드í¬ì¸íŠ¸ë¥¼ 통해 VPC ë‚´ì˜ ë¦¬ì†ŒìŠ¤ê°€ ì§ì ‘ 액세스 í• ìˆ˜ 있습니다. VPC Endpoints ì„¤ì •ì„ ìœ„í•´ Amazon VPC 서비스로 ì´ë™í•©ë‹ˆë‹¤. 8. ì¢Œì¸¡ì˜ [Your VPCs] 로 ì´ë™í•œ ë’¤ ì‹¤ìŠµì— ì‚¬ìš© ì¤‘ì¸ **serverless-app** ì„ ì„ íƒí•˜ê³ ìƒë‹¨ì˜ [Actions] ë©”ë‰´ì˜ [Edit DNS hostnames] 를 ì„ íƒí•©ë‹ˆë‹¤. 9. [DNS hostnames] ì˜ [Enable] ì„ ì²´í¬í•˜ì—¬ 활성화 합니다. [Save changes] ë²„íŠ¼ì„ í´ë¦í•´ 변경사í•ì„ ì €ìž¥í•©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/0.png"></img></div> 10. VPC Endpoints ì„¤ì •ì—는 보안 ê·¸ë£¹ì´ í•„ìš”í•©ë‹ˆë‹¤. 오늘 ì‹¤ìŠµì˜ Secrets Manager ì˜ ê²½ìš° Lambda ì—서 ì ‘ê·¼í• ìˆ˜ 있어야 합니다. ì¢Œì¸¡ì˜ [Security Group] 메뉴로 ì´ë™í•œ ë’¤ [Create security group] ë²„íŠ¼ì„ ì„ íƒí•©ë‹ˆë‹¤. 11. [Security group name] ì—는 `secret-sg` 를 ìž…ë ¥í•˜ê³ [Description] ì„ ì ì€ ë’¤ [VPC] 는 앞서 ìƒì„±í•œ **serverless-app** ì„ ì„ íƒí•©ë‹ˆë‹¤. 12. í•˜ë‹¨ì˜ Inbound rules ì—서 [Add rule] ë²„íŠ¼ì„ í´ë¦í•˜ì—¬ ì¸ë°”운드 ê·œì¹™ì„ ì¶”ê°€í•©ë‹ˆë‹¤. [Type] ì€ **HTTPS** 를 ì„ íƒí•˜ê³ [Source] ì—는 앞서 ìƒì„±í•œ lambda-sg 를 ì„ íƒí•©ë‹ˆë‹¤. 아래 [Create security group] ì„ ì„ íƒí•˜ì—¬ 완료합니다. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/2.png"></img></div> 13. VPC Endpoints 를 ì„¤ì •í•©ë‹ˆë‹¤. ì¢Œì¸¡ì˜ [Endpoints] 메뉴로 ì´ë™í•œ ë’¤ [Create Endpoint] ë²„íŠ¼ì„ ì„ íƒí•©ë‹ˆë‹¤. 14. [Service category] 는 **AWS services** 를 ì„ íƒí•˜ê³ ì•„ëž˜ì˜ [Service Name] ì— `com.amazonaws.ap-northeast-2.secretsmanager` 를 검색하여 ì„ íƒí•©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/3.png"></img></div> 15. í•˜ë‹¨ì˜ [VPC] 는 **serverless-app** ì„ ì„ íƒí•˜ê³ 아래 [Subnets] ì—는 Secrets Manager 를 위해 ìƒì„±í•œ **secret-subnet-a** 와 **secret-subnet-c** 를 ì„ íƒí•©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/4.png"></img></div> 16. 아래 [Security group] ì—는 **secret-sg** 를 ì„ íƒí•´ì¤ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/5.png"></img></div> 17. 여기까지 잘 ì„¤ì •í–ˆë‹¤ë©´ [Create endpoint] ë²„íŠ¼ì„ í´ë¦í•˜ì—¬ VPC Endpoints ìƒì„±ì„ 완료합니다. ìž ì‹œí›„ 다ìŒê³¼ ê°™ì´ Status ê°€ available ì´ ë˜ë©´ 다ìŒìœ¼ë¡œ 진행합니다. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/6.png"></img></div> ### Step 2. Amazon RDS Proxy 구성 서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜ì—서 효과ì 으로 RDS 를 사용하는 ê²ƒì€ ì‰½ì§€ 않습니다. 서버리스 아키í…처를 기반으로 êµ¬ì¶•ëœ ì• í”Œë¦¬ì¼€ì´ì…˜ì€ DB ì— ë‹¤ìˆ˜ì˜ ì»¤ë„¥ì…˜ì„ ë§Œë“¤ì–´ max_connections ì˜µì…˜ì„ ì´ˆê³¼í•˜ëŠ” ì—러가 ë°œìƒí•˜ê±°ë‚˜ ë¹ ë¥¸ ì†ë„로 DB ì»¤ë„¥ì…˜ì„ ì—´ê³ ë‹«ìŒìœ¼ë¡œ ê³¼ë„하게 메모리와 컴퓨팅 리소스를 소진하는 경우가 ë°œìƒí•©ë‹ˆë‹¤. Amazon RDS Proxy 를 사용하면 ì• í”Œë¦¬ì¼€ì´ì…˜ê³¼ DB 사ì´ì˜ ì—°ê²°ì„ í’€ë§í•˜ê³ ê³µìœ í• ìˆ˜ 있기 ë•Œë¬¸ì— ì´ëŸ° ì–´ë ¤ì›€ì„ ê·¹ë³µí• ìˆ˜ 있습니다. ë˜í•œ DB ìž¥ì• ì¡°ì¹˜ ì‹œì— ìƒˆë¡œìš´ DB 로 ì—°ê²°ì„ ë³µêµ¬í•˜ëŠ” 시간 ì—시 최대 66% ë‹¨ì¶•í• ìˆ˜ 있ë„ë¡ êµ¬í˜„ë˜ì–´ 있습니다. [RDS Proxy 를 활용한 ì• í”Œë¦¬ì¼€ì´ì…˜ 가용성 í–¥ìƒ](https://aws.amazon.com/blogs/database/improving-application-availability-with-amazon-rds-proxy/) ì„ ë³´ë©´ 보다 ìžì„¸í•œ ë‚´ìš©ì„ ì‚´íŽ´ë³¼ 수 있습니다. ì´ë²ˆ 실습ì—는 개발 ì¤‘ì¸ ì„œë²„ë¦¬ìŠ¤ ì• í”Œë¦¬ì¼€ì´ì…˜ì—서 관계형 ë°ì´í„°ë² ì´ìФ ì‚¬ìš©ì„ íš¨ìœ¨ì 으로 바꿀 ê³ ê°€ìš©ìƒ DB 프ë¡ì‹œ ì„œë¹„ìŠ¤ì¸ RDS Proxy 를 구성합니다. 1. [AWS 콘솔](https://console.aws.amazon.com/) ì—서 Amazon RDS 서비스로 ì´ë™í•©ë‹ˆë‹¤. 2. ì¢Œì¸¡ì˜ [Proxies] 메뉴를 ì„ íƒí•œ ë’¤ [Create proxy] ë²„íŠ¼ì„ í´ë¦í•©ë‹ˆë‹¤. 3. [Proxy identifier] ì—는 `serverless-app-rds-proxy` 를 ìž…ë ¥í•˜ê³ [Engine compatibility] 는 **MySQL** ì„ ì„ íƒí•©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/7.png"></img></div> 4. í•˜ë‹¨ì˜ Target group configuration ì—서 [Database] 는 Module 2. ì—서 ìƒì„±í•œ **serverless-app-rds** 를 ì„ íƒí•©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/8.png"></img></div> 5. Connectivity ì„¤ì •ì—서 [Secrets Manager secret(s)] ì—는 앞서 ìƒì„±í•œ **serverless-app-rds-secret** ì„ ì„ íƒí•©ë‹ˆë‹¤. 6. [Subnets] ì—는 VPC ì˜ ëª¨ë“ ì„œë¸Œë„·ì´ ì„ íƒë˜ì–´ 있습니다. RDS ì—서 사용하는 **rds-subnet-a, rds-subnet-c** 를 확ì¸í•˜ì—¬ 나머지는 ì œê±°í•©ë‹ˆë‹¤. 7. [Additional connectivity configuration] ì˜ ë“œë¡ë‹¤ìš´ ë²„íŠ¼ì„ í´ë¦í•œ ë’¤ [Existing VPC security groups] ì—는 **rds-sg** 를 추가합니다. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/9.png"></img></div> 8. ì„¤ì •ì„ ìž˜ 했다면 í•˜ë‹¨ì˜ [Create proxy] ë²„íŠ¼ì„ í´ë¦í•˜ì—¬ ìƒì„±ì„ 시작합니다. RDS Proxy 를 ì‚¬ìš©í• ìˆ˜ 있게 ë˜ëŠ” ë°ëŠ” 몇 ë¶„ ì •ë„ ì†Œìš”ë©ë‹ˆë‹¤. 9. ìƒì„±ì´ ì™„ë£Œëœ í›„ 해당 RDS Proxy 를 ì„ íƒí•´ë³´ë©´ 다ìŒê³¼ ê°™ì´ [Proxy endpoints] 를 확ì¸í• 수 있습니다. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/10.png"></img></div> ### Step 3. AWS Lambda 함수 변경 ì´ë²ˆ 단계ì—서는 앞서 ìƒì„±í•œ Lambda 함수가 구성한 RDS Proxy 를 활용해 RDS ì— ì ‘ê·¼í•˜ë„ë¡ ìˆ˜ì •í•©ë‹ˆë‹¤. 1. [AWS 콘솔](https://console.aws.amazon.com/) ì—서 AWS Lambda 서비스로 ì´ë™í•©ë‹ˆë‹¤. 2. ì´ì „ì— ìƒì„±í•œ **serverless-app-lambda** 를 ì„ íƒí•˜ê³ [Configuration] íƒì˜ [Permissions] 메뉴로 ì´ë™í•©ë‹ˆë‹¤. Lambda í•¨ìˆ˜ì— ì„¤ì •í•œ IAM Role ì´ ë³´ìž…ë‹ˆë‹¤. í´ë¦í•˜ì—¬ IAM 페ì´ì§€ë¡œ ì´ë™í•©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/11.png"></img></div> 3. RDS Proxy ì— ì—°ê²°í•˜ê¸° 위해 Secrets Manager API 를 í™œìš©í• ê²ƒìž…ë‹ˆë‹¤. [Attach policies] 메뉴를 ì„ íƒí•˜ê³ `SecretsManagerReadWrite` ê¶Œí•œì„ ì°¾ì•„ ì„ íƒí•œ ë’¤ [Attach policy] ë²„íŠ¼ì„ í´ë¦í•˜ì—¬ 추가합니다. 다ìŒê³¼ ê°™ì´ ìƒˆë¡œìš´ ì •ì±…ì´ ì¶”ê°€ ë©ë‹ˆë‹¤. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/12.png"></img></div> <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/13.png"></img></div> 4. 권한 ì„¤ì •ì€ ì™„ë£Œí–ˆìŠµë‹ˆë‹¤. 다시 Lambda ì„œë¹„ìŠ¤ì˜ **serverless-app-lambda** 로 ì´ë™í•œ ë’¤ 코드를 아래와 ê°™ì´ ë³€ê²½í•©ë‹ˆë‹¤. ```Python import json import pymysql import boto3 import base64 import time from botocore.exceptions import ClientError secret_name = "serverless-app-rds-secret" region_name = "ap-northeast-2" def get_secret(): session = boto3.session.Session() client = session.client( service_name = 'secretsmanager', region_name = region_name ) get_secret_value_response = client.get_secret_value( SecretId=secret_name ) if 'SecretString' in get_secret_value_response: secret = get_secret_value_response['SecretString'] return secret else: decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary']) return decoded_binary_secret def lambda_handler(event, context): secret = get_secret() json_secret = json.loads(secret) db = pymysql.connect( host = 'YOUR RDS PROXY ENDPOINT', user = json_secret['username'], password = json_secret['password'] ) cursor = db.cursor() cursor.execute("select now()") result = cursor.fetchone() db.commit() return { 'statusCode': 200, 'body': json.dumps(result[0].isoformat()) } ``` > Module 2 보다 코드가 길어졌지만 ì‹¤ì œë¡œ AWS Secrets Manager 를 활용하는 ê²ƒì„ ì œì™¸í•œë‹¤ë©´ pymysql.connect() ì˜ host 주소만 RDS Proxy 로 ë³€ê²½ëœ ê²ƒì„ ì•Œ 수 있습니다. ì´ì²˜ëŸ¼ RDS Proxy 는 ì• í”Œë¦¬ì¼€ì´ì…˜ì˜ ë³€ê²½ì„ ìµœì†Œí™”í•˜ëŠ” ë°©ì‹ìœ¼ë¡œ 충분히 í™œìš©ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤. 5. 코드 ìƒ 33 ë¼ì¸ì˜ pymysql.connect() ë¶€ë¶„ì˜ host ë¶€ë¶„ì— ëŒ€í•œ ë³€ê²½ì´ í•„ìš”í•©ë‹ˆë‹¤. 앞서 ìƒì„±í•œ RDS Proxy ì˜ Proxy endpoints 중 [Tartget role] ì´ **Read/write** 로 ë˜ì–´ 있는 엔드í¬ì¸íŠ¸ë¥¼ 복사하여 Lambda í•¨ìˆ˜ì— ì—…ë°ì´íЏ 합니다. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/14.png"></img></div> > Module 2 ì—서 êµ¬ì„±í• ë•ŒëŠ” user, password 와 ê°™ì€ DB í¬ë¦¬ë´ì…œì„ 하드코딩 했습니다. 앞서 설명했 듯 ì´ëŠ” ì•ˆì „í•œ ë°©ë²•ì´ ì•„ë‹ˆë©° ì´ë²ˆ 실습과 ê°™ì´ AWS Secrets Manager ì— ì´ë¥¼ ì €ìž¥í•˜ê³ API ë“±ì„ í†µí•´ ì´ëŸ¬í•œ ì •ë³´ë¥¼ ê°€ì ¸ì™€ì„œ DB ì— ì—°ê²°í•˜ëŠ” ê²ƒì´ ì•ˆì „í•©ë‹ˆë‹¤. 6. ë³€ê²½ì„ ì™„ë£Œ 했다면 [Deploy] ë²„íŠ¼ì„ í´ë¦í•´ ë°°í¬ë¥¼ 완료합니다. ### Step 4. 테스트 ì´ë²ˆ ëª¨ë“ˆì„ ë§ˆì¹˜ê¸°ì— ì•žì„œ 구성한 AWS Secrets Manager 와 Amazon RDS Proxy ê°€ ì œëŒ€ë¡œ ë™ìž‘하는지 테스트를 í•´ë³´ê² ìŠµë‹ˆë‹¤. Lambda 콘솔ì—서 바로 Test 를 ìˆ˜í–‰í• ìˆ˜ 있지만 Module 2 ì—서 ìƒì„±í•œ Amazon API Gateway ì˜ Invoke URL ì„ í™œìš©í•´ 테스트 í•˜ê² ìŠµë‹ˆë‹¤. 1. [AWS 콘솔](https://console.aws.amazon.com/) ì—서 Amazon API Gateway 서비스로 ì´ë™í•©ë‹ˆë‹¤. 2. 앞서 ìƒì„±í•œ **serverless-app-api** 를 ì„ íƒí•˜ê³ ì¢Œì¸¡ì˜ [Stages] 메뉴로 ì´ë™í•œ ë’¤ **dev** 스테ì´ì§€ë¥¼ ì„ íƒí•©ë‹ˆë‹¤. 3. í™”ë©´ì— í‘œì‹œëœ [Invoke URL] 를 복사하여 브ë¼ìš°ì €ì—서 연결하거나 터미ë„ì—서 호출해봅니다. Module 2 ì—서 ìˆ˜í–‰í•˜ë˜ ê²ƒê³¼ ìœ ì‚¬í•œ ê²°ê³¼ê°’ì´ ë‚˜ì˜¤ëŠ” ê²ƒì„ í™•ì¸í• 수 있습니다. <div align="center"><img src="https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module3/img/15.png"></img></div> ``` $ curl YOUR API Gateway Invoke URL {"statusCode": 200, "body": "\"2021-06-21T12:02:55\""} ``` 서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜ì—서 RDS 를 보다 ì•ˆì „í•˜ê³ íš¨ìœ¨ì 으로 활용하는 ë°©ë²•ì„ ì•Œì•„ë´¤ìŠµë‹ˆë‹¤. [Module 4. 서버리스 ì• í”Œë¦¬ì¼€ì´ì…˜ 코드 최ì í™” ë° ë¶€í•˜í…ŒìŠ¤íŠ¸](https://github.com/aws-samples/the-evolution-of-aws-serverless-applications/blob/main/module4/README.md) 로 ì´ë™í•©ë‹ˆë‹¤.