[AWS] EC2 접속용 SSH 키페어 분실 또는 손상 시 키 재생성 방법

현재 운영 중인 EC2 인스턴스를 SSH로 접속하는 용도로 SSH Key-pair를 사용합니다. 서버에 public-key를 저장해놓고 private-key는 로컬에 보관하여 사용합니다. 일반적으로 PEM 키를 사용합니다.

사용 중인 맥북을 공장초기화하면서 로컬에 있던 개인키(private-key)가 안전하게 i-Cloud에 저장되어있을 것이라 생각했습니다. 생각대로 공장초기화 후 i-Cloud를 통해 개인키를 다운받았고 EC2 인스턴스를 SSH로 접속해봤습니다. 그런데 접속이 되질 않습니다.

Permission denied (publickey).

개인키 퍼미션도 600으로 낮춰놨고 아무런 문제가 없었지만 계속 저 메세지만 출력되었습니다. 끝내 i-Cloud로 복원된 개인키가 손상되었다는 결론을 내게 되었고 키페어를 새로 생성하기로 했습니다.

키 페어 새로 생성하여 적용하는 방법

1. 우선 SSH를 접속할 로컬 환경에서 키를 새로 생성한다. 아래 명령을 입력한뒤 엔터 연타

$ ssh-keyhen -m PEM

2. 생성된 개인키의 공개키(public-key)를 출력하여 복사한다.

$ ssh-keygen -y -f {개인키 파일 경로}

3. AWS EC2 콘솔 -> 해당 인스턴스 중지 -> 인스턴스 우클릭 -> Instance Settings -> Edit user data -> 아래 스크립트 입력

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
  - name: ec2-user
    ssh-authorized-keys: 
    - {위에서 복사한 공개키}

4. 저장 후 인스턴스 시작

5. SSH 접속 테스트

$ ssh -i {개인키 경로} ec2-user@{접속 호스트}

6. 잘 되면 성공. 이제 3번에서 저장했던 스크립트를 삭제해야한다. 저 스크립트는 EC2 서버에서 .ssh/authorized_keys 파일에 공개키를 넣어주는 역할이다. 즉, 한번 실행되고 나면 역할을 다하는데다 콘솔에 공개키를 포함한 스크립트가 존재하는 것은 보안상 리스크가 있기 때문에 삭제 해주는 것이 좋다. 인스턴스를 다시 중지한 후 3번 Edit user data 화면에서 저장한 스크립트를 삭제 -> 저장 후 인스턴스를 다시 시작한다.

7. 최종 접속 확인. 5번 접속 테스트를 다시 한번 해보고 접속이 잘된다면 키페이 교체는 완료된 것이다.

[React] AWS Amplify 환경 변수 추가 방법

React 프로덕트를 AWS Amplify를 이용해 배포 시 환경 변수를 통해 간편하게 개발과 운영 환경을 분기할 수 있습니다.

예를 들어 요청 API 도메인이 개발과 운영이 다른 경우 요청 도메인을 외부 변수로 빼서 관리를 해야합니다. 이를 기존에는 .env를 통해 처리했지만 Amplify에서는 환경 변수를 세팅할 수 있는 기능을 제공합니다.

AWS Amplify > 앱 설정 > 환경 변수 > REACT_APP_API_URL 변수명을 추가하고 해당하는 API URL을 넣어줍니다. 하나의 앱환경에 Git 브랜치 별로 구성되어있다면 대상 브랜치도 선택할 수 있습니다.

설정된 REACT_APP_API_URL 이라는 변수는 React 소스상에서 기존 .env 환경 변수 사용법과 동일하게 process.env.REACT_APP_API_URL로 설정 값을 사용할 수 있습니다.

단, 이미 배포된 상태에서 환경 변수를 추가하는 경우 적용되지 않고 재배포를 해야 추가/변경된 환경변수가 적용됩니다.

[AWS] ElasticLoadBalancer(ELB) 적용된 ElasticBeansTalk(EB) Instance SSH 접속 방법

ElasticBeanstalk로 구성된 서비스에 https를 사용하려면 ELB를 구성하여 발급된 SSL인증서를 적용해야 합니다. 여기서 ELB는 인프라에 앞단에서 https(443 포트) 접근을 받아 ElasticBeanstalk(이하 EB)에 넘기는 역할을 합니다.

위 처럼 구성된 경우 EB 인스턴스의 SSH 접근이 EB public DNS를 통해 되지 않게 됩니다. 이 경우 EB에 해당하는 EC2 인스턴스의 Public IP 또는 Public DNS로 SSH 접속이 가능합니다. Public IP/Public DNS는 EC2 인스턴스 재시작 시 변경됩니다. IP가 변경되지 않도록 하려면 ElasticIP를 이용해 고정 IP를 할당받아야 합니다.

