IaaS/퍼블릭클라우드

(AWS) Lambda 에 대해서

armyost 2022. 2. 7. 21:52
728x90

Lambda 함수란 

 

Lambda 함수 실행을 위한 Trigger

 

함수를 호출할 때 동기식으로 호출할 것인지 비동기식으로 호출할 것인지 선택할 수 있습니다. 동기식 호출의 경우 함수가 이벤트를 처리하여 응답을 반환하기를 기다립니다. 비동기식 호출의 경우, Lambda는 처리를 위해 이벤트를 대기열에 저장하고 즉시 응답을 반환합니다. 비동기식 호출의 경우 Lambda는 재시도를 처리하고, 호출 레코드를 대상에 보낼 수 있습니다.

 

함수를 동기식으로 호출하는 경우 Lambda는 함수를 실행하고 응답을 기다립니다. 함수가 완료되면 Lambda는 호출된 함수의 버전과 같은 추가 데이터가 포함된 응답을 함수의 코드에서 반환합니다.

 

Amazon Simple Storage Service(Amazon S3), Amazon Simple Notification Service(Amazon SNS)와 같은 여러 AWS 서비스가 함수를 비동기적으로 호출하여 이벤트를 처리합니다. 비동기적으로 함수를 호출하면 함수 코드에서 응답을 기다리지 않습니다. 이벤트를 Lambda에 전달하면 Lambda가 나머지를 처리합니다. Lambda가 오류를 처리하는 방법을 구성하고, 호출 레코드를 다운스트림 리소스로 전송하여 애플리케이션의 구성 요소를 함께 연결할 수 있습니다.

 

Lambda가 이벤트를 읽는(Trigger로 사용가능한) 서비스는 다음과 같다.

  • Amazon DynamoDB : DynamoDB 테이블이 업데이트될 때마다
  • Amazon Kinesis : 데이터 스트림에서 레코드를 읽고 스트림 레코드를 포함한 이벤트와 동기적으로 함수를 호출
  • Amazon MQ : 브로커로부터 메시지를 읽고 함수를 동기식으로 호출
  • Amazon Managed Streaming for Apache Kafka : 새 메시지를 내부적으로 폴링한 다음 대상 함수를 동기적으로 호출
  • 자체 관리형 Apache Kafka : 새 메시지를 내부적으로 폴링한 다음 대상 함수를 동기적으로 호출
  • Amazon Simple Queue Service : 대기열을 폴링하고 대기열 메시지를 포함한 이벤트와 동기적으로 함수를 호출
  • API Gateway
  • AWS Iot
  • Alexa
  • Application LoadBalancer
  • CloudWatch Events
  • CloudWatch Logs
  • CodeCommit
  • S3
  • SNS

 

Lambda 함수 환경변수 사용법

환경변수 사용하기 

1. [Lambda] 콘솔의 [함수] 페이지를 엽니다.
2. 작업할 함수를 선택합니다.
3. 구성을 선택한 후 환경 변수를 선택합니다.
4. Environment variables(환경 변수)에서 편집을 선택합니다.
5. Add environment variable(환경 변수 추가)을 선택합니다.
6. 키와 값을 입력합니다.

  • 키는 문자로 시작되며 최소 2자입니다.
  • 키에는 문자, 숫자 및 밑줄(_)만 포함됩니다.
  • 키는 Lambda에 의해 예약되지 않습니다.
  • 모든 환경 변수의 총 크기는 4KB를 초과하지 않습니다.

7. 저장을 선택합니다.

8. Lambda 함수의 코드에서 다음과 같은 방법으로 호출할 수 있습니다.(Python기준)

import os
  region = os.environ['AWS_REGION']

참고문서

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/configuration-envvars.html

 

AWS Lambda 환경 변수 사용 - AWS Lambda

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

docs.aws.amazon.com

 

KMS 의 Key로 Encript하여 환경변수 보호

