• 티스토리 홈
  • 프로필사진
    알쓸개잡
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
알쓸개잡
  • 프로필사진
    알쓸개잡
    • 분류 전체보기 (92)
      • 스프링부트 (52)
      • AWS (5)
      • 쿠버네티스 (7)
      • 자바 (19)
      • 인프라 (0)
      • ETC (8)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      • 반응형
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • bitbucket pipeline을 이용한 AWS ECS 애플리케이션 배포
        2023년 10월 23일
        • 알쓸개잡
        • 작성자
        • 2023.10.23.:52

        bitbucket은 aws-ecs-deploy 플러그인을 제공하여 손쉽게 AWS ECS 서비스에 애플리케이션을 배포할 수 있도록 한다.

        AWS CodeDeploy나 CodePipeline을 통해서 배포할 수도 있겠지만, 이번 포스팅에서는 bitbucket pipeline을 통해서 AWS ECS에 애플리케이션을 배포하는 방법에 대해서 소개한다.

         

        사전 조건

        • Docker Hub 혹은 AWS ECR과 같은 image registry가 필요하다.
        • AWS ECS Service 구성이 필요하다.
        • RegisterTaskDefinition 및 UpdateService 권한이 있는 AWS IAM 사용자가 필요하다.
        • 해당 bitbucket repository에 bitbucket pipeline 사용 설정이 필요하다.

         

        AWS IAM 권한

        빌드 및 배포를 수행하는 AWS IAM 계정이 있을 것인데 해당 IAM 계정에 다음과 같은 권한이 필요하다.

        AWS 콘솔의 해당 IAM 계정에서 IAM > Users > 해당 계정 > Add permissions > Create inline policy를 통해서 추가한다.

        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "VisualEditor0",
                    "Effect": "Allow",
                    "Action": [
                        "ecs:UpdateService",
                        "ecs:RegisterTaskDefinition"
                    ],
                    "Resource": "*"
                }
            ]
        }
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Sid": "VisualEditor0",
                    "Effect": "Allow",
                    "Action": [
                        "iam:GetRole",
                        "iam:PassRole"
                    ],
                    "Resource": "<ecsTaskExecutionRole arn>"
                }
            ]
        }
        • <ecsTaskExecutionRole arn>은 AmazonECSTaskExecutionRolePolicy 정책을 포함하고 있는 role 이다.
        • ECS Service를 구성하였다면 AmazonECSTaskExecutionRolePolicy 정책을 포함한 role이 있을 것인데 해당 role arn을 입력한다.
        • 샘플에서는 ecsTaskExecutionRole이라고 하겠다.
        • iam:PassRole은 배포를 수행하는 IAM 계정에서 ecsTaskExecutionRole을 사용할 수 있도록 한다.

         

        AmazonECSTaskExecutionRolePolicy는 다음과 같다.

        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "ecr:GetAuthorizationToken",
                        "ecr:BatchCheckLayerAvailability",
                        "ecr:GetDownloadUrlForLayer",
                        "ecr:BatchGetImage",
                        "logs:CreateLogStream",
                        "logs:PutLogEvents"
                    ],
                    "Resource": "*"
                }
            ]
        }

         

        bitbucket pipeline script

        우선 기본적으로 bitbucket pipeline에 대한 작성 방법을 숙지하고 있어야 한다.

        atlassian/aws-ecs-deploy pipe 제공하여 AWS ECS에 손쉽게 애플리케이션을 배포할 수 있다.

        AWS ECR에 애플리케이션을 배포하는 script는 다음과 같다.

        pipelines:
          branches:
            master:
              - step:
                  <애플리케이션 빌드 및 ECR에 배포코드>
              - step:
                  script:
                    - pipe: atlassian/aws-ecs-deploy:1.0.0
                      variables:
                        AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY
                        AWS_SECRET_ACCESS_KEY: $AWS_SECRET_KEY
                        AWS_DEFAULT_REGION: $AWS_REGION
                        CLUSTER_NAME: <ECS cluster 이름>
                        SERVICE_NAME: <ECS service 이름>
                        TASK_DEFINITION: <ECS service에 적용된 task definition json 파일>

        $AWS_ACCESS_KEY, $AWS_SECRET_KEY, $AWS_REGION은 bitbucket repository의 variable로 등록한다.

        variable 이름을 $AWS_ACCESS_KEY_ID, $AWS_SECRET_ACCESS_KEY, $AWS_DEFAULT_REGION으로 사용한다면 bitbucket-pipelines.yml의 variables에 따로 지정하지 않아도 된다.

        script:
          - pipe: atlassian/aws-ecs-deploy:1.9.0
            variables:
              CLUSTER_NAME: 'my-ecs-cluster'
              SERVICE_NAME: 'my-ecs-service'
              TASK_DEFINITION: 'task-definition.json'

         

        ECS service에 적용된 task definition json 파일은 AWS 콘솔에서 ECS >> Task definitions에서 JSON 파일로 다운로드한다.

        task definition json 파일 샘플은 다음과 같다.

        {
            "containerDefinitions": [
                {
                    "name": "<task 이름>",
                    "image": "<ECR container image 경로>:<version>",
                    "portMappings": [
                        {
                            "containerPort": <application port>,
                            "hostPort": <host port>,
                            "protocol": "tcp"
                        }
                    ],
                    "essential": true,
                    "environment": [
                        {
                            "name": "SPRING_PROFILES_ACTIVE",
                            "value": "production"
                        }
                    ]
                }
            ],
            "family": "<family name>",
            "taskRoleArn": "<ecsTaskExecutionRole arn>",
            "executionRoleArn": "<ecsTaskExecutionRole arn>",
            "networkMode": "awsvpc",
            "volumes": [],
            "requiresCompatibilities": [
                "FARGATE"
            ],
            "cpu": "1024",
            "memory": "2048",
            "tags": [
                {
                    "key": "<tag key>",
                    "value": "<tag value>"
                },
                ...
            ]
        }

         

        bitbucket repository에 코드를 commit 하고 pipeline 수행이 완료된 후 AWS ECS에서 배포 로그는 다음과 같다.

        ECS > Clusters > 클러스터이름 > Services > 서비스 이름 > Deployments

         


        참고링크

        https://support.atlassian.com/bitbucket-cloud/docs/deploy-to-amazon-ecs/

         

        Deploy to Amazon ECS | Bitbucket Cloud | Atlassian Support

        This option provides you with a simplified way of deploying to ECS. It requires less maintenance since the pipeline is maintained on your behalf.

        support.atlassian.com

        https://bitbucket.org/bitbucketpipelines/example-aws-ecs-deploy/src/master/

         

        Bitbucket

         

        bitbucket.org

        https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html

         

        Using service-linked roles for Amazon ECS - Amazon Elastic Container Service

        If you are unsure whether Amazon ECS is using the AWSServiceRoleForECS role, you can try to delete the role. If the service is using the role, then the deletion fails and you can view the regions where the role is being used. If the role is being used, the

        docs.aws.amazon.com

         

        반응형
        저작자표시 비영리 변경금지 (새창열림)

        'AWS' 카테고리의 다른 글

        AWS MediaConvert SDK 사용 방법 (3) - SNS 연결하기  (0) 2023.08.18
        AWS MediaConvert SDK 사용 방법 (2) - Job 생성 코드  (0) 2023.08.18
        AWS MediaConvert SDK 사용 방법 (1) - role 생성하기  (0) 2023.08.17
        AWS SES 사용하기  (0) 2023.07.31
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바