Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

이유

AWS에서 제공하는 ruby sdk를 이용해서, AWS에서 제공하는 서비스들의 사용방법을 익혀보려 한다.

설치

환경

설치 환경은 다음과 같다.
  • Ubuntu Linux 12.04
  • Ruby 1.8.7

설치

gem으로 설치전에 아래의 패키지들이 설치돼 있는지 확인한다.
  • libxslt1, libxslt1-dev
  • libxml2, libxml2-dev
gem으로 간단히 설치할 수 있다.
# gem install aws-sdk
Building native extensions.  This could take a while...
Fetching: aws-sdk-1.8.0.gem (100%)
Successfully installed nokogiri-1.5.6
...

Access Key 생성

REST 혹은 Query 프로토콜을 이용해서 AWS 서비스 API를 실행하려면, account에 대한 Access key를 만들어야 한다. Access key는 http://aws.amazon.com/security-credentials 에서 만들 수 있다.

https://lh6.googleusercontent.com/-28I4Z75srys/UQKsbA2bpFI/AAAAAAAACv8/emy9KX6wmmk/s800/%25EC%258A%25A4%25EB%2583%2585%25EC%2583%25B75.png

Access Key IDSecret Access Key를 이용해서 SDK에서 API를 호출할 수 있다.

EC2

EC2는 Elastic Computing Cloud의 줄임말로 컴퓨팅파워를 제공하는 서비스라고 할 수 있다. 컴퓨팅파워라 함은 우리가 일반적으로 알고 있는 컴퓨터의 구성요소인 CPU, 메모리, Disk와 같은 물리적인 장치를 의미한다. 가상화서비스의 클라우드 버전이라고 하면 더 이해가 쉬울 것 같다.

다음은 새로운 EC2 인스턴스를 만드는 간단한 루비코드다.
#!/usr/bin/ruby
require 'rubygems'
require 'aws-sdk'
require 'pp'

AWS.config(
    :access_key_id => 'MY_ACCESS_KEY_ID',
    :secret_access_key => 'MY_SECRET_ACCESS_KEY',
    :ec2_endpoint => 'ec2.ap-northeast-1.amazonaws.com')
ec2 = AWS::EC2.new

i = ec2.instances.create(:image_id => "ami-4f77129ff")

기본 설정

먼저 AWS.config를 이용해서 EC2인스턴스를 생성하기 위한 AWS환경 설정을 한다. 여기에서는 config 메서드를 이용해서 엑세스키와 시크릿트키, 리전(ec2_endpoint)등을 명시 했는데, EC2.new 메서드에서 설정하는 방법도 있다.
AWS::EC2.new(
    :access_key_id => 'MY_ACCESS_KEY_ID',
    :secret_access_key => 'MY_SECRET_ACCESS_KEY',
    :ec2_endpoint => 'ec2.ap-northeast-1.amazonaws.com'
)

인스턴스 관리

인스턴스를 만들어 보자.
i = ec2.instances.create(:image_id => "ami-4f77129ff")
sleep 1 while i.status == :pending
image_id에 인스턴스를 위한 AMI 이름을 명시한다. 인스턴스를 만들면, 인스턴스가 실행상태(running)가 되기전까지는 pending 상태가 된다. 위 코드는 pending 상태를 검사하고 있다.

인스턴스의 status 값은 다음과 같다.
  • stopped : 멈춘 상태
  • pending : 인스턴스 생성중인 상태
  • running : 인스턴스가 실행중인 상태
  • terminated : 인스턴스가 파괴된 상태. EC2 인스턴스는 파괴명령을 내린뒤에도 일정시간 유지된다. 유지되는 기간동안에는 인스턴스를 복구할 수 있다.
인스턴스목록과 정보를 가져와 보자.
ec2.instances.inject({}) do |m, i| 
    puts "#{i.id} : #{i.status}"
end
출력결과는 대략 아래와 같다.
i-xxxxxxxx : stopped
i-xxxxxxxx : stopped
i-xxxxxxxx : terminated
i-xxxxxxxx : pending

기타 정보들

Instance는 tag를 가지고 있다. Tag는 추가 정보 형태로 사용할 수 있는데, 인스턴스에 이름을 주는게 가장 대표적이다. AWS admin consol에서 인스턴스 목록을 보여줄 때, "Name"필드에 인스턴스 이름을 편집할 수가 있다. add_tag를 이용해서 관리 가능하다.
i = ec2.instances.create(:image_id => 'ami-4e6cd34f')
sleep 1 while i.status == :pending
i.add_tag('Name', :value=>'My instance')
이제 생성된 인스턴스의 이름이 "My instance"로 보이는 걸 확인할 수 있을 것이다.

Security group

EC2는 L3 네트워크로 구성된다. Zone 밑에 있는 모든 인스턴스는 개방된 네트워크 구조에 묶이게 된다. 따라서 인스턴을 isolation할 수 있는 방법은 방화벽이 유일하다. Security group는 방화벽 정책의 묶음이라고 보면된다.

