ようへいの日々精進XP

よかろうもん

Terraform で既に稼働している EC2 インスタンスに Instance Profile をアタッチする

tl;dr

EC2 を作るときに一緒に Instance Profile をアタッチするサンプルはよく見かけるんだけど, 既に動いている EC2 に Instance Profile をアタッチする場合, Terraform ではどう書くのか調べたのでメモしておきます.

尚, 検証に利用した環境は以下の通りです. 最新でなくてごめんなさい.

$ terraform version
Terraform v0.11.11
+ provider.aws v2.12.0

Your version of Terraform is out of date! The latest version
is 0.12.0. You can update by downloading from www.terraform.io/downloads.html

俺はこうした

残念ながら...

Terraform リソースとして提供されているわけではないので...

terraform import を使う

一旦, 動いている EC2 を terraform 管理下にする為に, terraform import で最低限のリソース定義を取り込んでから追加のパラメータとして設定する必要があります.

resource "aws_instance" "your-instnace01" {
}

↑これだけ書いておいてから, 以下のように terraform import を実行する.

terraform import aws_instance.your-instnace01 i-xxxxxxxx

import した後, 最低限必要なリソース定義と合わせて, iam_instance_profile を定義する. (差分が発生しない状態まで terraform plan を繰り返す.)

resource "aws_instance" "your-instnace01" {
  ami = "ami-xxxxxxxx"
  instance_type = "m4.large"
  iam_instance_profile = "${aws_iam_instance_profile.ec2-instance-profile.name}"
  ebs_optimized = true
  disable_api_termination = true
  tags = {
    Name = "your-instnace01"
    Environment = "production"
  }
}

最低限必要なパラメータは amiinstance_type ですが, 既に稼働しているインスタンスで設定しているパラメータは設定しておく必要があります. 例えば, your-instnace01 であれば...

  • ebs_optimized
  • disable_api_termination

上記の二つのパラメータの定義が必要になりました. ebs_optimizedm4.large では有効になっている為に必要になりますね. disable_api_termination は任意で指定が可能ですが, たまたまこインスタンスは指定されていました.

以上

  • メモでした

Terraform で EC2 タグキーが illegal char で怒られてしまう場合の対応

tl;dr

EC2 (だけではない) と思いますが, Terraform で AWS リソースにタグを付与しようとした場合, コロン等の記号が含まれている場合, 以下のようなエラーとなります.

例えば, 以下のような場合.

resource "aws_instance" "your-instnace" {
...
  tags = {
    Name = "your-instnace"
    amirotate:default = "{\"NoReboot\": true, \"Retention\": {\"Count\": 3}}"
  }
}

amirotate:default がタグキーになりますが, terraform plan すると...

Error: Error parsing ... illegal char

上記のような感じで怒られます. え, タグ登録出来ないやんって思ってしまいますが, 結構簡単に登録することが出来ました.

ということで, 検証に利用した環境は以下の通りです. 最新でなくてごめんなさい.

$ terraform version
Terraform v0.11.11
+ provider.aws v2.12.0

Your version of Terraform is out of date! The latest version
is 0.12.0. You can update by downloading from www.terraform.io/downloads.html

俺はこうした

タグキーをダブルクォーテーションで囲った

以下のような感じ.

resource "aws_instance" "your-instnace" {
...
  tags = {
    Name = "your-instnace"
    amirotate:default = "{\"NoReboot\": true, \"Retention\": {\"Count\": 3}}"
  }
}

後は普通に plan して apply すれば OK.

以上

  • メモでした.

2019 年 06 月 02 日 (日)

ジョギング

山王公園を 40 分くらい. 懸垂 6 回.

hubot

社で利用している hubot のお守り係になってから, 見よう見まねの JavaScript で少しずつ便利が増えてきている感があって嬉しい. デバッグがやりづらいのは悩ましい限り.

博多デート

キャナルシティに買い物に. ランチはキャナルシティ近くの焼肉屋さんでピビン麺. 奥さんは冷麺. 美味しかった. その後, 博多阪急へ. 8 F 催事会場で関西美味いもの市をやっていて串カツを食べて満足.

最強コンビが博多に降臨しました。ほとんど奥さんが食べましたが…

2019 年 06 月 01 日 (土)

ジョギング

自宅から天神博多をグルっと. 45 分. 暑かったりしたのでだいぶんきつかった. 山王公園にゴールして懸垂を 6 回.

奥さんが

高級ホテルで会食ということなので. 自分は近所の中華屋さんで担々麺を細々と.

