편집자 주: 함께 보면 좋아요!

애플리케이션 개발부터 배포까지, AWS CodeStar


Overview: 작성 환경

AWS CodeStar를 사용하면 애플리케이션의 서버, 언어 , 형상관리, 배포, 빌드까지 한꺼번에 관리할 수 있습니다. AWS를 사용하는 개발자라면 꼭 필요한 도구이기도 합니다. 이번 글에서는 CodeStar를 초기 설정할 때의 도움이 될 내용들을 소개하겠습니다.

-서비스: AWS CodeStar
-템플릿: Python Webservice, AWS Lambda

01



목차
파라미터 바인딩
람다 환경변수 설정
람다 레이어 설정
xray 모니터링 설정
람다 함수명 설정
Global 섹션
로컬 개발환경에서의 SAM 실행


CodeStar 프로젝트 생성 후

CodeStar로 프로젝트를 생성하면 소스코드와 배포를 위한 Code 시리즈 리소스들이 함께 만들어집니다. CodeCommit, CodeBuild, CodePipeline 등이 있습니다. 우선 기본으로 구축된 파이프라인부터 살펴보겠습니다.

02


CodeCommit 리포지토리의 마스터 브랜치 코드를 변경하면 CodeBuild와 CloudFormaton 서비스를 통해 빌드, 테스트, 배포를 진행할 수 있게 설정되어 있습니다. 생성된 리포지토리의 template.yml 파일을 이용하면 프로젝트 리소스도 관리할 수 있는데, 특히 template.yml을 통해 CloudFormation으로 관리하는 리소스까지도 관리가 가능합니다.

기본으로 생성된 template.yml 파일을 자세히 살펴보겠습니다.

AWSTemplateFormatVersion: 2010-09-09
    Transform:
    - AWS::Serverless-2016-10-31
    - AWS::CodeStar
    
    Parameters:
      ProjectId:
        Type: String
        Description: CodeStar projectId used to associate new resources to team members
      CodeDeployRole:
        Type: String
        Description: IAM role to allow AWS CodeDeploy to manage deployment of AWS Lambda functions
      Stage:
        Type: String
        Description: The name for a project pipeline stage, such as Staging or Prod, for which resources are provisioned and deployed.
        Default: ''
    
    Globals:
      Function:
        AutoPublishAlias: live
        DeploymentPreference:
          Enabled: true
          Type: Canary10Percent5Minutes
          Role: !Ref CodeDeployRole
    
    Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
          Handler: index.handler
          Runtime: python3.7
          Role:
            Fn::GetAtt:
            - LambdaExecutionRole
            - Arn
          Events:
            GetEvent:
              Type: Api
              Properties:
                Path: /
                Method: get
            PostEvent:
              Type: Api
              Properties:
                Path: /
                Method: post
      LambdaExecutionRole:
        Description: Creating service role in IAM for AWS Lambda
        Type: AWS::IAM::Role
        Properties:
          RoleName: !Sub 'CodeStar-${ProjectId}-Execution${Stage}'
          AssumeRolePolicyDocument:
            Statement:
            - Effect: Allow
              Principal:
                Service: [lambda.amazonaws.com]
              Action: sts:AssumeRole
          Path: /
          ManagedPolicyArns:
            -  arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
          PermissionsBoundary: !Sub 'arn:${AWS::Partition}:iam::${AWS::AccountId}:policy/CodeStar_${ProjectId}_PermissionsBoundary'




파라미터 바인딩

Parameters 섹션에서는 ProjectId, CodeDeployRole, Stage 등 템플릿에서 사용할 파라미터를 지정할 수 있습니다. yml 파일 안에서는 ${ProjectId} 와 같이 사용할 수 있고, CodePipeline 환경에서 파라미터를 전달할 수 있습니다.

03


CodePipeline → Deploy → GenerateChangeSet → Advanced → Parameter overrides


람다 환경변수 설정

람다 함수에서 사용할 환경변수를 설정할 수 있습니다. 아래와 같이 람다 환경변수 TZ(timezone)를 지정하면 실행 환경의 표준 시간대 설정이 가능합니다.

Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
          Environment:
            Variables:
              TZ: 'Asia/Seoul'




람다 레이어 설정

람다 레이어를 적용하면 패키지 관리가 훨씬 편리해집니다. 함수의 패키지 크기가 3MB를 넘지 않으면 콘솔에서 코드를 직접 확인 및 수정할 수 있습니다. 람다 레이어는 zip 파일로 관리되고, /opt 폴더에 압축 해제되며 생성됩니다.

람다는 250MB의 제한이 있습니다. 만약 레이어를 사용해 분리하더라도 람다함수패키지와 람다 레이어의 합으로 걸려있으므로 크기 제약에서 벗어날 수는 없습니다.

Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
          Layers:
            - arn:aws:lambda:{region}:{id}:layer:{layer-name}:{version}




xray 모니터링 설정

Tracing Property를 이용하면 람다 함수의 Enable active tracing 설정을 할 수 있습니다. CloudFormation 템플릿 메뉴얼엔 TracingConfig로 안내하고 있어도 빌드에 실패하여 확인해보니 SAM 템플릿의 AWS::Serverless::Function 의 스펙에선 Tracing으로 안내되고 있는 걸 볼 수 있었습니다.

Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
          Tracing: Active




람다 함수명 설정

람다 함수는 기본적으로 아래와 같은 이름을 부여합니다.

awscodestar-{brandi-test(프로젝트명)}-lambda-{HelloWorld(template함수ID)}-{NZ6YXLZ8XD0O(RANDOM_ID)}

만약 함수 간의 호출이 필요할 때는 아래와 같이 함수 이름의 지정도 가능합니다.

Resources:
      HelloWorld:
        Type: AWS::Serverless::Function
        Properties:
    			FunctionName: !Sub '${ProjectId}-HelloWorld-${Stage}'




Global 섹션

Global 섹션을 이용하면 리소스마다 동일하게 적용할 항목들을 관리할 수 있습니다.

Globals:
      Function:
        Runtime: python3.6
        Environment:
          Variables:
            TZ: 'Asia/Seoul'
        VpcConfig:
          SubnetIds:
            - subnet-a1111111
            - subnet-b2222222
          SecurityGroupIds:
            - sg-c2222222




로컬 개발환경에서의 SAM 실행

API Gateway 환경 실행

sam local start-api



람다 함수 직접 실행

echo ‘{}’ | sam local invoke —parameter-values=‘ParameterKey=ProjectId,ParameterValue=brandi-test’ HelloWorld




Conclusion

지금까지 CodeStar 초기 설정에 도움이 될 내용들을 살펴봤습니다. 강력한 기능들과 함께 업무를 진행한다면 조금이라도 더 나은 개발 환경을 구축할 수 있을 거라 생각합니다.


이상근 실장 | R&D DO실
leesg@brandi.co.kr
브랜디, 오직 예쁜 옷만