본문 바로가기

웹 운영/AWS

[CDA] 섹션 28 - 기타 서버리스 : Step Functions & AppSync & Amplify

728x90

<410 Step Functions 개요>

 

 

Step Function JSON 과 시각화의 예시

 

 

> workflow 를 State Machine 으로 모델링 할 수 있는 것 (1 state machine per workflow) 

>> 상품 주문 / 데이터 처리 / 앱 내 로직 처리 등 원하는 프로세스에 사용 가능

>> 어떤 조건에서, 어떤 일이 일어나는지, 그 뒤에 어떤 일이 일어나는지 등을 워크플로우로 정의하면 됨

>> Workflow 는 JSON 으로 정의하고, 이에 대한 시각화도 지원된다

 

> Workflow 의 각 단계 (ex: 람다 함수, ECS 내의 Task, DD에 데이터 삽입 등) 를 Step Function 이 Orchestration 해준다

> Workflow trigger 을 위해서는 SDK API, API Gateway, CW Event 등이 사용된다 

 

 

<Task States>

 

 

Task State 란 작업의 단위로, 여러가지 일을 할 수 있다

 

 

> 위그림에서 처럼 박스들이 표시되어 있는데, Step Function 은 이처럼 Task 로 구성된다

> State Machine 에서 특정 작업을 Invoke 하기 위해서 사용됨

>> ex: 람다 함수, Batch 작업, DD 작업, SNS/SQS, ECS Task 등등

 

> Activity 를 Run 할 수도 있다 (실행중인 활동?) (AWS 내의 SWF 라는 리소스와 유사하다고 함) 

>> ex :  EC2, ECS, On-premise  등

>> 대상 서버는 Step Function 으로 부터 작업을 가져와 작업을 수행하고 결과를 응답하는 그림 

>> 서버가 Step Function 으로 부터 작업을 가져오는 것이므로 훨씬 더 자유롭게 원하는 일을 수행 가능

 

 

<EX : 람다 호출 하는 Task>

 

 

람다 호출을 저의하는 Step Function 의 Task

 

 

> 위 JSON 의 유형은 Task 이며, 리소느는 Lambda 함수 호출이다

> 함수에 Payload 를 입력값으로 전달하는 모습 (trigger 시 stdin)

> 그 이후로는 NEXT_STATE (다음 상태로 넘어감) 하게 정의되어 있고, timeout 이 발생했는지 확인하도록 한다

 

 

<Step Function - States>

 

> Choice State - 특정 브랜치 (혹은 기본 브랜치) 로 보낼 조건을 테스트

> Fail / Succeed State - 성공 / 실패 일 경우 Step Function 을 중지

> Pass State - input 을 output 에게 단순히 전달 / 고정 data 주입 등을 수행 (어떤 작업을 하진 않음)

> Wait State - 특정 시간동안, 혹은 특정 시각/날짜 도달까지 Workflow 를 멈춘다

> Map State - Step 을 동적으로 반복(?)

> Parallel State - 브랜치의 수행을 병렬적으로 진행

> 알아야 할 내용 : 병렬 상태!! 가 중요!

 

 

단계적으로 진행되는 Step Function 을 보여줌. 전체가 하나의 State Machine (StateChart Diagram 으로 표현되는 머신)

 

 

> 예시인데, 다음과 같이 흐름을 볼 수 있다

>> JOB 이 완료되지 않으면 지속 X Second Wait 하는 걸 볼 수 있다

>> Job 이 완료되거나 Fail 하거나 Workflow 가 종료되는 것을 알 수 있다

> Step Function 은 전체적으로 행해져야 하는 일을 작업들을 (Task State) 조율하고, State Machine 이 어떻게 정의되어야 하는지 정의한다.

>> 그냥 람다로 다 때리면 되는거 아님? 싶겠지만 실습에서 왜 필요한지 조금 알게 된다고 함

 

 

--------------------------------------------

 

 

<411 Step Function 실습>

 

 

> Step Function 으로 이동하면 다이어그램과, Design, 그리고 이에 대한 코드 (ASL) 즉, JSON 문서를 확인할 수 있다