그 전에 EC2 Key-pair 생성(pem키 발급) 또는 등록이 필요하고 해당 EC2 인스턴스의 보안 그룹(SecurityGroup)에서 SSH 22번 포트 Inbound 설정이 필요합니다. 설정이 완료되었다면 아래와 같이 접근이 가능합니다.

$ ssh -i {개인키 경로} ec2-user@{EC2 PublicIP or PublicDNS}

[SpringBoot] Elastic Beanstalk Profile 변수 적용되지 않는 이슈

개인 프로젝트를 위해 Kotlin + Spring boot + AWS 환경에서 개발을 진행하고 있는데 삽질이 이만저만이 아니어서 계속 포스팅이 이어질 것 같습니다.

Elastic Beanstalk 줄여서 EB라 하겠습니다. EB에서 개발과 운영 환경 분기를 위해 환경변수를 세팅할 수 있습니다. 제 경우에는 application.properties를 이용해 application-dev.properties와 application-prod.properties 각 별도 파일로 분리시켰습니다. application.properties 정의를 하고 환경변수에 해당 환경에 대한 키워드를 대입하면 손쉽게(?) 환경 분기를 시킬 수 있습니다.

그런데 안되서 어제 하루 종일 삽을 펐습니다. 문제는 EB에서 SPRING_PROFILES_ACTIVE 변수를 dev로 지정했음에 불구하고 배포 시 이를 읽지 못하고 default profile이 적용되는 문제였습니다.

하루 반나절만에 해결이 되었습니다. 문제는 환경 변수 키워드가 원인이었고 SPRING_PROFILES_ACTIVE가 아닌 spring.profiles.active로 환경변수를 지정해줘야 했습니다.

[AWS] Amazon Linux AMI에서 PHP 7.x 설치

아마존 리눅스에서 PHP 7.x 버전 설치하는 방법을 소개합니다. EC2 인스턴스 생성 직후 $ sudo yum info php* 로 패키지를 조회 해보면 php 5.4 버전 기준의 패키지만 검색됩니다. 아래 단계를 진행하시면 php7 버전 설치가 가능합니다.

진행 방법

// php 최신 버전 조회
$ sudo amazon-linux-extras | grep php
// php 7.4 레포지토리 설치 (작성일 기준에서 최신버전은 php7.4)
$ sudo amazon-linux-extras install php7.4
// php 7.4 패키지 활성 (기존 설치된 버전이 있다면 disable 명령 후 진행)
$ sudo amazon-linux-extras enable php7.4
// php 모듈 설치
$ sudo yum install  php-cli php-common php-gd php-mbstring  php-mysqlnd php-pdo php-fpm php-xml php-opcache php-zip php-bcmath
// php 버전 확인
$ php -v

* 이 내용은 https://www.lesstif.com/lpt/amazon-linux-ami-php-7-3-77955353.html 을 바탕으로 재작성하였습니다.

[Linux] 계정을 이용해 ftp 접속을 하기 위한 vsftpd 설정

서버 내 생성된 계정으로 ftp를 접속하도록 설정하는 방법을 소개합니다. 이 방법은 AWS의 EC2 에서도  가능합니다.

  1. vsftpd.conf 파일을 편집기로 엽니다. (예제는 vi 에디터)
  2. 아래와 같이 설정합니다.

     

참고 내용

  1. vsftpd가 설치되어 있지 않다면? 아래 방법으로 설치합니다.
  2. vsftpd 설치 후 chkconfig 등록
  3. AWS의 EC2 인스턴스를 사용중이라면?
    => Security Group에서 20-21, 1024-1048 인바운드 포트 대역을 추가해줘야 합니다.

[AWS] ACM(Amazon Certificate Manager)로 SSL 인증서 적용하는 방법

SSL 인증서를 알아보던 중 AWS에서 제공하는 ACM(Amazon Certificate Manager)가 있다는 것을 알았습니다. 비용은 무료이고 연 마다 갱신할 필요가 없다는게 가장 큰 장점입니다. AWS에서 제공하는 인증서를 적용하기 위해서는 몇가지 조건이 있습니다.

1. EC2 인스턴스를 1개 이상 구동 중이다.
2. Route53을 이용 중 이다.
3. ELB(Elastic Load Balancer) 또는 CloudFront를 이용 중 이다.

뭔가 많아보이지만 1, 2번만 기존에 사용중이라면 큰 문제는 없습니다. 3번은 ACM을 적용하기 위한 수단으로 필요한 것이라 진행하면서 소개해드립니다. 저는 ELB로 적용했기 때문에 ELB에 대해서 알려드립니다.

 

