雑記

インフラのことだったりプログラムのことだったりどうでもいいこと書いたり。要は雑記。

ChatOpsとTerraformについて発表しました

それぞれの資料はこちら

両方ともこれから始める人むけの資料です。

ChatOpsもTerraformも、うまく使いこなせれば生産性や効率が格段に上がります。

それなのになかなか導入しているところが少ないのは、やっぱり会社の文化や業務の適不適はあるのかなーと気がしますが、そしてそこを押し通すのはすごい努力がいりますが、それ以外の「なんか怖い」「難しそう」などなど技術的な障壁がある人に本資料が役立てれば、嬉しいなーと思います。

とはいえ自分もまだまだ完璧に使いこなせているかといえばそうでもないので、日々勉強中です。

また知見が溜まったらどこかで発表したいですね。

CircleCIでAndroidのビルドが失敗する

いつも通りにビルドしたら以下のメッセージがでた。

Could not find com.android.support:appcompat-v7:22.2.1.

Androidのsupportライブラリがみつからないとか。

対処

明示的にライブラリをアップデートするように指定

  • 変更前
dependencies:
  override:
    - echo y | android update sdk --no-ui --all --filter "android-22,build-tools-21.1.2"
  • 変更後
dependencies:
  override:
    - echo y | android update sdk --no-ui --all --filter "android-22,build-tools-21.1.2,extra-android-m2repository,extra-android-support"

Terraformで最低限のAWS環境を作ってみた

タイトル通り。

Terraformってなに?

インフラの構成をコード化するもの。

AWSに限っていうと、VPCやSecurityGroup、GatewayからEC2などなどをコード化できる。 (Terraform自体はAWSだけでなく、DigitalOceanやHerokuなど各種サービスに対応している)

サーバの中身をコード化するChefやAnsibleなどとはそもそも異なる。

Terraform by HashiCorp

インストール

Macの場合はHomebrewで一発

% brew install terraform

2015/07時点の最新版である0.6がインストールされた。 以降、0.6でのお話し。

設定

tfファイルで構成を定義する。 以下、AWSインスタンスを作成する設定サンプル。

# Credential
provider "aws" {
    access_key = "xxxxxxxxxx"
    secret_key = "xxxxxxxxxx"
    region = "ap-northeast-1"
}

# Create instance
resource "aws_instance" "sample" {
    ami = "ami-cbf90ecb" # Amazon Linux AMI 2015.03 (HVM), SSD Volume Type
    instance_type = "t2.micro"
    tags {
      Name = "sample"
    }
}

コマンド

作成したtfファイルを元に適用のテストをする(ようはdry-run)

% terraform plan

作成したtfファイルを元に構成を適用する

% terraform apply

構成を全て破棄する

% terraform destroy

構成を確認する

% terraform show

試しに

AWSで一通りの構成を作ってみた。

github.com

これで作れるものは以下。

  • Key Pairs
  • VPC
  • Subnets
  • Internet Gateway
  • Route Tables
  • Security Groups
  • EC2
  • ELB

気になったこと

tfstateファイルについて

terraform applyを実行すると、tfstateファイルが作成されます。

こいつが現在の生の構成を把握するファイルみたいなので、複数人で利用する場合は統一する必要があります。

インスタンスの設定変更について

EC2インスタンスを一度立ち上げた後に設定を変更する場合、なんと一度Destroyしてからの再作成となります。 SecurityGroupを追加してもそうなりました(ただ、タグの追加は大丈夫でした) 完璧にImmutable化できているのなら大丈夫ですが、そうでない場合やインスタンスの用途がDB系である場合は要注意かと思います。

感想

使ってて気持ちいい。 apply -> destroy -> applyして全く同じ環境ができるのはちょっと感動。 初めて構成管理ツール使った時の感覚を思い出しました。

とりあえずは軽めのところから実践投入する予定。

ImageMagick-lastをAmazonLinuxにインストールする

AmazonLinuxでインストールできるImageMagickは若干バージョンが古いです。 最新版をパッケージでインストールするにはremiから入れればいいのですが、普通にやると依存関係でエラーがでます。

エラー: パッケージ: ImageMagick-last-libs-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: libHalf.so.6()(64bit)
エラー: パッケージ: ImageMagick-last-libs-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: libIlmImf.so.6()(64bit)
エラー: パッケージ: ImageMagick-last-libs-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: libgdk_pixbuf-2.0.so.0()(64bit)
エラー: パッケージ: ImageMagick-last-libs-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: libIex.so.6()(64bit)
エラー: パッケージ: ImageMagick-last-libs-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: librsvg-2.so.2()(64bit)
エラー: パッケージ: ImageMagick-last-devel-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: OpenEXR-devel(x86-64)
エラー: パッケージ: ImageMagick-last-libs-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: libImath.so.6()(64bit)
エラー: パッケージ: ImageMagick-last-libs-6.9.1.2-1.el6.remi.x86_64 (remi)
             要求: libIlmThread.so.6()(64bit)

手取り早く解決するためにCentOSのBaseレポジトリを利用すればよいです。

レポジトリの追加

CentOS-Base

[base]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

remi

ImageMagick-lastを入れるために利用

# yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

インストール

これでImageMagick-lastをインストールすればよいと思いきや、今度はlibwebpで依存関係がでます。 AmazonLinuxだとlibwebpのバージョンが0.3だから? なので、epelからwebpをインストールするようにすればOKです。

先にlibwebpだけをインストール。

# yum install libwebp-devel --enablerepo=epel --disablerepo=amzn-main

で、ImageMagickをインストール

# yum install ImageMagick-last ImageMagick-last-devel --enablerepo=epel,base,remi

参考

AWS SDK for GOを使ってRoute53のレコードを取得する

タイトル通り、サンプル作ってみました

環境

% go version
go version go1.4.2 darwin/amd64

準備

  • パッケージの取得
% go get -u github.com/aws/aws-sdk-go/
% go get -u github.com/vaughan0/go-ini

go-iniはaws-sdk-goのcredentialsで使ってるらしく、いれていないと以下のエラーがでる

../../../../.golocal/src/github.com/aws/aws-sdk-go/aws/credentials/shared_credentials_provider.go:8:2: cannot find package "github.com/vaughan0/go-ini" in any of:
        /usr/local/Cellar/go/1.4.2/libexec/src/github.com/vaughan0/go-ini (from $GOROOT)
        /Users/ogawa-masaki/.golocal/src/github.com/vaughan0/go-ini (from $GOPATH)
  • クレデンシャルの設定
% cat ~/.aws/credentials
[default]
aws_access_key_id = xxxxxxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

サンプル

登録しているレコード情報を表示するだけです。

package main

import(
    "fmt"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/awsutil"
    "github.com/aws/aws-sdk-go/service/route53"
)

func main() {
    domain := "example.internal."

    client := route53.New(&aws.Config{})

    // domainからHostedZoneIDの取得
    hzresp, err := client.ListHostedZonesByName(&route53.ListHostedZonesByNameInput{DNSName: aws.String(domain),})
    if err != nil {
        panic(err)
    }
    HostedZoneID := hzresp.HostedZones[0].ID

    // ResourceRecordSetsを取得
    rrsresp, err := client.ListResourceRecordSets(&route53.ListResourceRecordSetsInput{HostedZoneID: HostedZoneID})
    if err != nil {
        panic(err)
    }

    // 出力
    for i := range rrsresp.ResourceRecordSets {
        fmt.Println(awsutil.StringValue(*rrsresp.ResourceRecordSets[i]))
    }
}

AWS SDK for GOもついにPreview版となりましたし、どんどん活用していきたいですね。