> 예시로, 다음과 같은 구문을 확인해볼 수 있다

 

"States": {
  ...
  "Hello World Ex":{
    "Comment" : "이 state 에 대한 설명",
    "Type": "Choice",
    "Choices" : [
      {
        "Variable": "$.IsHelloWorldEx",
        "BooleanEquals": true,
        "Next": "Yes" // Yes State 으로 이동 (State 의 이름임)
      },
      {
        "Variable": "$.IsHelloWorldEx",
        "BooleanEquals": false,
        "Next": "No" //No state 으로 이동
      },
    ],
    ...
    "Yes": {
      "Type": "Pass",
      ...

 

> 이 구문에 해당하는 다이어그램은 다음과 같다

 

위 예시 코드에 대한 다이어그램

 

> 특정 변수가 True, False 를 확인해서 다음 State 로 이동

> 어쨌든 이렇게 Step Function 을 만들 수 있고, 이에 대해 Start Execution 을 할 때 input variable 들을 전달할 수 있다

>> 가령, 위 예시 실행시, stdin 변수로 "IsHelloWorldEx":false 인 JSON 문서를 전달했다면, False 로 인해 No State 로 이동시키고 Failure 을 발생시켰을 것이다.

 

 

--------------------------------------------

 

 

<412 Step Function Invoke Lambda 실습 >

 

 

Step Function 으로 구성해보는 모습

 

 

> 새로운 Step Function 을 생성하면 좌측에 있는 UI 들을 끌어와 Lambda Invoke 등을 만들어 볼 수 있다.

> 위 그림은 강사의 제공 JSON 을 붙여넣은 것

> 람다 함수를 넣으면, 우측에서 바로 람다 Invoke 를 구성할 수 있다 (람다 함수 선택) 

 

> 위 예제는 람다 함수는 who 라는 variable 을 받아서 콘솔에 출력한다 (딱히 람다가 하는 일은 없 ㅋㅋ 걍 출력)

> 그리고 람다의 출력에 대하여 "Stephane" 을 포함하는 값인 경우 Pass State 으로 이동하고, 아닐 겨우 Fail State 으로 이동하는 Workflow 이다

>> Lambda Invoke 는 따로 구성을 해주는데, 이 때 JSON 으로 보면 function name 은 비워져 있으므로, 만든 람다 함수의 ARN 을 붙여넣는다. 

 

> 하다보면 State Machine 이 또 Lambda 를 호출하며, X-Ray 를 사용하므로 IAM Role 이 필요하다고 한다

>> 생성한다고 확인 버튼 뜨면 생성해주면 자동으로 필요한 권한들을 묶은 Role 을 만들어서 엮어준다.

 

> Execute 하고 input variable 을 "Stepahne Marrek" 으로 넣어주면, Pass State 으로 이동하게 되는걸 볼 수 있다. (그 외는 Fail State 로 이동한다) 

 

> 뭔가 좀 큰 단위의 람다..? ㅋㅋㅋㅋㅋㅋ 어떤 람다보다 거대한 수행동작을 할 때 하는 일인듯!

> Input 과 output 들을 가지고 한 체계를 동작시키는.. (어떻게 보면 미니 App 같은..?!)

> UI 로 에어플로우 하는 느낌?

> 결과가 나오면, Execution 이 어떤 State 들을 따라서 이동했는지 Graph View 로 볼 수 있다

 

 

--------------------------------------------

 

 

<413 Step Function 오류 처리 >

 

 

> Task State 를 실행하다 발생할 수 있다다

>> ex : 정의가 잘못됨, Task 실패 (람다함수에서 예외발생 - 이 때, 람다에서 잡으면 Step Function 에선 별 신경 안씀)

 

> Step Function 은 Retry / Catch 로 잡을 수 있다. 이 때, 인 앱과 같이 리소스 내에서가 아니라, State Machine 자체에서 잡아야 한다

> 앱은 단순할 수록 좋기 때문, 또한, Retry / Catch 이력 및 실행 기록을 Step Function 에서 관리

 

> Predefined Error Code

>> States.ALL :  어떤 에러 이름과도 catch

>> States.Timeout : 태스크가 설정된 시간초과 초보다 길게 실행됨 or 활동으로부터 아무 신호도 못받음 (no heartbeat received) 

>> States.TaskFailed : 태스크가 실행도중 실패

>> States.Permission : 태스크나 코드를 실행할 권한 불충분

> State 가 자체적으로 output 하는 error 들도 Step Function 에서 캐치 가능

 

 

< Retry 블록 > 

 

 

Retry 명세의 예시

 

 

> 위 그림처럼 Retry 가 필요한 상황일 경우를 명세해서 Error Type 에 대한 define 이 가능

>> Retry 하는 작업 횟수, 간격 드을 명시

>> 즉, TaskFailed 일 경우 30초 뒤에 한번 더 실행한다 이런것

>> BackoffRate 는 multiple 해서 지수 백오프를 구현하기 위함. 따라서 *2 를 해서 총 두번 이니까, 30초 뒤에 한번, 또 실패하면 60초 뒤에 한번, 이렇게 실행하는 것

 

> Max Attempt 가 도달하면, Catch 블록이 실행된다 (Retry 가 없으면 Max Attempt 도 없으니, 바로 Catch 인듯?)

>> 원래 람다 함수에서는 Error Control 변경하려면 재배포 해야 했으나, 지금은 외부에서 제어를 하기 때문에 재배포할 필요가 없다는 장점도 있음 (문서 내에서 간단하게 변경 가능)

 

 

< Catch 블록 > 

 

 

Catch 블록 예시

 

 

> 똑같이 종류별 에러를 받을 수 있다

> Next 를 통해서 다음 State 를 어디로 보낼지 지정할 수 있다 (에러를 핸들링 하는 람다 따위로)

> RestulPath 란 것도 확인할 수 있는데, Next State 에 전달할 input 을 지정할 수 있다

>> 이 모든것들을 리소스, 인 앱 코드에서 하면 복잡도가 매우 올라가지만, 이를 Step Function (외부) 에서 함으로써 깔끔한 비즈니스 로직단을 유지할 수 있다

 

 

Catch 블럭 내 ResultPath 의 활용

 

 

> $.error 로 표시되어 있는데, 이는 input 값에 오류를 포함시켜준다

 

 

resultPath 는 결과에 값을 포함시킨다

 

 

> resultPath 로 error 를 input 에 넣어주라고 할 수 있다. 전달 Message JSON 에 error message 자체가 전달된다~!

> 다음 State 따위에서 에러를 확인하거나 할 용도로 사용 가능 (이를 분석, 이메일 등 디버깅에 활용하기 위해 전달)

>> 걍 exception 뒤로 던질 때 내용 던지는거임 ㅋㅋ

 

 

--------------------------------------------

 

 

< 414 Step Function 오류 처리 실습 >

 

 

> step-function-error 블루프린트로 람다를 만들 수 있다 (오류를 발생시킴)

> 새로운 state machine 을 만든다. 다음 JSON 을 추가

 

... 
"States": {
      "InvokeMyFunction": {
        "Type": "Task",
        "Resource": "<enter resource ARN here>",
        "Retry": [
          {
            "ErrorEquals": [
              "CustomError"
            ],
            "IntervalSeconds": 1,
            "MaxAttempts": 2,
            "BackoffRate": 2
          },
          {
            "ErrorEquals": [
              "States.TaskFailed"
            ],
            "IntervalSeconds": 30,
            "MaxAttempts": 2,
            "BackoffRate": 2
          },
          {
            "ErrorEquals": [
              "States.ALL"
            ],
            "IntervalSeconds": 5,
            "MaxAttempts": 5,
            "BackoffRate": 2
          }
        ],
        "Catch": [
          {
            "ErrorEquals": [
              "CustomError"
            ],
            "Next": "CustomErrorFallback"
          },
          {
            "ErrorEquals": [
              "States.TaskFailed"
            ],
            "Next": "ReservedTypeFallback"
          },
          {
            "ErrorEquals": [
              "States.ALL"
            ],
            "Next": "CatchAllFallback"
          }
        ],
        "End": true
      },
      "CustomErrorFallback": {
        "Type": "Pass",
        "Result": "This is a fallback from a custom lambda function exception",
        "End": true
      },
      "ReservedTypeFallback": {
        "Type": "Pass",
        "Result": "This is a fallback from a reserved error code",
        "End": true
      },
      "CatchAllFallback": {
        "Type": "Pass",
        "Result": "This is a fallback from a reserved error code",
        "End": true
      }
    }

 

 

> 위에서 만든 람다의 ARN 을 입력

> 추가하면 다음과 같은 형태로 State Machine 이 형성된다

 

 

JSON 대로 추가된 States

 

 

> 에러 형태를 그냥 String 으로 확인하는 듯? 아까 람다에서 던진 에러가 CustomError 라는 객체를 던진다 (throw new CustomError)

> CustomError 객체 안에는 name = 'CustomError' 이고 errmsg 가 담겨 있음 (그냥 객체를 throw 로 전달, return 이 아니라)

 

> 위 statemachine json 에서 보면 이 CustomError 일 경우, 1초 뒤에 1번 재시도, 그 뒤로 2초 뒤에 한 번 재시도이다. 또한, Catch 도 있음

>> Catch 가 발생하면 CustomErrorFallback State 로 이동한다

 

> execute 하니까 람다함수가 당연히 CustomError 을 발생시키고, retry 블록으로 인해 재시도를 수행한다. 재시도를 두번 수행한다

>> 그 이후로 태스크가 종료되었고, CustomErrorFallback State 로 잘 이동한다

>> 즉, 생각한대로 이동함!

 

> 그 다음에는 Lambda 로 이동해서 CustomError 의 이름을 'Not Custom Error' 로 바꾼다!

>> 그 다음에 또 exceution 을 실행하면, 이번에는 CustomError 가 아니므로, ReservedTypeFallback 로 이동한걸 알 수 있다

>> TaskFailed 이기 때문 (람다가 그냥 실패함).

>> 둘 이외의 다른 종류의 에러는 CatchAllFallback 이 되는 것임을 위 JSON 을 보면 쉽게 확인할 수 있다

 

 

--------------------------------------------

 

 

<415 Wait For Task Token - 작업 토큰 대기>

 

 

> Step Function 이 Task 를 수행하는 중간에 멈출 수 있도록 한다 (Token 이 반환되는 것을 대기) 

>> Task 내에서 다른 AWS 서비스의 작업, 사용자 승인, 3rd Party Integration, 타 시스템 호출 등등을 진행하느라 Wait 할 수도 있기 때문

 

> JSON 에서 Task 내의 Resource 필드에 .waitForTaskToken 을 추가한다

> 그러면 StepFunction 이 대기가 필요한걸 알고, SendTaskSuccess / SendTaskFailure API 호출로 인한 Task Token 을 반환받도록 대기한다 (서버 처럼 호출을 기다림)

 

 

Resource 필드 맨 뒤에 .waitForTaskToken 을 추가해서 Step Function 에게 Wait Token 작업이 있음을 알려줌

 

 

> 가령, 위 그림처럼 [Check Credit] 하는 Task 는 타 서비스에 의존함

> 1. Task Token 이 포함된 SQS 에 Message 를 입력한다

> 2. 이 때 Message 내부에는 Resource 명에 .waitForToken 이 추가되어 있고, MessageBody 에는 위 그림과 같은 내용들이 포함되어 있다 (수신하는 Processor 가 StepFunction 에게 응답을 줄 때 필요한 토큰을 전달하는 것)

> 3. 타 작업을 수행하는 곳에서 SQS 에서 Poll Message 를 한다

> 4. 작업을 수행하면 SendTaskSuccess/Fail API 를 호출한다 - 처리 결과 및 아까 2번에서 받았던 TaskToken 을 그대로 실어서 전달

> 5. StepFunction 은 Wait 이 종료됨을 인지하고 후속을 진행한다

>> 장점: Step Function 자체도 필요에 따라 외부 서비스에 의존하는 작업을 수행할 수 있다는 점 (외부 메커니즘과의 통합 가능)

 

 

--------------------------------------------

 

 

<416 Activity Tasks - 활동 작업>

 

 

Activity Worker 는 다른 곳에 붙어서 Task 를 불러들인다

 

 

> Activity Worker : Step Function 에서 작업을 수행하는 구성 요소 (EC2, 람다, 모바일 기기 등에서 실행될 수 있음)

>> Activity Worker 를 사용해서 Task 를 수행시킬 수 있는 것

> GetActivityTask API 를 사용해서 Task 를 poll 한다 (실행되면서 주기적으로 Polling 실시)

> ActivityWorker 가 일을 마치면, SendTaskSuccess/Failure API 를 사용해서 응답을 보낸다 

> Polling 을 할 때, 위에서 배운 것과 마찬가지로 해야할 일 (input) 과 Task Token (완료 후 응답 때 사용) 을 준다

 

> Activity Task 의 Point 는 수행할 Work 들을 (Task들) Polling 한다는 점이다

> WaitForTask 를 사용한 Callback Pattern 같은 경우는 StepFunction 이 Task 를 SQS 에 Push 를 하는 Push Mechanism 이다

>> 사실 일하는 놈의 입장에선 둘다 Polling 이긴 한데, Step Function 입장에서 보는 듯? 그리고 Activity Task 도 어쨌든 Worker 가 저쪽에 있으니까?

 

> Task Active 를 제어하는 변수들

>> TimeoutSeconds :: Failure 로 Task 를 취급하기 전에 어느정도 기다릴 수 있는지

>> Activity Worker 가 주기적으로 SendTaskHeartBeat API 를 사용해서 신호를 보낸다. 그리고 설정한 주기 이내에 Heartbeat 가 계속 들어온다면 Task 를 계속 ACTIVE 취급 (이 최대 대기 시간은 HeartBeatSeconds 로, StepFunction 구성시 설정) 

> 모든 것을 고려해도 Activity Task 의 최대 대기 시간은 1년이다. 

 

 

--------------------------------------------

 

 

<417 Step Function - Standard VS Express>

 

 

Step Function Workflow 를 수행하는 두가지 방식과 그 특징들

 

 

> Step Function 의 Workflow 를 수행시키는 방법은 두가지, Standard(default) 랑 Express 가 있다

> Express 에서는 비동기 / 동기 방식이 또 있다

 

> 기본

>> 최대 수행시간은 1년이고, Workflow 를 정확히 1회 수행, 초당 약 2000개의 표준 워크플로 실행 가능

>> 90일동안 기록이 보관. CW 를 사용해서 더 많은 로그를 보존 / 보관할 수 있다

>> 비용은 State Transition 이 발생하는 횟수대로 과금 (execution 횟수 아님!!)

>> Use Case : Idempotent 하지 않는 작업 (결과가 동일하지 않은?) 걍 일반 작업 아님?

 

> Express

>> 최대 수행시간은 5분, 매우 빠른 속도와 높은 용량, 초당 10만회 이상의 Executino 수행 가능

>> 추적 기능 없고 CW Log 를 사용해서만 가능

>> 비용은 실행 횟수, 기간, 메모리 사용량에 따라 과금

>> Use Case : IoT 데이터 처리, Streaming 등 매우 빠른 수행을 요구하는 거인듯?

 

> Express - Asynchronous

>> At-least Once 실행 모델

>> 결과를 딱히 기다리진 않음 (제대로 실행되었는지, 결과는 뭐였는지는 CW Log 에서 결과 확인

>> ex : Message 보내기 (성공 여부는 딱히 기다리지 않고 일단 보낸다)

>> 최소 1회 모델 = 오류 발생시 SF 에서 자동 재시도를 할 수 있음 ==> 즉 동일한 작업이 두 번 실행될 가능성 존재 :: idempotence 를 관리(?) 해서 두번 동작한다고 두배의 처리가 되지 않아야 한다

 

> Express - Synchronous

>> At-most Once 실행 모델 (최대 1회) 

>> 말 그대로 Workflow 가 완료되는 것을 대기, 응답을 수신

>> Workflow 자체로부터 즉각적인 응답이 필요한 것 ex) MSA 오케스트레이션시 모두 동작하는 것을 확인

>> 실패하더라도 SF 가 Workflow 를 재시동하지 않는다 = 기다리는 결과를 확인하고 재시도를 언제 할지 판단해서 사용자가 직접 구성해야함

 

 

--------------------------------------------

 

 

<418 App Sync>

 

 

> AppSync 는 GraphQL 을 사용하는 관리형 서비스이다

> GraphQL

>> 앱이 원하는 데이터를 쉽고 정확하게 찾을 수 있도록 도와주는 쿼리 언어.(API 의 새로운 형태)

>> 하나 이상 소스의 데이터를 Combine 해서 그래프로 만들 수 있다(?)

>>> GraphQL 데이터 소스는 NOSQL 데이터 저장소, RDB, HTTP API 등을 결합한다

 

> AppSync 의 GraphQL 은 Aurora, DD, ElasticSearch 등 다른 소스들과 통합된다. 또한, 원한다면 어떤 AWS 리소스로부터 데이터를 받아올 수 있는데 (Custom Source), 이 때 람다를 사용하면 된다

> AppSync 의 또다른 포인트는, WebSocket / WebSocket 의 MQTT 로 실시간 데이터 수신을 지원한다는 점이다

> (시험에 나올 수 있음) 모바일 앱에서, local data 에 접근하고 data synchronization (동기화) 를 하고 싶을 때, App Sync 는 이전에 나왔던(?) Congito Sync 란 오래된 서비스를 대체한다

 

 

AppSync 의 GraphQL 이 동작하는 방식에 대해 소개한다

 

 

> AppSync 를 사용하기 위해선 좌측 그림처럼 GraphQL 스키마를 업로드 해야한다

> Client 단에서는 GraphQL query 를 사용하려고 함 (우측 상단)

> AppSync 는 자신이 가지고 있는 Resolver 들을 사용하여 데이터를 찾는다. 리졸버 중 하나는 DD 가 될 수도 있는 것

> AppSync 는 데이터를 클라이언트에게 요청한 쿼리를 정확하게 응답 JSON 으로 만들 수 있어서 그 응답을 전달한다

>> 당연히 시험에서는 스키마, 쿼리 작성법 등에 대해 알 필요 없음 (위처럼 개략적인 모습)

 

 

AppSync 를 사용하는 대상과 GraphQL 이 사용하는 Resolver 는 여러 형태가 될 수 있다

 

 

> AppSync 의 중심에는 GraphQL Schema 가 있고, 데이터를 가져오는 법을 알려주는 Resolver 가 있음

> Resolver 는 direct integration 을 여러 대상과 할 수 있는데, 우측 모습들이다.

> AppSync 에서 일어나는 일은 CW 를 통해 확인 가능 

 

 

<Security>

 

> Client (application) 에게 AppSync의 GraphQL API 와 소통할 수 있도록 권한을 주는 4가지 방법

>> API_KEY : API Gateway 에서 했던 것처럼 키를 만들고 유저에게 줌

>> AWS_IAM : IAM User/ Role / Cross-Account access 등을 연계하여 API 접근에 허용

>> OpenID_CONNECT (OIDC) : OIDC 공급자와 JWT 웹토큰을 통합하여 제공

>> Amazon_Cognito_UserPool : CUP 로 생성한 기존 사용자 풀과 integrate 하여 제공 / 이를 통해 다른 소셜 로그인 제공자들과도 연계 가능

 

>> HTTPS 를 원한다면, AppSYNC 앞에 CloudFront 를 사용하는 것을 권장!

 

 

--------------------------------------------

 

 

<419 App Sync 실습 / 개요>

 

 

> API 선택 : Merged API 는 GraphQL API 들을 조합한 API 로 훨씬 복잡함. 다루지 않음

> GraphQL Resource 를 선택하는데, DD 로 구성되는 resource 를 만들 수 있음

>> 바로 DD 를 만들게 됨, 생성한 뒤에 구성으로 이동 (실제 DD 를 가보면 생성되어 있음)

 

> Schema

>> DD 를 생성함으로써 기본적으로 구성된 스키마를 확인할 수 있음 (GraphQL 지식 영역)

>> AppSync -> GraphQL API를 활용해서 이 DD 와 연계해서 외부에 제공

 

> Queries : 이 GraphQL API 를 사용해볼 수 있는 곳

>> 샘플로 제시된 RUN 할 수 있는 것은 createStudent 와 listStudent 이다

>> createStudent mutation (함수API) 를 실행해보려고 하는데, 하단에 Query Variable 을 JSON 형태로 되어 있다. 이걸 input 으로 함수에 넣는 것인 듯 (Student 필드에 맞게 name, age 등이 JSON 으로 값을 기재함) 

>> 여러개 만들고 list 해보면 다 확인되는 것을 알 수 있음

 

> 캐싱 설정 가능, GraphQL End Point, API ID 등등도 확인 가능

> 인증도 관리 가능 : API 키로 설정 및 관리 가능, CUP 로 설정 가능, IAM or OIDC 등으로도 설정 가능

 

> Metric 영역으로 모니터링도 가능하다

 

 

--------------------------------------------

 

 

<420 AWS Amplify>

 

 

> Amplify 는 Mobile & Web Application 을 만들 수 있도록 도와주는 리소스

> Amplify Studio : 프론트 / 백 모두 앱을 시각적으로 구축할 수 있도록 도와줌

> Amplify CLI : Studio 랑 똑같은데 CLI 로 하는거

> ~ Libraries : Cognito, S3 등 AWS 서비스에 앱을 연결하도록 도와줌 

> ~ Hosting : AWS 에 배포하는걸 도움

 

 

<Amplify Studio & CLI>

 

 

Amplify Studio 와 CLI 는 모바일 & 웹 앱 구축을 돕는다

 

 

> 모바일 & 웹 앱을 생성하기 위해 지원되는 도구 모음집

> mobile & web app 을 위한 EBS 라 생각

> init 을 통해 Amplify 앱을 초기 구성할 수 있다

 

> AWS 서비스를 사용한 Data Storage, Authentication, Storage, ML 등의 기능을 지원한다

>> 백엔드의 경우 DD, AppSync, Cognito, S3 등을 사용해서 지원함

>> 프런트 라이브러리의 경우 React, Vue, JS, IOS, Android Flutter 등을 바로 연계해서 사용할 수 있도록 지원한다

>> 안전성 / 보안 / 확장성을 보장함

>> CLI, Studio 등을 통해서 Build & Deploy 가 가능하다

 

 

<시험에 나올 수 있는 Amplify 의 주요 기능>

 

> Authentication : 별도의 설치 없이 즉시 사용 가능한 인증 기능 제공

>> Amazon Cognito 를 사용하여 registration, authentication, account recovery 등의 동작을 지원

>> MFA, Social Login 등을 지원

>> Pre-build UI Component 를 제공하여, 프런트 엔드에서 이를 사용 & Cognito 와 integrate 하기에 매우 용이

>> 세부적인 권한 관리가 가능 (fine-grained Authorization)

 

> Data Store : 저장소에 대한 API 로는 AppSync, 저장소 자체로는 DD 를 사용한다

>> 개발시 로컬 데이터로 개발 작업을 하면, Cloud 와 자동으로 동기화를 해줘서 저장소와 연계가 됨 (자동화, 복잡코드 X)

>> 전체적으로는 GraphQL & AppSync 로 동작

>> Amplify Studio 와 연계하여 데이터 모델링 시각화 작업도 가능

 

 

<Amplify Hosting>

 

 

Amplify 를 사용해 Hosting , 배포 등을 구성할 수 있다

 

 

> 최신 웹 앱을 Build & Host 가능, 빌드 테스트 배포와 같은 CI/CD 프로세싱 가능

> PR 미리보기, 사용자 지정 도메인, 모니터링 수행 가능

> Redirection & Custom Header 적용 가능, 암호화 가능 등등

>> Netlify & Vercel 과 같은 서비스들과 비슷함

 

> 코드를 저장소로부터 가져옴

>> CI CD 를 통해 Front End Build 하고 CF 같은 곳에 배포

>> 백엔드 CI CD 를 통해 Amplify 로 배포를 함

 

 

<Amplify 를 활용한 E2E Testing>

 

 

 

 

> Unit Test & E2E Test 가 가능

> "Test Phase" 에서 E2E Test 를 수행할 수 있다 (뭔 소린지 잘 모르겠음)

>> 목적 : Code 를 production 하기 전에 Regression 을 Catch 하는 것

>> 원하는대로 amplify.yml 을 통해 test step 을 구성하여 정의한다

>>  그리고 Cypress Test Framework 을 통해서 E2E 테스트를 생성할 수 있다 (이걸 사용하면 UI Report 를 제공해주고, 웹에서도 제어 가능? 뭐 그렇대)

 

<중요한 점 요약>

 

> 앱을 빌드하는 단계에서 단위 테스트를 실시 (코드가 해야할 일을 잘 수행하는지 확인) 

> 앱을 배포할 때는 (staging) E2E 테스트를 Cypress 와 같은 도구를 사용해서 테스트 하는데, 앱이 예상대로 작동하는지 확인

 

 

--------------------------------------------

 

 

<421 AWS Amplify 실습>

 

 

> Amplify 로 가서 Build app 하면 Amplify Sutdio 를 통해 구성하기 시작 (CLI 를 통해서 할 수도 있음)

> Hosting Env 를 통해서 코드 저장소 or 로컬로 Web Hosting 을 할 수 있다

> BackEnd Env 를 통해서 백엔드 앱을 구성하는 Studio 로 이동할 수 있다 (Staging Environment) 

>> 백엔드 구성을 통해 여러가지 리소스들과 Integrate 가능하다

 

> Content 관리 >> App Data Modeling 이 가능함, DD 와 직통으로 연계된다 (실제 DD 를 생성함)

> 이런거 하다가 CF 로 이동해보면, Amplify 의 동작은 CF 가 동작시킨다는 것을 확인할 수 있음

>> 이동해보면 Content 만든 이후로 Amplify Stack 들이 많이 생김. 그 중 하나에서 Event 를 보면 DD 생성 뭐 이런것도 확인할 수 있다

>> 참고로 생성된 DD 를 보면 내가 만들고자 한 Table 과 AmplifyDataStore 라는 Table 도 Amplify 와 연계하는 Metadata 들을 저장하기 위해 자동으로 생성되어 있음 

 

> DD 를 생성하면 AppSYNC 도 생성되었음을 확인할 수 있다

> 아까처럼 Schema 로 이동하면 내가 모델링한 DD 에 대한 Schema API 를 제공하고 있음을 볼 수 있다

> 이렇게 간단히 UI 로 모델링 하면 뒷단에서 DB 와 API 를 자동으로 생성해준다 -> 진짜 빠르게 앱을 개발할 수 있음

 

> User Management 로 이동하면 당연히 Cognito 와 연계해서 인증을 확인할 수 있다 (바로 쉽게 생성 or 기존 Cognito 연계 가능)

>> Email Login, MFA, 회원가입시 추가할 정보, 등등을 간단히 할 수 있다

>> 이렇게 쉽게 인증/가입 방식을 구성하면, CF 는 뒷단에서 Cognito 를 구성해서 제공해준다 

>> AWS 뒷단에 CF 라는 리소스가 얼마나 강력한지 느끼게 됨

 

> 이처럼 Storage 를 구성하면 AWS 는 S3 를 사용해서 구성해준다 (당연히 CF 로 구성) 

> 그 밖에 여러가지 리소스들을 사용하는 것들을 할 수 있음

> 또한 UI Library 도 활용할 수 있다

 

 

--------------------------------------------

 

 

<퀴즈>

 

 

>

>

 

 

 

 

====================================================================================

 

 

교육 출처

 

- AWS Certified Developer Associate 시험 대비 강의 - Udemy

 

https://www.udemy.com/share/105Hxw3@z0Wqme5D9voly52i8MuQYl_c8462GP25Oul4H38G3nVfgD4fMrYPJE5LOB88iDuZ/

728x90