ACM을 이용해 인증서 발급 받기
1. AWS 콘솔에서 Security, Identity & Complian > Certificate Manager 를 클릭합니다.
2. 처음 페이지를 접속하면 get started 버튼이 나타나는데 클립합니다.
3. Request a certificate 클릭합니다.
4. 도메인을 입력하는데 모든 서브 도메인에 적용하시려면 *.도메인 (*.abc.com)으로 등록 하시면 됩니다. 그리고 Review and request 클릭,
5. Confirm and request 클릭
6. Continue 클릭
7. 상태가 Pending validation인 것이 보입니다. AWS 계정에 등록된 이메일을 확인하면 인증 메일이 와있습니다. 링크를 클릭한 후 페이지로 돌아와서 새로고침하면 상태가 Issued로 변경됩니다.
8. Issued 상태로 나타나면 발급 완료입니다.

 

ELB를 이용해 발급받은 인증서 적용하기
1. AWS 콘솔에서 Ec2를 선택합니다.
2. 좌측 Load Balancers를 클릭합니다.
3.Create Load Balancer를 클릭합니다.
4. Classic Load Balancer를 선택하고 Continue를 클릭합니다.
5. Load Balancer name에 적당한 이름을 정해 입력하고 Load Balancer Protocol 부분에 Add버튼을 눌러 HTTPS를 추가합니다.
6. SSH(또는 FTP)를 사용하시려면 추가로 TCP를 선택하고 22번 포트를 추가합니다.
7. 오른쪽 하단 Next Assign Security Groups를 클릭합니다.
8. Security Group을 선택하는데 기존에 EC2에 적용한 Security Group을 지정해도 되고 새로 만드셔도 됩니다. 그리고 Next: Configure Security Settings 클릭.
9. Choose an existing certificate from AWS Certificate Manager (ACM) 을 선택합니다.
10. Certificate 에서 ACM으로 발급받은 인증서를 선택합니다.
11. Select a Cipher는 그대로 두고 Next: Configure Health Check 클릭합니다.
12. Health Check Protocol에서 TCP를 선택하고 Next: Add EC2 Instances를 클릭합니다.
13. 적용하고자 하는 EC2 인스턴스를 선택하고 Next: Add Tags를 클릭합니다.
14. Review and Create 를 클릭합니다.
15. 생성이 시작되고 나면 Load Balancers > Description 탭에서  Status: * of * instances in service 또는 Instance 탭에서 Status가 In Service 면 정상 동작하는 것입니다.

* Status가 Out of Service 인 경우 Headth Check에 이상이 있는 것이니 설정된 프로토콜에 포트가 열려있는지 점검을 해봐야 합니다. 저는 HTTP 프로토콜로 Health Check가 정상 동작을 하지 않아 TCP로 방식을 변경했습니다.

 

Route53을 이용해 도메인에 ELB를 연결시키기
1. Route53에서 Hosted Zones를 클릭하고 연결시킬 도메인을 선택합니다.
2. Create Record Set을 클릭하고 Name란에 원하는 Host(서브도메인)을 지정합니다.
3. Alias를 Yes로 선택하고 Alias Target에서 생성한 ELB를 선택합니다.
4. Save Record Set을 클릭합니다.
5. 5분 정도 후에 설정한 도메인으로 접속 테스트를 해봅니다.

* 서버에서 SSL을 위한 Apache나 Nginx 추가 설정은 필요가 없습니다. 신규 도메인인 경우 해당 도메인에 대한 가상호스트(Virtual Host) 설정만 해주면 됩니다.

 

이렇게 3가지 과정으로 나눠집니다. 크게 어려운 부분은 없지만 저는 ELB의 Heath Check 부분에서 정상 동작이 되지 않아 한참 찾아보며 해결을 했습니다.

SSL인증서(ACM)는 무료지만 Route53는 무료가 아닌 점 참고하세요. Route53은 도메인 당 0.5 USD가 매달 과금됩니다. 레코드 갯수는 제한이 없습니다.

[OS X] 맥 기본 터미널로 AWS EC2 터미널 접속하는 방법

맥 환경에서의 첫 포스팅입니다. (드디어 맥북을 장만했습니다.) 덕분에 앞으로 OS X 에 관련한 포스팅도 하게 될 듯합니다.

OS X에서 EC2를 접속하기 위한 준비물은 이렇습니다.

  1. 터미널 프로그램 (기본 터미널 : command + space -> ter -> 엔터)
  2. EC2 키파일(.pem)

준비 되었다면 아래와 같이 세팅합니다.

키파일을 원하는 위치에 복사하고 퍼미션을 400으로 조정합니다. (저는 ~/Desktop/key/로 정했습니다.)

터미널에서 키파일 옵션을 추가한 명령으로 ssh 접속

 

아래는 참고 사항입니다.

  1. pem 파일이 아닌 ppk를 키파일로 사용하는 경우 : SSH 키 비밀번호를 입력을 요구하면서 인증 에러 발생
  2. ssh접속 시 도메인에 아이디를 붙이지 않는 경우 : Permission denied (publickey) 에러 발생

