Lambda 콘솔에서 지속적 전달을 사용하는 애플리케이션 생성 - AWS Lambda

Lambda 콘솔에서 지속적 전달을 사용하는 애플리케이션 생성

Lambda 콘솔을 사용하여 지속적 전달 파이프라인이 통합된 애플리케이션을 만들 수 있습니다. 지속적 전달을 사용하면 소스 제어 리포지토리로 푸시하는 모든 변경 사항이 자동으로 애플리케이션을 빌드하고 배포하는 파이프라인을 트리거합니다. Lambda 콘솔은 지원 리소스를 만드는 Node.js 샘플 코드 및 템플릿을 사용하여 일반적인 애플리케이션 유형을 위한 시작 프로젝트를 제공합니다.

이 자습서에서는 다음 리소스를 생성합니다.

  • 애플리케이션 – Node.js Lambda 함수, 빌드 사양 및 AWS Serverless Application Model(AWS SAM) 템플릿.

  • 파이프라인 – 지속적 전달을 사용하기 위해 다른 리소스를 연결하는 AWS CodePipeline 파이프라인입니다.

  • 리포지토리 – AWS CodeCommit의 Git 리포지토리. 변경 사항을 푸시하면 파이프라인이 소스 코드를 Amazon S3 버킷으로 복사하고 빌드 프로젝트에 전달합니다.

  • 트리거 – 리포지토리의 기본 분기를 감시하고 파이프라인을 트리거하는 Amazon EventBridge(CloudWatch Events) 규칙입니다.

  • 빌드 프로젝트 – 파이프라인으로부터 소스 코드를 받아 애플리케이션을 패키징하는 AWS CodeBuild 빌드입니다. 소스에는 빌드 사양과 함께 종속 항목을 설치하고 배포용 애플리케이션 템플릿을 준비하는 명령이 들어 있습니다.

  • 배포 구성 – 파이프라인의 배포 단계에서는 빌드 출력에서 처리된 AWS SAM 템플릿을 가져와 AWS CloudFormation으로 새 버전을 배포하는 일련의 작업을 정의합니다.

  • 버킷 – 배포 아티팩트 스토리지용 Amazon Simple Storage Service(Amazon S3) 버킷입니다.

  • 역할 – 파이프라인의 소스, 빌드 및 배포 단계에는 AWS 리소스를 관리할 수 있는 IAM 역할이 있습니다. 애플리케이션의 함수에는 로그를 업로드하고 다른 서비스에 액세스하도록 확장할 수 있는 실행 역할이 있습니다.

애플리케이션 및 파이프라인 리소스는 사용자 정의 및 확장할 수 있는 AWS CloudFormation 템플릿에서 정의됩니다. 애플리케이션 리포지토리에는 Amazon DynamoDB 테이블, Amazon API Gateway API 및 기타 애플리케이션 리소스를 추가하기 위해 수정할 수 있는 템플릿이 포함되어 있습니다. 지속적 전달 파이프 라인은 소스 제어 외부의 별도 템플릿에서 정의되며 자체 스택을 가지고 있습니다.

파이프라인은 리포지토리의 한 브랜치를 한 애플리케이션 스택에 매핑합니다. 동일한 리포지토리에 다른 브랜치를 위한 환경을 추가하기 위해 추가 파이프라인을 생성할 수 있습니다. 파이프라인에 테스트, 스테이징, 수동 승인을 위한 단계를 추가할 수도 있습니다. AWS CodePipeline에 대한 자세한 정보는 AWS CodePipeline란 무엇입니까?​를 참조하세요.

사전 조건

이 자습서에서는 사용자가 기본 Lambda 작업과 Lambda 콘솔에 대해 어느 정도 알고 있다고 가정합니다. 그렇지 않은 경우 콘솔로 Lambda 함수 생성의 지침에 따라 첫 Lambda 함수를 생성합니다.

다음 단계를 완료하려면 명령을 실행할 명령줄 터미널 또는 셸이 필요합니다. 명령과 예상 결과는 별도의 블록에 나열됩니다.

