AWS에 Spinnaker 설치

환경 구성하기

VPC 만들기

기존에 VPC를 가지고 있다면 다음 파트로 넘어가면 된다. 처음 AWS를 사용한다면 VPC 부터 생성해야 한다. VPC 는 virtual private cloud 의 약자이며 아마존 네트워크 내에 자신의 인터넷 데이터 센터(IDC)를 가상으로 만들어 둔다는 것으로 이해하면 된다.

AWS 콘솔로 로그인 한다. 상단 Service 를 클릭하고 VPC 화면으로 이동한다.

aws-console-menu

Start VPC Wizard 를 클릭한다. “VPC with a Single Public Subnet” 탭이 선택되어있나 확인하고 Select 버튼을 클릭한다.

vpc-configuration

IP CIDR block 에는 적당한 네트워크 구간을 정의한다. 4자리 숫자 중 어디까지 고정시키고 나머지 숫자로 서버를 정의하는 행위이므로 적절한 숫자를 고려해야 한다. 10.1.1.0/24 는 10.1.1.1~256 로 시작하는 네트워크 공간을 확보하는 것이고 그 이상의 서버가 생성이 된다면 재구성을 해야 하기 때문이다.

VPC name 을 입력한다. defaultvpc 이런 식으로 입력한다.

VPC 내에 서브 네트워크를 정의한다. 예를 든다면 vpc 는 10.123.0.0/16 으로 subnet 은 10.123.180.0/24 로 정의해서 vpc 내에 256개의 서브넷이 가능하고 서브넷 안에 251개의 서버를 구성할 수 있다. 이 IP 번호는 사설 번호 이므로 임의로 정할 수 있고 내 안에서만 겹치지 않으면 된다. 외부에서 접속하는 IP 주소는 public IP 로 따로 부여 받는 것이고 갯수의 제한이 있다.

subnet name 은 예를 들어 defaultvpc.internal.ap-east-2 이런 식으로 붙여주면 된다. 본인이 관리하는 명명 규칙이 있으면 좋다.

Create VPC 버튼을 클릭하여 생성한다.

AWS 역할 만들기

spinnaker 가 동작할 역할을 생성해야 한다. AWS 콘솔의 상단에 Services를 클릭하고 나타나는 메뉴에서 IAM 을 선택한다. 왼쪽 항목에서 Roles를 클릭하고 오른쪽 상단의 Create New Role 버튼을 클릭한다.

create-new-role

역할명을 입력(spinnakerRole)하고 Next Step 를 누른다. 역할이 담당할 서비스로 목록 중에 Amazon EC2 의 Select 버튼을 클릭한다.

역할에 적용될 정책을 선택한다. 역할 하나에 10개의 정책까지만 적용할 수 있다. PowerUserAccess 의 체크상자를 클릭해서 선택한다. (목록에 내용이 너무 많아 filter 에 power를 입력하면 쉽게 찾을 수 있다.) Next Step을 누르고 이어서 Create Role 을 눌러 역할을 생성한다.

생성이 완료되고 역할 목록 화면이 다시 나타나는데 그 중에 생성한 역할이 추가되어 있다. 생성한 역할을 클릭하면 역할의 상세 내용이 나타난다. 화면 하단에 Inline Policies 제목을 클릭하면 inline 정책을 등록할 수 있는 click here 링크가 나타난다.

create-new-role-2