2019 年 05 月 31 日 (金)

ジョギング

両足のかかと周りに嫌な痛みがあったのでお休み.

奥さん

現在の職場が今日で最後. ほんと, いろいろあったけど奥さんはよく頑張ったと思う. 今はゆっくりして, また, その気になったら働きにいけばいいかな.

会社でプチ呑み会

毎月一回のオフィスでのプチ呑み会. これが地味に楽しくて盛り上がった.

2019 年 05 月 30 日 (木)

ジョギング

山王公園をゆっくりと. 両足のかかと周りに嫌な痛みがある. 懸垂 6 回.

バタバタ

障害があったり, いろいろと忙しい一日だった.

JAWS-UG 福岡もくもく会

いろいろと仕事関係の調べ物.

2019 年 05 月 29 日 (水)

ジョギング

山王公園をゆっくりと. もちょっと長い時間, 心地よく走りたいな. 懸垂 6 回. なかなか上がらない.

Fukuoka.rb

溜まっていた業務 (若干, Ruby にまつわる作業) をやったり. 来週は YAMAP で実施する.

奥さん

通院することになった. 痛そうで辛そう.

インフラ作業でも活用するぞ!キャピキャピ Capistrano は永遠に不滅です (2019 年版)

tl;dr

複数台の EC2 インスタンスに全く同じ作業をやりたくて, みんな大好き Capistrano 3 をセットアップしてみましたのでメモします. 個人的に Capistrano 2 しか使ったことなかったので, だいぶん戸惑いながらもやりたいことは一応出来ました.

俺はこうした

deploy.rb

インフラ関連の作業だと, サーバーにログインして何らかのコマンドを実行することが多いので, 放っておいても execute メソッドが呼ばれまくる以下のような deploy.rb となりました. やりたいことは実にシンプルで, S3 バケット上にアップされている手製の RPM パッケージをサーバー上にダウンロード. ダウンロードした RPM パッケージを yum localinstall だけです.

lock "~> 3.11.0"

namespace 'ec2' do
  desc 'List files.'
  task :ls do
    on roles(:all) do
      execute "ls"
    end
  end
  
  desc 'Get packages.'
  task :get do
    on roles(:all) do
      execute "[ ! -d 'rpms' ] && mkdir rpms || echo 'skip'"
      execute "aws s3 sync s3://some.packages.your.domain/RPMS/ ./rpms/ --region=ap-northeast-1"
    end
  end
  
  desc 'Install packages.'
  task :install, :version do |task, args|
    on roles(:all) do
      within "/home/ec2-user/rpms" do
        execute :sudo, :yum, 'localinstall', '-y', "*#{args[:version]}*"
      end
    end
  end
  
  desc 'List up services.'
  task :services do
    on roles(:all) do
      execute :sudo, :chkconfig, '--list'
    end
  end
  
  desc 'Get service status.'
  task :status, :service do |task, args|
    on roles(:all) do
      execute :sudo, :service, args[:service], 'status'
    end
  end
  
  desc 'Restart service.'
  task :restart, :service do |task, args|
    on roles(:all) do
      execute :sudo, :service, args[:service], 'restart'
    end
  end
end

Capistrano 2 の時代は, 以下の用に run メソッドの後に普通にコマンドをべた書きしていました.

namespace :sample do
  task :taaaaask do
    run 'echo "Hello Servers!!"'
  end
end

最新の Capistrano だと, execute メソッドに続いて, コマンドは symbol で書く必要がありました. (最新でなくても, Capistrano 3 になった時点でこのような書き方になっていたのかもしれません)

namespace :sample do
  task :taaaaask do
    run :echo, 'Hello Servers!!'
  end
end

更に, sudo を絡めたい場合, 以下のように書けば動きました.

  desc 'Restart service.'
  task :restart, :service do |task, args|
    on roles(:all) do
      execute :sudo, :service, args[:service], 'restart'
    end
  end
end

上記のタスクは引数に指定したサービスを再起動するタスクです. 以下のように実行します.

bundle exec cap production restart[oreno-service]

tips

デフォルトタスクの無効化

cap -T でずらずらーっと出力されるデフォルトタスクを無効 (タスク一覧から非表示) にしたいです.