aws --version

다음 결과가 표시됩니다.

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

긴 명령의 경우 이스케이프 문자(\)를 사용하여 명령을 여러 행으로 분할합니다.

Linux 및 macOS는 선호 셸과 패키지 관리자를 사용합니다. Windows 10에서 Linux용 Windows Subsystem을 설치하여 Ubuntu와 Bash의 Windows 통합 버전을 가져옵니다.

이 자습서에서는 소스 제어를 위해 CodeCommit을 사용합니다. 로컬 컴퓨터가 애플리케이션 코드를 액세스 및 업데이트하도록 설정하려면 AWS CodeCommit 사용 설명서설정을 참조하세요.

애플리케이션 생성

Lambda 콘솔에서 애플리케이션을 생성합니다. Lambda에서 애플리케이션은 Lambda 함수와 여러 지원 리소스가 있는 AWS CloudFormation 스택입니다. 이 자습서에서는 함수와 실행 역할이 있는 애플리케이션을 생성합니다.

애플리케이션을 생성하려면

  1. Lambda 콘솔 애플리케이션 페이지를 엽니다.

  2. Create application을 선택합니다.

  3. [새로 작성(Author from scratch)]을 선택합니다.

  4. 애플리케이션 설정을 구성합니다.

    • 애플리케이션 이름my-app.

    • 런타임Node.js 14.x.

    • 소스 제어 서비스CodeCommit.

    • 리포지토리 이름my-app-repo.

    • 권한역할 및 권한 경계를 생성합니다.

  5. 생성(Create)을 선택합니다.

Lambda는 파이프라인 및 관련 리소스를 생성하고 샘플 애플리케이션 코드를 Git 리포지토리에 커밋합니다. 리소스가 생성되면 개요 페이지에 표시됩니다.


        배포 중 시작 애플리케이션 리소스.

인프라 스택에는 리포지토리, 빌드 프로젝트, 그리고 지속적 전달 파이프라인을 형성하기 위해 결합되는 기타 리소스가 포함됩니다. 이 스택이 배포를 마치면 함수 및 실행 역할이 포함된 애플리케이션 스택을 배포합니다. 이는 리소스 아래 표시되는 애플리케이션 리소스입니다.

함수 호출

배포 프로세스가 완료되면 Lambda 콘솔에서 함수를 호출합니다.

애플리케이션의 함수를 호출하려면

  1. Lambda 콘솔 애플리케이션 페이지를 엽니다.

  2. my-app을 선택합니다.

  3. 리소스에서 helloFromLambdaFunction을 선택합니다.

  4. 테스트(Test)를 선택합니다.

  5. 테스트 이벤트를 구성합니다.

    • 이벤트 이름event

    • 본문{}

  6. 생성(Create)을 선택합니다.

  7. 테스트(Test)를 선택합니다.

Lambda 콘솔이 함수를 실행하고 결과를 표시합니다. 결과 아래의 세부 정보 섹션을 확장하여 출력 및 실행 세부 정보를 확인합니다.


        테스트 호출의 출력.

AWS 리소스 추가

이전 단계에서 Lambda 콘솔은 함수 코드, 템플릿 및 빌드 사양을 포함하는 Git 리포지토리를 만들었습니다. 템플릿을 수정하고 변경 사항을 저장소에 푸시하여 애플리케이션에 리소스를 추가할 수 있습니다. 로컬 시스템에서 애플리케이션의 복사본을 얻으려면 리포지토리를 복제하세요.

프로젝트 리포지토리를 복제하려면

  1. Lambda 콘솔 애플리케이션 페이지를 엽니다.

  2. my-app을 선택합니다.

  3. 코드를 선택합니다.

  4. Repository details(리포지토리 세부 정보)에서 설정 시 구성한 인증 모드에 따라 HTTP 또는 SSH 리포지토리 URI를 복사합니다.

  5. 리포지토리를 복제하려면 git clone 명령을 사용합니다.

    git clone ssh://git-codecommit.us-east-2.amazonaws.com/v1/repos/my-app-repo

