Dev&Ops/DevOps

[Automation] AWS User 생성 알림 자동화(2)

zeroneCoder 2022. 1. 30. 17:44

안녕하세요! zerone-code입니다.

 

지난 AWS User 생성 알림 자동화(1)에 이어서 두 번째 인프라 자동화와 관련된 글로 구현한 방법에 대해 다뤄보고자 합니다.

 

크게 Terraform으로 생성한 리소스Serverless Framework로 구현한 부분으로 나눠서 설명하도록 하겠습니다.

 

1부에서 다뤘던 Architecture에서 AWS Lambda 함수를 편리하게 구현하도록 하는 Framework로 Serverless Framework를 사용합니다.

 

Serverless Framework는 추후에 보다 자세한 글로 설명드리도록 하겠습니다.

 

이 부분을 제외하고 이 글을 읽으시는 분들은 완벽히 이해하고 가셨으면 좋겠습니다 :)

 

Remind

이 과정에서 사용된 AWS 서비스는 총 5가지입니다.

  • IAM (AWS Identity and Access Management)
  • EventBridge (AWS EventBridge)
  • SNS (AWS Simple Notification Service)
  • Lambda (AWS Lambda)
  • SES (AWS Simple Email Service)

Terraform을 이용해서 IAMSNS, SES를 생성하고, Serverless Framework를 이용해서 LambdaEventBridge를 생성합니다.

 

아래에서 코드를 통해 설명해보도록 하겠습니다.

 

Resource using Terraform

1. IAM(User 계정 생성)

제가 속해있는 조직은 위와 같이 사용자에 대한 계정을 만들고 사용자가 속할 Group을 맵핑해주는 형식으로 IAM을 사용하고 있습니다.

 

하지만 사용자 계정을 만드는 부분만 설명하기 위해서 위와 같이 코드를 작성할 수 있습니다.

 

name부분은 사용자 계정에 해당하는 부분입니다.

 

mail의 형태로 사용하는 이유는 Lambda에서 사용자 계정을 추출하여 바로 메일 주소로 활용할 수 있기 때문입니다. 

 

만약 단순히 test와 같은 이름만으로 사용하실 경우, Lambda에서 email도메인을 같이 적어주시면 됩니다.

 

tags field는 반드시 필요한 부분이 아니며 Optional 한 부분입니다.

 

2. SNS(EventBridge로부터 알림을 받는 Topic과 Lambda를 호출하는 Subscription)

SNS Topic

SNS Topic 은 크게 두가지의 policy로 구성이 돼있습니다.

 

Line 6 - 13번까지는 EventBridge에서 SNS Topic으로 이벤트가 발생하면 Publish를 할 수 있는 Policy입니다.

 

Line 14 - 35번까지는 SourceOwner가 특정 Account-ID인 경우, SNS의 특정 기능을 사용할 수 있도록 하는 Policy입니다.

 

즉, SNS Topic으로 EventBridge에서 특정 이벤트가 발생하면 첫 번째 Policy로 인해 Event를 Publish 할 수 있고,

특정 Account-id의 SNS Subscription에서는 SNS topic arn에 해당하는 SNS topic으로 들어온 이벤트를 구독(Subscription)하여 Target이 되는 Lambda를 실행시키는 구조가 됩니다.

3. SES(Lambda가 호출하는 Email Service)

위와 같이 사용하실 Domain으로 SES에 Domain Identity를 만들어주셔야 합니다. 해당 Domain으로 만드신 후, AWS Console로 가게 되면 이를 인증하도록 Address 값이 3개가 나옵니다. 

 

해당 Address를 사용하실 Domain의 route table(혹은 AWS Route53)에 등록하시면 인증이 됩니다.

 

하지만 이렇게 등록한다고 해서 해당 도메인을 사용할 수 있는 것은 아닙니다.

 

해당 도메인은 샌드박스라는 환경에 있습니다. 

 

샌드박스는 아래와 같은 제약 사항을 가지고 있습니다.

  • 24시간 동안 최대 200개의 메시지를 보낼 수 있습니다.
  • 초당 최대 1개의 메시지를 보낼 수 있습니다.
  • SES에 인증된 메일로만 메시지를 보낼 수 있습니다.

실제 Production에서 사용할 수 있도록 Request-production-access를 작성하여 AWS Support로 보내야 합니다.

 

Request-production-access는 최대 24시간이 걸린다고 공식문서에 나와있습니다. (아래의 Reference 참조)

 

따라서 Request-production-access과정까지가 완료가 되어야 Terraform으로 리소스를 만드는 부분이 끝나게 됩니다.

 

다음으로는 Serverless Framework를 사용한 Lambda와 EventBridge에 대해 설명해보도록 하겠습니다.

 

Implementation Source Code(Serverless Framework)

Lambda에서 사용될 IAM 리소스와 Serverless Framework로 작성된 2개의 소스코드로 구성되어 있습니다.

 

먼저 Lambda에서 사용될 IAM 리소스에 어떤 권한이 있는지에 대해 알아보도록 하겠습니다.

 

iam.tf

IAM 리소스는 위와 같이 구성이 돼있습니다.

 

먼저 윗부분은 IAM Role에 대한 부분입니다. lambda와 eventbridge에서 해당 IAM Role을 assume 할 수 있다는 뜻입니다. 

 

그다음 부분은 role의 policy에 대한 부분으로 Event가 발생하면 log를 남기거나 lambda가 실행하는 과정에서 사용할 API에 대한 권한을 policy로 적용해 준 부분입니다.

 

위와 같은 구성으로 IAM을 생성해줍니다.

 