먼저 Security group을 만든다.
ec2 = AWS::EC2.new
websvr = ec2.security_groups.create('webservers')
Security group을 만들었으면, 여기에 방화벽 규칙을 넣으면 된다. 입력 포트에 대한 방화벽 구칙을 하나 추가했다.
websvr.authorize_ingress(:tcp, 80)
포트범위로 추가할 수도 있다.
websvr.authorize_ingress(:tcp, 20..21)

CIDR을 이용해서, IP 대역에 대한 방화벽 규칙을 설정할 수도 있다.
websvr.authorize_ingress(:tcp, 22, '1.1.1.0/24', '2.2.2.0/24')

만들어진 security group에 룰을 추가하려면, filtering으로 security group을 검색한다음 룰을 추가하면 된다.
websvr = ec2.security_groups.filter('group-name', 'websvr').first
websvr.authorize_ingress(:tcp,8080)
참고로 규칙은 덮어쓰는게 아니고, 추가된다.

revoke_ingress 메서드를 이용해서 룰을 삭제할 수 있다.
websvr = ec2.security_groups.filter('group-name', 'websvr').first
websvr.revoke_ingress(:tcp,8080)

Elastic IPs

EC2에서 만들어지는 모든 인스턴스는 public ip를 가진다. 하지만 이 public ip는 고정된 ip가 아닌, 유동적인 ip다. 만약 인터넷 서비스를 원한다면, elastic ip 서비스를 이용해서 고정 ip를 할당받아야 한다.

EIP를 사용하려면 EIP의 작동방식을 이해할 필요가 있다. EIP는 유에 할당되는 자원이다. 유저가 EIP를 할당하면, AWS는 EIP 풀에서 남는 IP 하나를 떼어내서 유저에게 할당한다. IP를 할당 받은 유저는 역시 자신의 EIP 풀에서 IP를 관리하게 된다. 유저는 필요할 때, instance에 EIP를 할당하거나 회수할 수 있다.

EIP 요청(allocate). AWS는 EIP 풀에서 사용할 수 있는 ip 자원을 하나 빼서 유저에게 할당한다.
ip = ec2.elastic_ips.allocate

EIP 회수 (release). 사용하지 않는 EIP를 AWS에 되돌려준다.
ip = ec2.elastic_ips.allocate
ip.release

Instancee에 eip를 할당해보자.
instance = ec2.instances['i-12345678']

instance.ip_address   # 현재 인스턴스의 ip
ip.ip_address         # elastic ip풀에서 가져온 ip

instance.associate_elastic_ip(ip)  # ip를 할당한다.
puts instance.ip_address   # elastic ip 풀에서 가져온 ip가 출력될 것이다.

instance.disassociate_elastic_ip   # elastic ip를 해제한다.

Key pair

AWS instance를 만들면서, ssh 연결을 위해 사용할 private key 파일을 만들 수 있다. 이렇게 만들어진 private key 파일은 로컬 컴퓨터에 저장해서 ssh나 putty 같은 툴을 이용해서 접속하면 된다.

AWS 사용자는 하나이상의 key-pair를 만들수 있다. 그리고 인스턴스를 생성할 때, 만들어진 key-pair 중 하나를 선택해서 적용할 수 있다.
ec2 = AWS::EC2.new
key = ec2.key_pairs.create 'mykey'
puts key.name           # mykey 
puts key.fingerprint    # mykey의 fingerprint
puts key.private_key    # private key. 이 key로 instance에 접근할 수 있다.

Key-pair는 인스턴스 생성시에 적용할 수 있다.
i = ec2.instances.create(
    :image_id => image_id,
    :subnet => ec2.subnets[subnet_id],
    :instance_type => 'm1.large',
    :key_name => 'mykey',
    :private_ip => private_ip,
    :security_group_ids => { security_group_id })

IAM

IAM(Identity and Access Management)의 줄임말로 AWS에서 제공하는 사용자 관리 서비스다. 구성 인프라의 규모가 클 경우, 다양한 목적을 가진 조직이나 사용자 그룹이 만들어질 것이다. 예를 들어 규모가 큰 인터넷 서비스라면, 개발조직, 운영조직, DBA, QA등이 인프라에 관여할 것이다. 이들 조직은 서로 독립된 고유의 권한을 가질 수 있어야 한다.

IAM으로 할 수 있는 일은 다음과 같다.
  • 새로운 IAM user 추가. IAM user는 다른 유저로 부터 독립된다. 다른 유저의 자원에 접근할 수 없다.
  • 추가된 IAM user에 role 기반의 권한 부여.
  • 조건부 사용자 엑세스 : 시간, 발신 IP주소, 사용 프로토콜(SSL)등으로 AWS에 대한 접근 권한을 제어할 수 있다.