애플리케이션에 DynamoDB 테이블을 추가하려면 템플릿에서 AWS::Serverless::SimpleTable 리소스를 정의합니다.

DynamoDB 테이블을 추가하려면

  1. 텍스트 편집기에서 template.yml을 엽니다.

  2. 테이블 리소스, 테이블 이름을 함수에 전달하는 환경 변수, 함수가 테이블 리소스를 관리할 수 있도록 허용하는 권한 정책을 추가합니다.

    예 template.yml - 리소스

    ... Resources: ddbTable: Type: AWS::Serverless::SimpleTable Properties: PrimaryKey: Name: id Type: String ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1 helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/hello-from-lambda.helloFromLambdaHandler Runtime: nodejs14.x MemorySize: 128 Timeout: 60 Description: A Lambda function that returns a static string. Environment: Variables: DDB_TABLE: !Ref ddbTable Policies: - DynamoDBCrudPolicy: TableName: !Ref ddbTable - AWSLambdaBasicExecutionRole
  3. 변경 사항을 커밋하고 푸시합니다.

    git commit -am "Add DynamoDB table" git push

변경 사항을 푸시하면 애플리케이션의 파이프라인이 트리거됩니다. 애플리케이션 화면의 배포 탭을 사용하여 파이프라인을 통과하는 변경 사항을 추적합니다. 배포가 완료되면 다음 단계로 진행합니다.


        Lambda 콘솔에서 애플리케이션 배포를 모니터링합니다.

권한 경계 업데이트

샘플 애플리케이션은 해당 함수의 실행 역할에 권한 경계를 적용합니다. 권한 경계는 함수의 역할에 추가할 수 있는 권한을 제한합니다. 경계가 없으면 프로젝트 리포지토리에 대한 쓰기 권한이 있는 사용자는 프로젝트 템플릿을 수정하여 샘플 애플리케이션의 범위를 벗어나는 리소스 및 서비스에 액세스할 수 있는 권한을 부여할 수 있습니다.

이전 단계에서 실행 역할에 추가한 DynamoDB 권한을 함수에서 사용하려면 추가 권한을 허용하도록 권한 경계를 확장해야 합니다. Lambda 콘솔은 권한 경계에 없는 리소스를 감지하고 이를 업데이트하는 데 사용할 수 있는 업데이트된 정책을 제공합니다.

애플리케이션의 권한 경계를 업데이트하려면 다음과 같이 하세요.

  1. Lambda 콘솔 애플리케이션 페이지를 엽니다.

  2. 애플리케이션을 선택합니다.

  3. 리소스에서 Edit permissions boundary(권한 경계 편집)을 선택합니다.

  4. 표시된 지침에 따라 새 테이블에 액세스할 수 있도록 경계를 업데이트합니다.

권한 경계에 대한 자세한 정보는 AWS Lambda 애플리케이션에 대한 권한 경계 사용 단원을 참조하세요.

함수 코드 업데이트

그런 다음 테이블을 사용하도록 함수 코드를 업데이트합니다. 다음 코드에서는 DynamoDB 테이블을 사용하여 함수의 각 인스턴스에서 처리한 호출 수를 추적합니다. 로그 스트림 ID를 함수 인스턴스의 고유 식별자로 사용합니다.

함수 코드를 업데이트하려면

  1. 다음 내용을 포함시켜 index.js 폴더에 src/handlers라는 새 처리기를 추가합니다.

    예 src/handlers/index.js

    const dynamodb = require('aws-sdk/clients/dynamodb'); const docClient = new dynamodb.DocumentClient(); exports.handler = async (event, context) => { const message = 'Hello from Lambda!'; const tableName = process.env.DDB_TABLE; const logStreamName = context.logStreamName; var params = { TableName : tableName, Key: { id : logStreamName }, UpdateExpression: 'set invocations = if_not_exists(invocations, :start) + :inc', ExpressionAttributeValues: { ':start': 0, ':inc': 1 }, ReturnValues: 'ALL_NEW' }; await docClient.update(params).promise(); const response = { body: JSON.stringify(message) }; console.log(`body: ${response.body}`); return response; }
  2. 애플리케이션 템플릿을 열고 처리기 값을 src/handlers/index.handler로 변경합니다.

    예 template.yml

    ... helloFromLambdaFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./ Handler: src/handlers/index.handler Runtime: nodejs14.x
  3. 변경 사항을 커밋하고 푸시합니다.

    git add . && git commit -m "Use DynamoDB table" git push