[AWS] CodeCommit (Private Git Repository) 세팅하는 방법

작년 Re:Invent에서 소개된 새로운 툴 중 하나 인 CodeCommit 의 설정과 사용 방법을 소개합니다.

대체적으로 Windows 계열보다는 Linux(Unix) 계열의 OS에서의 사용이 간편합니다.

그렇다고 Linux로 OS로 갈아타기 부담스럽다면 Windows 용 Git 클라이언트를 설치하면 Linux와 동일하게 사용 가능합니다. (Git – Bash라는 이름의 Bash 쉘이 포함되어 있기 때문입니다.)

그럼 Linux 기준으로 설명해드리겠습니다.

 

AWS IAM 계정 생성하기

링크 : https://console.aws.amazon.com/iam

CodeCommit 을 세팅하기 앞서 우선 계정을 생성해야 합니다.
1. “Create New Groups” 으로 계정 그룹 추가

– 사용할 그룹 이름을 지정하고 “Next Step” 클릭
– Attach Policy에서 “AWSCodeCommitFullAccess”와 “IAMUserSSHKeys” 를 선택하고 “Next Step” 클릭
– 지정 내용 확인 후 “Create Group” 클릭하여 그룹 생성 완료

2. “Create New Users” 로 계정 추가

– Enter User Names에 계정 입력. 사용할 계정을 하나 이상 입력하면 됩니다.

3. 좌측 Users 메뉴를 클릭하고 추가한 사용자 계정을 선택합니다.

4. Access Key는 HTTPS 방식으로 pull/push 하는 경우 사용됩니다. 여기에서는 SSH Key 인증 방식을 사용하기 때문에 Access Key 생성을 하지 않고 생략하겠습니다.

5. “Upload SSH public key”를 클릭한 후 공란에 public key(id_rsa.pub) 의 내용을 저장합니다.

* SSH Key는 ssh-keygen 명령을 통해 생성가능 합니다. 패스워드 없이 사용하고 싶은 경우 생성 시 패스워드 설정 없이 엔터만 입력하면 됩니다. Windows 계열의 경우 위에서 언급한 Git – Bash를 이용해 동일하게 생성 가능합니다. 생성되는 위치는 ~/.ssh 이며 Windows의 경우 C:\Users\계정\.ssh 입니다.

6. 업로드가 완료되었다면 SSH Key ID가 나타납니다. 메모장에 복사해둡니다.

7. ~/.ssh 디렉토리에 config 라는 이름의 파일(확장자 없음)을 생성하여 아래 내용을 입력하고 저장합니다. (퍼미션은 600을 권장합니다. Windows의 경우 무관)

8. SSH 설정이 정상적으로 되었는지 테스트 합니다. 아래 명령을 쉘에 입력하고 실행합니다. (Windows의 경우 Git – Bash에서 가능)

9. 아래 문구가 출력되면 정상적으로 동작하는 것입니다.

10. 이것으로 CodeCommit 사용을 위한 계정과 SSH 설정은 완료 되었습니다.

 

AWS CodeCommit – Git Remote Repository 생성하기

1. 상단 Services에서 CodeCommit 을 선택합니다.

2. 현재(2016-01-19) 기준으로는 버지니아 리젼만 존재하기 때문에 다른 지역의 리젼인 경우 버지니아 리젼을 선택하라고 합니다. 버지니아 리젼 클릭.

3. “Create new repository” 클릭

4. 저장소 이름과 설명을 입력합니다. (설명은 생략 가능)

5. 생성하면 리스트에 표시되며 우측 URL 아이콘을 클릭하면 SSH와 HTTPS가 나타납니다. SSH 클릭

6. Git Repository 주소가 나타나며 복사합니다.

7. 쉘에서 아래와 같이 클론 받습니다.

8. 클론을 받으면 당연히 비어있습니다. 이 곳에 파일을 넣고 커밋 합니다.

9. 마지막으로 CodeCommit 원격 저장소에 푸시 합니다.

10. CodeCommit 화면으로 돌아가서 저장소를 클릭해보면 푸시 된 내용들이 표시됩니다.

 

이렇게 CodeCommit 을 이용해 Git 원격 저장소를 세팅할 수 있습니다. 보시면 아시겠지만 과정의 70%이상이 AWS IAM 설정이 대부분이고 가장 중요한 부분입니다.

세팅 이후 개인이 구축한 Git 원격 저장소처럼 자유롭게 사용 할 수 있습니다. 물론 무료는 아니기 때문에 비용에 관련한 부분은 아래 관련 링크를 참고하시기 바랍니다.

 

관련 링크

AWS IAM 메뉴얼(국문)

AWS CodeCommit 메뉴얼(영문)

AWS CodeCommit 비용