インフラブログ

とあるWEBサイトのインフラを構築運用するメモ

最初のec2インスタンスを作る

AWS management consoleのEC2 Dashboardから早速EC2インスタンスを一つ作り、これをテンプレートマシンと呼ぶことにします。 このテンプレートマシンに一通りのソフトウェア、設定を手でごりごり入れていきます。 アプリケーションサーバが1台ほしいという時になったら、このテンプレートマシンのAMIをベースに「アプリケーションサーバ」という環境変数的なものを与えてマシンを起動するとアプリケーションサーバとして立ち上がってくるというようにします。

色々調べているとChefを使って構成管理をする記事をよく見かけるので、「自分もやりたい!」と思いつつもすぐ「時間足りないかなぁ」となって、使うのは見送っていました。最近になってまた勉強する時間もできそうなのでChefにトライしたいところです。

インスタンス起動後は以下を進めます。手順詳細はここに書かずに、参考になった記事をリンクさせて頂きます。

yum updateする

/etcをgitで管理する

etckeeperを導入します。 手順

dateコマンド打った時に日本時間で表示されるようにする

cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

ruby環境準備

rbenv、ruby-build、ruby2.1(当時は2.0)を入れる 手順

シェルからAWSのコマンドを使えるようにする

このインスタンスのシェル上からAWSAPIを叩けるようにします。 AWS-CLIパッケージはインストール済みだったので、与えたれたアクセスキー、シークレットアクセスキー等を設定します。 手順

$aws configure
AWS Access Key ID [****************]: ***
AWS Secret Access Key [****************]: *** 
Default region name [ap-northeast-1]: ap-northeast-1
Default output format [text]: text

すると~/.aws/configが生成されます。

[default]
aws_access_key_id = ***
aws_secret_access_key=***
output = text
region = ap-northeast-1

awsからはじまるコマンドが使えるようになります。 as-、ec2-、rds-から始まるコマンドは昔のもので今はawsに一新されたようです。

AWS SDK for rubyはRuby2.1を入れた後gem installで入れます。

このインスタンスのAMIを定期的に作成できるようにする

任意のインスタンスのAMIを作成するスクリプトを用意します。 AWS manegement consoleからAMI削除、AMI作成をするのが手間だったので、スクリプトにしました。 インスタンスの改造作業の前にスクリプトを実行したり、cronで定時バックアップするようにしておきます。

Ruby環境な会社なので、私も見習ってRuby使っていきます!

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require "aws-sdk"

AWS.config(YAML.load(File.read("config.yml")))

machine_names = [
  "template",
 ]

machine_names.each {|name|
  AWS::EC2.new.images.filter("name", name).each{|ami|
    p "deregister ami name: #{name}, ami_id: #{ami.id}"
    if ami.deregister
      p "success"
    else
      p "fail"
    end
  }
  AWS::EC2.new.instances.tagged("Name").tagged_values(name).each{|ins|
    p "create ami name: #{name}, ec2_id: #{ins.id}"
    new_ami = ins.create_image(name, {:description => Time.now.to_s, :no_reboot => true})
    if new_ami && new_ami.tag("template", :value => name) 
      p "success"
      p "ami.id: #{new_ami.id}"
    else
      p "fail"
    end
  }
}