코드 변경이 배포되면 함수를 몇 번 호출하여 DynamoDB 테이블을 업데이트합니다.

DynamoDB 테이블을 보려면

  1. DynamoDB 콘솔의 테이블 페이지를 엽니다.

  2. my-app으로 시작하는 테이블을 선택합니다.

  3. 항목을 선택합니다.

  4. Start search(검색 시작)를 선택합니다.


        함수 인스턴스가 이벤트를 처리한 횟수를 보여주는 DynamoDB 테이블입니다.

Lambda는 여러 동시 호출을 처리하기 위해 함수의 추가 인스턴스를 생성합니다. CloudWatch Logs 로그 그룹의 각 로그 스트림은 함수 인스턴스에 해당합니다. 함수의 코드 또는 구성을 변경할 때도 새 함수 인스턴스가 생성됩니다. 조정에 대한 자세한 내용은 Lambda 함수 크기 조정 단원을 참조하세요.

다음 단계

애플리케이션 리소스를 정의하는 AWS CloudFormation 템플릿은 AWS Serverless Application Model 변환을 사용하여 리소스 정의 구문을 단순화하고 배포 패키지 및 기타 아티팩트를 자동으로 업로드합니다. 또한 AWS SAM은 패키징 및 배포 기능이 AWS SAM와 동일한 명령줄 인터페이스(AWS CLI CLI)를 Lambda 애플리케이션에 고유한 추가 기능과 함께 제공합니다. AWS SAM CLI를 사용하여 Lambda 실행 환경을 에뮬레이트하는 Docker 컨테이너에서 애플리케이션을 로컬로 테스트합니다.

AWS Cloud9은 Node.js, AWS SAM CLI, Docker를 포함하는 온라인 개발 환경을 제공합니다. AWS Cloud9을 사용하면 빠르게 개발을 시작하고 모든 컴퓨터에서 개발 환경에 액세스할 수 있습니다. 지침을 보려면 AWS Cloud9 사용 설명서시작하기를 참조하세요.

로컬 개발의 경우 IDE(통합 개발 환경)용 AWS 도구 키트를 사용하면 함수를 리포지토리로 푸시하기 전에 테스트하고 디버깅할 수 있습니다.

문제 해결

애플리케이션을 개발할 때 다음과 같은 유형의 오류가 발생할 수 있습니다.

  • 빌드 오류 - 컴파일, 테스트 및 패키징 오류를 포함하여 빌드 단계에서 발생하는 문제입니다.

  • 배포 오류 - AWS CloudFormation에서 애플리케이션 스택을 업데이트할 수 없는 경우 발생하는 문제입니다. 여기에는 권한 오류, 계정 할당량, 서비스 문제 또는 템플릿 오류가 포함됩니다.

  • 호출 오류 - 함수의 코드 또는 런타임에서 반환하는 오류입니다.

빌드 및 배포 오류의 경우 Lambda 콘솔에서 오류의 원인을 파악할 수 있습니다.

애플리케이션 오류를 문제 해결하려면

  1. Lambda 콘솔 애플리케이션 페이지를 엽니다.

  2. 애플리케이션을 선택합니다.

  3. 배포를 선택합니다.

  4. 애플리케이션의 파이프라인을 보려면 Deployment pipeline(배포 파이프라인)을 선택합니다.

  5. 오류가 발생한 작업을 식별합니다.

  6. 컨텍스트에서 오류를 보려면 세부 정보를 선택합니다.