$ bundle exec cap -T
cap deploy                         # Deploy a new release
cap deploy:check                   # Check required files and directories exist
cap deploy:check:directories       # Check shared and release directories exist
cap deploy:check:linked_dirs       # Check directories to be linked exist in shared
cap deploy:check:linked_files      # Check files to be linked exist in shared
cap deploy:check:make_linked_dirs  # Check directories of files to be linked exist in shared
cap deploy:cleanup                 # Clean up old releases
cap deploy:cleanup_rollback        # Remove and archive rolled-back release
cap deploy:finished                # Finished
cap deploy:finishing               # Finish the deployment, clean up server(s)
cap deploy:finishing_rollback      # Finish the rollback, clean up server(s)
cap deploy:log_revision            # Log details of the deploy
cap deploy:published               # Published
cap deploy:publishing              # Publish the release
cap deploy:revert_release          # Revert to previous release timestamp
cap deploy:reverted                # Reverted
cap deploy:reverting               # Revert server(s) to previous release
cap deploy:rollback                # Rollback to previous release
cap deploy:set_current_revision    # Place a REVISION file with the current revision SHA in the current release path
cap deploy:started                 # Started
cap deploy:starting                # Start a deployment, make sure server(s) ready
cap deploy:symlink:linked_dirs     # Symlink linked directories
cap deploy:symlink:linked_files    # Symlink linked files
cap deploy:symlink:release         # Symlink release to current
cap deploy:symlink:shared          # Symlink files and directories from shared to release
cap deploy:updated                 # Updated
cap deploy:updating                # Update server(s) by setting up a new release
cap doctor                         # Display a Capistrano troubleshooting report (all doctor: tasks)
cap doctor:environment             # Display Ruby environment details
cap doctor:gems                    # Display Capistrano gem versions
cap doctor:servers                 # Display the effective servers configuration
cap doctor:variables               # Display the values of all Capistrano variables
cap ec2:get                # Get packages
cap ec2:install[version]   # Install packages
cap ec2:ls                 # List files
cap ec2:restart[service]   # Restart service
cap ec2:services           # List up services
cap ec2:status[service]    # Get service status
cap git:check                      # Check that the repository is reachable
cap git:clone                      # Clone the repo to the cache
cap git:create_release             # Copy repo to releases
cap git:set_current_revision       # Determine the revision that will be deployed
cap git:update                     # Update the repo mirror to reflect the origin state
cap git:wrapper                    # Upload the git wrapper script, this script guarantees that we can script git without getting an interactive prompt
cap install                        # Install Capistrano, cap install STAGES=staging,production

必要なタスクだけを一覧に表示させたいので, 以下のように対象のタスクを .clear メソッドでクリアします.

Rake::Task['deploy:check'].clear
...
Rake::Task['git:wrapper'].clear
Rake::Task['install'].clear

上記のように, 無効にしたいタスクをズラーっと記述したファイル (今回は disable_task.rb を用意) で, deploy.rb から require_relative した. 以下のような感じになります.

require_relative 'disable_task'

lock "~> 3.11.0"

namespace 'ec2-monitor' do
  desc 'List files.'
  task :ls do
    on roles(:all) do
      execute "ls"
    end
  end
...
end

以下のようにデフォルトのタスクを消し去ることが出来ました.

$ bundle exec cap -T
cap ec2:get               # Get packages
cap ec2:install[version]  # Install packages
cap ec2:ls                # List files
cap ec2:restart[service]  # Restart service
cap ec2:services          # List up services
cap ec2:status[service]   # Get service status

以上

  • 一度に複数のサーバーを設定変更して, それが上手く動いた場合, なんだか偉くなった気持ちになるのは何なんでしょうか

2019 年 05 月 28 日 (火)

ジョギング

体調がいまいち. 筋肉痛もなぜかひどかったのでおやすみ.

業務

なんだかバタバタした一日だった. やりたかった作業を家で引き続き.

奥さん

奥歯に強い痛みがあるとのことで, 二回も通院するも, 夜になっても痛みでのたうちまわっていた. いろいろとストレスを抱えていたんだと思う.

2019 年 05 月 27 日 (月)

ジョギング

山王公園を 30 分. 懸垂 6 回.

月曜日

あー, 月曜日という感じでけだるかった.

奥さん

もうすぐ奥さんは無職になる. なんだかんだ言いながら, 某社で良く三年間頑張ったと思う. 最後の最後で感じ悪い終わり方になりそうでとても残念. 奥さんの話だけを聞いてそれを鵜呑みにするのは... と思ったけど, どんな風に聞いても違和感ありまくる感じで奥さんが可愛そうでならない. 本当にかばってあげられなくて申し訳ない気持ちで一杯.