다음으로는 lambda를 구성하는 serverless.yml을 살펴보겠습니다.

 

serverless.yml

serverless.yml은 크게 provider부분과 function부분, resource부분으로 살펴볼 수 있습니다.

 

provider부분은 lambda의 환경을 나타내는 부분이라고 볼 수 있습니다.

어떤 리전에 배포가 될 것이며, 얼마나 메모리를 사용할 것이고 어떤 iam role을 사용할 것인지와 같은 부분을 명세해둔 부분입니다.

 

function부분은 실제로 lambda가 trigger가 되었을 때 동작하는 부분입니다.

key이름 중에 handler라는 부분에 실제로 수행되는 binary이름을 맵핑할 수 있습니다.

이 부분은 언어 별로 조금씩 틀립니다.

js나 python의 경우에는 실행될 파일의 함수 이름으로 지정하며, golang의 경우 binary를 지정해줍니다.

 

resource부분은 serverless framework로 구성되는 resource를 나타내는데, 주로 function에서 사용되는 resource를 명세하게 됩니다.

위에서는 EventBridge에서 CreateUser API가 호출되면 SNS Topic으로 이벤트 알람을 보낼지에 대한 부분입니다.

 

위와 같이 구성을 했으면 그다음으로 실제로 동작하는 소스 코드를 보도로 하겠습니다.

 

serverless.go

lambda가 trigger가 되는 경우, 소스 코드의 Handler라는 함수가 호출되게 됩니다.

 

Handler함수에는 크게 4가지 부분으로 나눠볼 수 있습니다.

  1. Event로 들어온 정보를 파싱 하는 부분
  2. Password를 생성하는 부분
  3. 사용자 계정과 생성된 Password로 loginProfile을 생성하는 부분
  4. 생성된 계정 정보를 SES API로 보내는 부분

먼저 첫 번째로 Event로 들어온 정보를 파싱 하는 과정을 거치게 됩니다.(Line 46 - 49)

이 과정에서 사용자의 계정 이름 정보를 가져오게 됩니다.

 

두 번째로 go-password라는 library를 이용해 Password를 생성합니다.(Line 31 - 36)

이 library는 지정한 자릿수, 특수문자 개수, 숫자 갯수 등을 매개변수로 하여 Password를 생성하게 됩니다. 

 

세 번째로 파싱 한 사용자 계정 이름과 생성된 Password로 LoginProfile을 생성합니다. (Line 58 - 68)

이 과정에서는 Terraform으로 만든 User계정을 Enable 시키고 Password를 지정해줍니다. 그리고 옵션으로 최초 접속 시, 비밀번호를 재설정할 것인지, 안 할 것인지를 매개변수로 하여 API를 호출합니다.

 

마지막으로 생성된 계정 정보를 SES API를 이용하여 메일을 보내게 됩니다.(Line 70 - 99)

이 과정에서 앞서 User를 생성할 때, Email의 형태로 만들지 않았다면 Line 79의 ToAddress에 도메인과 사용자 계정을 합쳐서 적어줘야 합니다.

그리고 원하는 Title과 Content를 적어 SES API를 호출하면 메일이 보내지게 됩니다.

 

이로서 AWS IAM으로 User를 만들게 되면 User에 대한 Password를 세팅함과 동시에 계정 활성화를 하면서 이를 사용자 계정 혹은 원하는 메일로 보내주는 자동화 과정을 함께 보셨습니다.

 

완벽히 이해가 되셨으면 좋겠습니다.

 

궁금한 부분은 댓글로 남겨주시면 답변해드리도록 하겠습니다.

잘 읽으셨다면 많은 공감과 구독 부탁드립니다!

 

Reference

Password Generation: https://pkg.go.dev/github.com/sethvargo/go-password/password

 

password package - github.com/sethvargo/go-password/password - pkg.go.dev

Package password provides a library for generating high-entropy random password strings via the crypto/rand package. res, err := Generate(64, 10, 10, false, false) if err != nil { log.Fatal(err) } log.Printf(res) Most functions are safe for concurrent use.

pkg.go.dev

Request Production Access: https://docs.aws.amazon.com/ko_kr/ses/latest/dg/request-production-access.html

 

Amazon SES 샌드박스 환경에서 나가기 - Amazon Simple Email Service

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

Serverless Framework: https://www.serverless.com/framework/docs/getting-started

 

Serverless Getting Started Guide

The Serverless Framework documentation for AWS Lambda, API Gateway, EventBridge, DynamoDB and much more.

www.serverless.com

Serverless Resource: https://www.serverless.com/framework/docs/providers/aws/guide/resources

 

Serverless Framework - AWS Lambda Guide - AWS Infrastructure Resources

The Serverless Framework documentation for AWS Lambda, API Gateway, EventBridge, DynamoDB and much more.

www.serverless.com

Serverless EventBridge: https://www.serverless.com/blog/eventbridge-use-cases-and-tutorial/

 

EventBridge Use Cases and Examples

AWS recently announced the EventBridge offering which helps developers build universal, reliable and fully event-driven applications. Come see how to use it with Serverless Framework

www.serverless.com

Send Mail using AWS SDK: https://docs.aws.amazon.com/ko_kr/ses/latest/dg/send-an-email-using-sdk-programmatically.html

 

AWS SDK를 사용하여 Amazon SES를 통해 이메일 전송 - Amazon Simple Email Service

프로그램을 실행할 때 "cURL error 60: SSL certificate problem" 오류가 발생하면 AWS SDK for PHP 설명서의 설명에 따라 최신 CA 번들을 다운로드합니다. 그런 다음 amazon-ses-sample.php에서 SesClient::factory 어레이에

docs.aws.amazon.com