1. Lambda 콘솔의 [함수] 페이지를 엽니다.
2. 작업할 함수를 선택합니다.
3. 구성을 선택한 다음 왼쪽 탐색 모음에서 환경 변수를 선택합니다.
4. 환경 변수 섹션에서 편집을 선택합니다.
5. Encryption configuration(암호화 구성)을 확장합니다.
6. 전송 중 암호화에서 전송 중 암호화에 대해 도우미 사용을 선택합니다.
7. 콘솔 암호화 도우미를 사용할 각 환경 변수에 대해서는 환경 변수 옆의 암호화를 선택합니다.
8. 전송 중 암호화할 AWS KMS key에서, 이 절차를 시작할 때 생성한 고객 관리형 키를 선택합니다.
9. 실행 역할 정책을 선택하고 정책을 복사합니다. 이 정책은 환경 변수를 복호화할 수 있는 권한을 함수의 실행 역할에 부여합니다.
10. 이 정책을 저장하여 절차의 마지막 단계에서 사용합니다.
11. 환경 변수를 복호화하는 함수에 코드를 사용할 수 있습니다. 

import os
import base64

def decrypt_data_key():

        data_key_encrypted = os.environ['AWS_PASSWORD']
        # Decrypt the data key
        kms_client = boto3.client("kms")
        response = kms_client.decrypt(CiphertextBlob=data_key_encrypted)

        # Return plaintext base64-encoded binary data key
        return base64.b64encode((response["Plaintext"]))

 

SSM을 통한 환경변수 접근

import os, traceback, json, configparser, boto3
from aws_xray_sdk.core import patch_all
patch_all()

# Initialize boto3 client at global scope for connection reuse
client = boto3.client('ssm')
env = os.environ['ENV']
app_config_path = os.environ['APP_CONFIG_PATH']
full_config_path = '/' + env + '/' + app_config_path
# Initialize app at global scope for reuse across invocations
app = None

class MyApp:
    def __init__(self, config):
        """
        Construct new MyApp with configuration
        :param config: application configuration
        """
        self.config = config

    def get_config(self):
        return self.config

def load_config(ssm_parameter_path):
    """
    Load configparser from config stored in SSM Parameter Store
    :param ssm_parameter_path: Path to app config in SSM Parameter Store
    :return: ConfigParser holding loaded config
    """
    configuration = configparser.ConfigParser()
    try:
        # Get all parameters for this app
        param_details = client.get_parameters_by_path(
            Path=ssm_parameter_path,
            Recursive=False,
            WithDecryption=True
        )

        # Loop through the returned parameters and populate the ConfigParser
        if 'Parameters' in param_details and len(param_details.get('Parameters')) > 0:
            for param in param_details.get('Parameters'):
                param_path_array = param.get('Name').split("/")
                section_position = len(param_path_array) - 1
                section_name = param_path_array[section_position]
                config_values = json.loads(param.get('Value'))
                config_dict = {section_name: config_values}
                print("Found configuration: " + str(config_dict))
                configuration.read_dict(config_dict)

    except:
        print("Encountered an error loading config from SSM.")
        traceback.print_exc()
    finally:
        return configuration

def lambda_handler(event, context):
    global app
    # Initialize app if it doesn't yet exist
    if app is None:
        print("Loading config and creating new MyApp...")
        config = load_config(full_config_path)
        app = MyApp(config)

    return "MyApp config is " + str(app.get_config()._sections)

'IaaS > 퍼블릭클라우드' 카테고리의 다른 글

(AWS) SAM이란?  (0) 2022.02.15
(AWS) Lambda Alias란?  (0) 2022.02.15
(AWS) Elastic Beanstalk의 CI/CD에 대해서  (0) 2022.02.07
(AWS) Elastic Beanstalk란?  (0) 2022.02.07
(AWS) CloudFormation Stack Policy란?  (0) 2022.02.06