‘Policy Generator` 를 선택하고 Select 버튼을 클릭한다.

create-new-role-3

AWS Service 항목에 AWS Identity and Access Management 를 선택한다. Actions 항목에는 PassRole 를 선택한다. Amazon Resource Name (ARN) 항목에 * (별표)를 입력한다. Add Statement를 클릭하여 입력 내용을 등록하고 Next Step을 눌러 다음 단계로 넘어간다.

create-new-role-4

아래와 같은 정책 정의를 보여 준다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1463021281000",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

Apply Policy 를 클릭해서 적용한다. 이후에 만드는 서버의 이 역할을 가지고 인증 정보를 사용할 수 있다.

키 만들기

AWS 콘솔 화면에서 Services > EC2 화면으로 이동한다. 왼쪽 메뉴 그룹 중에 Network & Security 그룹 제목이 있다. 그 안에 Key Pairs 항목을 클릭한다. 오른쪽 상단의 Create Key Pair버튼을 클릭한다. 키 이름으로 aws-spinnaker-keypair 라고 입력한다. (본인이 암기하기 쉬운 것으로 하면된다.)

Create 버튼을 클릭하면 키 파일이 다운로드 된다. 브라우저 따라 다르겠지만 mac book의 사파리로 작업을 한 경우 다운로드 된 파일이 txt 확장자로 저장되었다. 관리를 위해서 txt 는 지우고 pem 으로 끝나는 파일로 변경하자.

생성된 키는 다운로드 뿐 아니라 화면의 키 목록에도 저장되어 있다. 키 파일은 다시 다운로드가 되지 않으며 잃어버린 경우 다른 키 파일로 생성하고 이전 키 파일을 사용한 모든 자원들에 대해 새 파일로 교체해야 한다. 그러니까 잃어버리지 않도록 주의한다.

키 파일을 이용해 ssh 등으로 서버에 접속하려 한다면 키 파일의 권한 속성을 바꾸어야 한다. 키 파일이 안전하다는 전제 하에 프로그램들이 동작하므로 권한 속성을 점검하는 것 같다. 아래와 같이 명령을 실행한다.

$ sudo chmod 400 aws-spinnaker-keypair.pem
Password:

계정 만들기

spinnaker 를 위한 신분증을 만든다. Services > IAM 화면으로 이동한 다음 오른쪽 상단의 Create New Users 버튼을 클릭한다. 여러명의 사용자 이름을 등록할 수 있는데 첫 칸에 spinnakerUser를 입력하고 Create 버튼을 클릭한다. 신분증은 접근키 값과 비밀키 값으로 선언된다. 키값을 메모하거나 Download Credentials 버튼을 클릭하여 자신의 컴퓨터에 저장할 수 있다. 저장된 파일은 credential.cvs 파일로 생성되는데 이후 식별이 쉽도록 계정이름과 동일하게 파일명을 변경하도록 한다. OK를 클릭하면 결과 화면이 닫히고 계정 목록이 나타나는데 신규 계정이 등록된 것을 확인할 수 있다.

aws CLI에 의해 홈 디렉토리에 credentials 파일과 config 파일이 생성이 된다. credentials 에는 인증 정보가 있고 config 에는 기본 접속하는 region 이 정의되어 있다. 이 기본 프로파일에 추가로 방금 생성한 계정을 추가로 만들 수 있다. 자신의 컴퓨터에 2개 파일에 대해서 아래와 같이 작업을 한다.

접속키와 비밀키를 credentials 파일에 아래와 같이 추가한다.

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[spinnakerUser]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

기본 접속하게 될 region 은 config 파일에 아래와 같이 추가할 수 있다.

[default]
region=us-west-2
output=json

[profile spinnakerUser]
region=ap-east-2
output=text

생성된 계정을 클릭하고 상세 정보에서 permission 탭에 managed policies 와 inline policies 에 역할에서 등록한 정책들과 동일한 방식으로 정책을 적용시킨다.

AWS 서버 만들기

AMI 가져오기

spinnaker 서버를 복제한 이미지 파일(AMI)이 제공된다. 아마존 마켓플레이스에서 선택할 수 있지만 한국 region 에서는 존재하지 않는다. 따라서 us-west-2(Oregon) region 에서 가져와야 한다. 바로 가져오는 방법이 없으므로 오레곤에서 서버를 만들고 그 서버를 복제한 이미지를 만들어 ap-east-2(Seoul) region 으로 전송할 수 있다.

보유한 계정으로 AWS 콘솔에 접속한다. Spinnaker AMI 4b35d42b를 클릭해서 제공된 복제 이미지로 서버를 생성하자. 다른 지역의 AMI 파일은 정상 동작하지 않을 수 있다.

선택할 타입으로 m4.xlarge 를 지정한다. 이보다 작은 크기를 선택한 경우 톰캣 등의 필요 서비스가 동작하지 않는다. Next: Configure Instance Details 를 클릭하고 다음으로 진행한다.

choose-ec2-type

상세 정보에서 외부에서 접근할 수 있도록 Auto-assign Public IP 항목을 Enalble 로 설정하고 IAM Role 은 위에서 생성한 역할(spinnakerRole)을 설정한다. Review and Launch 버튼을 클릭하여 설정을 마무리하고 Launch를 클릭한다. Oregon region에서는 생성한 키가 없으므로 “Create a new key pair” 를 선택하고 임의의 키 이름으로 Downlaod Key Pair 버튼을 클릭한다. Launch Instances 버튼이 활성화 되면 클릭해서 서버가 생성되도록 한다.

서버 목록이 나타나고 진행상태가 표기된다. 서버 생성이 완료되면 목록에서 서버를 선택(체크박스를 체크)하고 상단의 Actions 하위 버튼 중에 Image > Create Image 항목을 클릭한다.

create-ami

복제 이미지가 생성 되는데는 시간이 걸린다. AMI 가 완성되면 이제 전에 생성한 서버는 필요없다. instance 메뉴를 클릭하고 서버를 선택한 다음 Actions > Instance State > Terminate 를 클릭하여 서버를 종료시킨다. Stop 과는 달리 서버의 존재 자체가 aws로 반환될 것이고 비용은 발생하지 않게 된다. 아래 그림처럼 IMAGES 안에 AMIs를 선택하면 생성된 이미지를 발견할 수 있다. 이를 선택하고 Actions > Copy AMI 메뉴 항목을 클릭한다.

copy-ami

AMI를 서버를 구성할 region(Seoul)로 복사한다. Destination region 을 Seoul 로 하고 Copy AMI 버튼을 클릭한다.

copy-ami-2

화면 최 상단의 Oregon region 을 Seoul 로 변경한다. 한국으로 복제되기를 기다린다. 복제가 완료되면 AMI 를 가지고 서버를 생성하자.

NB 복제 이미지를 만들기 위해 생성한 서버는 terminate 시켜야 한다. 이를 잊고 있다가 비용 폭탄을 맞을 수 있다.

AMI 에서 서버 생성

전송이 완료된 AMI 를 선택하고 상단의 Launch 버튼을 클릭한다. 위에서 했던 작업과 마찬가지로 m4.xlarge 를 선택하고 Next 를 클릭한다. 상세 정보에서 Network 항목에 기존에 생성한 vpc 를 선택한다. 해당 vpc 내에 생성된 Subnet 을 선택한다. spinnaker 는 외부에서 접속이 가능해야 하므로 Pulic 구간을 목적으로 만든 subnet 을 선택한다. 이전과 마찬가지로 auto-assign public IP 는 enable 시키고 IAM Role 도 똑같이 spinnakeRole 로 설정한다.

Next: Add Storage 를 클릭한다. size 에 20 Gb 를 입력한다.

Next: Tag Instance 를 클릭한다. aws에서 자원을 식별하기 위해 tag 를 다는 것은 중요한 일이다. 설사 자원을 실수로 terminate 시켜도 빨리 작업하면 tag 를 이용하요 검색해서 다시 복원할 수도 있다. tag 에 name 을 적당히 지정한다. (ex. vpcname.public.spinnaker)

Next 를 누르고 보안그룹을 설정한다. 기존에 외부에서 접근할 용도로 만든 public 구간이 있다면 그 구간에 적용된 보안 그룹을 적용한다. 만일 없다면 새로 보안 그룹을 생성하고 외부에서 접근 되도록 inbound, outbound 정책을 정의한다.

최종 Launch 버튼을 클릭하고 이전에 만든 키를 (예. aws-spinnaker-keypair) 지정한다. 이 키가 없이는 생성된 서버는 접근할 수 없다는 충고에 체크하고 Launch Instances 를 클릭해서 생성한다.

View Instances 를 클릭해서 서버 목록이 나타나는 화면으로 이동한다. 목록에 생성된 서버가 추가되어 있고 Instance State 가 먼저 running 으로 바뀌고 서버가 실행되고 최초 설정에 필요한 후속 작업들이 수행되면서 Status Checks 가 Initializing 에서 2/2 checks passed 로 바뀐다.

서버 접속

public IP 를 자동할당 하도록 지정하였기 때문에 생성된 서버의 정보를 보면 public DNS 에 주소가 지정되어 있음을 알 수 있다. 주소와 다운 받은 키파일을 이용해서 SSH 터널을 만들어 접속하도록 하자. 이 작업은 사용자 컴퓨터에서 terminal을 열어서 작업을 수행한다.

홈 디렉토리 안에 .ssh 폴더에 config 파일을 편집기를 통해서 연다. 예제에서 vi를 사용하였는데 사용자에 따라 맞는 편집기를 이용하면 된다. nano를 많이 쓰는 것 같다.

$ vi ~/.ssh/config

아래 내용으로 붙여 넣는다. HostName 은 aws 콘솔에서 ec2 의 instances 목록 중에 생성한 서버를 선택하면 상세 내용중에 찾을 수 있다. IdentityFile 은 이전 작업에서 서버를 생성할 때 지정한 키 파일의 이름을 적어준다. 단, 경로명을 정확히 기재한다.

Host spinnaker-start
   HostName <Public DNS name of instance you just created>
   IdentityFile </path/to/my-aws-account-keypair.pem>
   ControlMaster yes
   ControlPath ~/.ssh/spinnaker-tunnel.ctl
   RequestTTY no
   LocalForward 9000 127.0.0.1:9000
   LocalForward 8084 127.0.0.1:8084
   LocalForward 8087 127.0.0.1:8087
   User ubuntu

 Host spinnaker-stop
   HostName <Public DNS name of instance you just created>
   IdentityFile </path/to/my-aws-account-keypair.pem>
   ControlPath ~/.ssh/spinnaker-tunnel.ctl
   RequestTTY no

이제는 터널을 시작하고 종료하는 실행 파일을 만든다. 편집기로 파일을 연다.

$ vi ~/spinnaker-tunnel.sh

아래 코드를 붙여 넣는다.

 #!/bin/bash

 socket=$HOME/.ssh/spinnaker-tunnel.ctl

 if [ "$1" == "start" ]; then
   if [ ! \( -e ${socket} \) ]; then
     echo "Starting tunnel to Spinnaker..."
     ssh -f -N spinnaker-start && echo "Done."
   else
     echo "Tunnel to Spinnaker running."
   fi
 fi

 if [ "$1" == "stop" ]; then
   if [ \( -e ${socket} \) ]; then
     echo "Stopping tunnel to Spinnaker..."
     ssh -O "exit" spinnaker-stop && echo "Done."
   else
     echo "Tunnel to Spinnaker stopped."
   fi
 fi

파일을 저장하고 실행 권한을 부여한다.

$ sudo chmod u+x ~/spinnaker-tunnel.sh

터널을 시작해보자. 처음 접속하는 것으로 한번 확인 작업이 있는데 yes 를 입력하면 진행된다.

$ ~/spinnaker-tunnel.sh start
Starting tunnel to Spinnaker...
The authenticity of host ' ()' can't be established.
ECDSA key fingerprint is SHA256:Vyt6eTAYvgXhBRuBawDq1iY...........EkZifeWeg.
Are you sure you want to continue connecting (yes/no)? yes
Done.
$

이제 터널이 정상적으로 이루어졌고 브라우저에서 http://127.0.0.1:9000 으로 접속해 보자. 이 IP 번호는 자신의 컴퓨터 번호인데 터널을 통해서 spinnaker 서버로 접속이 이루어진다.

spinnaker-main-page

참고 사이트