ExecuteChangeset 작업 중에 발생하는 배포 오류의 경우 파이프라인은 AWS CloudFormation 콘솔의 스택 이벤트 목록에 연결됩니다. 상태가 UPDATE_FAILED인 이벤트를 검색합니다. AWS CloudFormation은 오류가 발생한 후 롤백되므로 관련 이벤트가 목록에서 다른 여러 이벤트 아래에 있습니다. AWS CloudFormation이 변경 세트를 작성할 수 없는 경우 이벤트 대신 변경 세트 아래에 오류가 표시됩니다.

배포 및 호출 오류의 일반적인 원인은 하나 이상의 역할에서 권한이 부족하기 때문입니다. 파이프라인에는 CloudFormationRole 스택을 직접 업데이트하는 데 사용하는 사용자 권한과 동등한 배포 역할(AWS CloudFormation)이 있습니다. 애플리케이션에 리소스를 추가하거나 사용자 권한이 필요한 Lambda 기능을 활성화하면 배포 역할이 사용됩니다. 애플리케이션 개요의 인프라 아래에서 배포 역할에 대한 링크를 찾을 수 있습니다.

함수가 다른 AWS 서비스 또는 리소스에 액세스하거나 함수에 추가 권한을 요구하는 기능을 활성화하는 경우 해당 함수의 실행 역할이 사용됩니다. 애플리케이션 템플릿에서 생성된 모든 실행 역할에는 애플리케이션의 권한 경계가 적용됩니다. 이 경계를 사용하려면 템플릿의 실행 역할에 권한을 추가한 후 IAM에서 추가 서비스 및 리소스에 대한 액세스 권한을 명시적으로 부여해야 합니다.

예를 들어 함수를 Virtual Private Cloud(VPC)에 연결하려면 VPC 리소스를 설명할 권한이 필요합니다. 실행 역할에는 네트워크 인터페이스를 관리할 권한이 필요합니다. 이를 위해 다음 단계를 수행해야 합니다.

  1. IAM에서 배포 역할에 필요한 사용자 권한을 추가합니다.

  2. IAM에서 권한 경계에 실행 역할 권한을 추가합니다.

  3. 애플리케이션 템플릿에서 실행 역할에 실행 역할 권한을 추가합니다.

  4. 업데이트된 실행 역할을 커밋하고 푸시하여 배포합니다.

권한 오류를 해결한 후 파이프라인 개요에서 변경 사항 배포를 선택하여 빌드 및 배포를 다시 실행합니다.

정리합니다

계속해서 샘플을 수정하고 사용하여 자체 애플리케이션을 개발할 수 있습니다. 샘플 사용을 완료한 경우 애플리케이션을 삭제하여 파이프라인, 리포지토리 및 스토리지에 대한 비용을 지불하지 않도록 하세요.

애플리케이션을 삭제하려면

  1. AWS CloudFormation 콘솔을 엽니다.

  2. 애플리케이션 스택 – my-app을 삭제합니다.

  3. Amazon S3 콘솔을 엽니다.

  4. 아티팩트 버킷 – us-east-2-123456789012-my-app-pipe를 삭제합니다.

  5. AWS CloudFormation 콘솔로 돌아가서 인프라 스택 – serverlessrepo-my-app-toolchain을 삭제합니다.

함수 로그는 AWS CloudFormation의 애플리케이션 또는 인프라 스택과 연결되지 않습니다. CloudWatch Logs 콘솔에서 로그 그룹을 별도로 삭제합니다.

로그 그룹을 삭제하려면

  1. Amazon CloudWatch 콘솔의 로그 그룹 페이지를 엽니다.

  2. 함수의 로그 그룹(/aws/lambda/my-app-helloFromLambdaFunction-YV1VXMPLK7QK)을 선택합니다.

  3. 작업을 선택한 다음 로그 그룹 삭제를 선택합니다.

  4. 예, 삭제를 선택합니다.