IAM은 독자적인 security key를 가질 수 있는데, 이를 이용해서 인프라 접근 관리를 할 수 있다. 예를 들어 dev, staging, service 인프라를 관리한다고 가정해보자. dev 인프라 관리자 혹은 개발자는 dev 자원에만 접근할 수 있어야 할 것이다. 이 경우 dev와 staging, service를 위한 IAM을 만들고, IAM을 위한 security key를 생성하는 식으로 권한을 제어할 수 있다.

IAM 정보를 얻어와 보자.
AWS.config(
    :access_key_id => 'xxxxxxxxxxxxxxxxx',
    :secret_access_key => 'xxxxxxxxxxxxxxxxxxxxxxxxx',
    :ec2_endpoint => "ec2.ap-northeast-1.amazonaws.com")

iam = AWS::IAM.new
summary = iam.account_summary
puts "Num users : #{summary[:users]}"
puts "Num user quota : #{summary[:users_quota]}"
실행 결과다. 아직 IAM 유저를 만들지 않은 관계로 Num users는 0이 나왔다.
Num users : 0
Num user quota : 5000
Num user quota는 생성할 수 있는 IAM 유저의 수다.

iam.account_summary에서 사용할 수 있는 key들을 출력해 봤다.
{:roles_quota=>250,
 :group_policy_size_quota=>5120,
 :roles=>1,
 :signing_certificates_per_user_quota=>2,
 :groups_quota=>100,
 :groups_per_user_quota=>10,
 :mfa_devices_in_use=>0,
 :users=>0,
 :user_policy_size_quota=>2048,
 :instance_profiles=>0,
 :groups=>0,
 :assume_role_policy_size_quota=>2048,
 :role_policy_size_quota=>10240,
 :access_keys_per_user_quota=>2,
 :server_certificates_quota=>10,
 :account_mfa_enabled=>0,
 :instance_profiles_quota=>100,
 :mfa_devices=>0,
 :users_quota=>5000,
 :server_certificates=>0}

Account와 IAM users와의 관계

  1. Account는 하나 이상의 user를 가질 수 있다.
  2. User가 가지는 aws resource는 다른 user로 부터 독립된다.
  3. Account는 super user의 권한을 가진다. 모든 유저의 자원을 관리할 수 있다.

IAM 권한 정책

IAM API를 제대로 이용하려면 IAM 권한정책을 이해해야한다. IAM 권한은 role 기반이다. AWS에 준비된 role을 IAM user에게 할당하는 것으로 권한을 설정할 수 있다.

Create New Role을 이용해서 새로운 role를 만들 수 있다. Role 이름을 입력하고 나서, role 타입을 선택한다. 타입에는 EC2, Elastic transcoder, Data pipelin등 권한설정을 위한 AWS 자원 카테고리가 있다. 타입을 선택한 다음에는 권한을 줄 수 있는데, 미리 권한이 설정돼 있는 Policy Template 에서 하나를 선택하거나 자신만의 template를 직접 만들 수도 있다. 결국 리소스와 선택한 리소스에 대한 권한 설정이 IAM의 핵심이다.

IAM 유저및 그룹 관리

AWS 어카운트는 하나 이상의 유저를 만들 수 있으며, 유저별로 권한을 관리할 수 있다. 또한 그룹을 만들 수도 있다.

joinc 그룹과 yundream 유저를 만들었다.
iam = AWS::IAM.new

user = iam.users.create('yundream')
group = iam.groups.create('joinc')

yundream 유저를 joinc 그룹에 포함시켰다.
iam = AWS::IAM.new
user = iam.users['yundream']
group = iam.groups['joinc']
group.users.add(user)

Access Keys와 secret key

각 어카운트와 유저는 2개씩의 access key id와 access key id를 위한 secret key를 가질 수 있다. 이 key를 함께 사용하거나 혹은 roate 해서 사용할 수 있다.

유저는 access key id와 secret key를 이용해서 IAM user 권한을 획득할 수 있다. 주의할 점은 secret key는 처음 access key를 생성한 시점에만 값을 확인할 수 있다는 점이다. 그러므로 처음 access key를 생성할 때, secret key를 다운로드해서 어딘가에 저장해 둬야 한다. 참고로 이 정책은 key pairs에도 적용이 되는데, key pairs도 생성시에만 pem key를 확인할 수 있다. 이렇게 하는 이유는 key 보안 때문이다.
iam = AWS::IAM.new
user = iam.users.create('yundream')
key = user.access_keys.create
pp key.user_name
pp key.access_key_id
# secret key는 어딘가에 저장해 둬야 한다. 
pp key.secret
end

Policy

유저를 만들었으면, 자원 접근에 대한 권한 정책을 만들어야 한다. 권한 정책은 IAM 유저와 별개의 객체로 따로 만들어서 관리한다. 정책들을 만들어 놓은 다음에, 유저에 적당한 정책들을 attach 하는 스타일이다.

... 계속

히스토리

  • 작성일 :