コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

CodeDeployのコマンドとやっていることのうちわけと手動実行

備忘メモ

CodeDeployの実行コマンドのうちわけ

Code Deployで行うのは aws deploy pushaws deploy create-deployment の2つのコマンドを実行して行う。

おおまかにいうと push のほうで…

  • コマンドが実行されたカレントディレクトリをzip化する
  • そのzipをS3にアップロードしてリビジョン紐付けをする
  • 直ぐに実行できるように、オプション付きの create-deployment のコマンドを出力する

を行い、出力したコマンドを打つとCode Deployが実行されるという仕組みになっている。

手動実行する

aws deploy push \
--region=ap-northeast-1 \
--application-name sampleapp  \
--no-ignore-hidden-files  \
--s3-location s3://sampleapp-deployment/{ユニークになるような文字列}

aws deploy push \
--region=ap-northeast-1 \
--application-name sampleapp  \
--no-ignore-hidden-files  \
--s3-location s3://sampleapp-deployment/demopush01

実行するとこんな感じのコードで出力されます

$ aws deploy push \
> --region=ap-northeast-1 \
> --application-name sampleapp  \
> --no-ignore-hidden-files  \
> --s3-location s3://sampleapp-deployment/demopush01
To deploy with this revision, run:
aws deploy create-deployment --application-name sampleapp --s3-location bucket=sampleapp-deployment,key=demopush01,bundleType=zip,eTag=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-4 --deployment-group-name <deployment-group-name> --deployment-config-name <deployment-config-name> --description <description>

出力結果をコピーして < > で囲われている部分を編集します。

aws deploy create-deployment --application-name sampleapp \ 
--s3-location bucket=sampleapp-deployment,key=demopush01,bundleType=zip,eTag=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-4 \
--deployment-group-name master \
--description "demo release" 
# --deployment-config-name は元のdeployment-groupの設定に従うので削除

上記のようなコマンドを打つと、以下のようになります。

$ aws deploy create-deployment --application-name sampleapp \
> --s3-location bucket=sampleapp-deployment,key=demopush01,bundleType=zip,eTag=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-4 \
> --deployment-group-name master \
> --description "demo release" 
{
    "deploymentId": "d-Y71ZZZZZ"
}

deploymentIdが発行されるので、あとはCodeDeploy側の画面を見ながら進むのを待ちます。

参考リンク

CodeDeploy pushコマンドは裏で何をやっている? | DevelopersIO

Gmailには即時送らず、送信ボタンを押してから間をおいて送信する「送信取り消し」の設定があり、時間も調整できる。

Slack全盛のこの時代にメールコミュニケーションしないことも多いエンジニア陣こそ知っておいたほうがいい豆知識

オプションの場所

右上の歯車マークから

f:id:shinkufencer:20190915183040p:plain

ちょっと上の方に「送信取り消し」という設定がある。ここで最大30秒まで設定できる

f:id:shinkufencer:20190915183101p:plain
初期値は5秒

オプション設定するとどうなるのか

送信ボタンを押したあとにしばらく「取り消し」の表示が出る

f:id:shinkufencer:20190915183135p:plain

取り消しをすると下書きから再開できる

これを行うことのメリット

うっかり「あ、間違って送信ボタン押しちゃった!」とか「あれ、あの人入れてたっけ」などの送信直後に不安になったときに戻せる。前者のUI操作ミス系は割と起こるので設定しておくと便利。

参考リンク

BlueGreenDeploymentをざっくりまとめる

ブルーグリーンデプロイとか呼ばれるもの。青と緑のつかいわけを忘れるのでざっとまとめる

出典

BlueGreenDeployment

ざっくりまとめ

  • 現在動いているサーバー環境を「ブルー環境」
  • 新しいソフトウェアが入ったサーバー環境を「グリーン環境」

として、ルーターなどの上流の部分ででブルー環境からグリーン環境に切り替えてデプロイ(≒リリース作業)を行うというもの

利点

  • ルーターで切り替える前にグリーン環境の状態確認ができる
  • 差し替え前のブルー環境は稼働したままなので即座にデプロイ前に戻すことができる

欠点

  • 環境として2系統できあがるので、その分のコストがかかる
  • デプロイの度に環境をセットアップするのでデプロイ時間は長くなる傾向にある

参考リンク

Rubyでパーセント記号を使って作れる配列とその種類

Ruby Style Guideに則っているとよく自動変換されちゃうあれ。

環境

$ ruby -v
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

出典

リテラル (Ruby 2.6.0) - %記法

文字列を扱う%wと%W

配列の要素が全て文字列のものの場合に使うことができ、要素を空白区切りで指定する。

not_parsent = ["a", "b", "c"]
# 空白区切りで表現
parsent= %w(a b c)

# 同じものである
not_parsent == parsent
# true

%W になると変数が展開できる

string = "hoge"
not_parsent = ["example", "hoge", "test"]
# 空白区切りで表現
parsent= %W(example #{string} test)

# 同じものである
not_parsent == parsent
# true

シンボルを扱う%iと%I

配列の要素がシンボルだけのものの場合に要素を空白区切りで指定する。

not_parsent = [:a, :b, :c]
# 空白区切りで表現
parsent= %i(a b c)

# 同じものである
not_parsent == parsent
# true

%I になると%W同様に変数が展開できる

string = "hoge"
not_parsent = [:example, :hoge, :test]
# 空白区切りで表現
parsent= %I(example #{string} test)

# 同じものである
not_parsent == parsent
# true

参考サイト

bashのワンライナーでディレクトリをcdしたいときは -c を用いると簡単に実現できる

dockerやらなんやらで相対的にパスを扱いたいひとのためのワンライナー

環境

$ bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.

やりたいこと

cdをしたあとにコマンドを実行し、かつコマンドを実行したシェルはcdしたくない。

やりかた

-c オプションを使う、man曰く以下のような動き

If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.

Google和訳すると

-cオプションが存在する場合、コマンドはstringから読み取られます。文字列の後に引数がある場合は、$0から始まる位置パラメータに割り当てられます。

ということで以下のコマンドで実現できる

$ pwd
/Users/watashi_user
$ sh -c "cd /tmp/; pwd"
/tmp
$ pwd
/Users/watashi_user

発展型

sudo -i をしたときでもできるのでAWS環境などでは便利

$ sudo -i sh -c "cd /tmp/;whoami; pwd"
root
/tmp

参考リンク

sidekiqをbundlerで実行するとき、RailsRoot以外のディレクトリで行う場合はオプション指定が必要

怒られたのでメモ

環境

sidekiq (5.0.0)

実例

下記のように書くとご丁寧にオプション付きで -r をつけろ と怒られる

$ /home/washi/example_app/bin/bundle exec sidekiq
2019-09-04T00:10:14.527Z 26140 TID-gqpwpb3so INFO: ==================================================================
2019-09-04T00:10:14.527Z 26140 TID-gqpwpb3so INFO:   Please point sidekiq to a Rails 3/4 application or a Ruby file
2019-09-04T00:10:14.527Z 26140 TID-gqpwpb3so INFO:   to load your worker classes with -r [DIR|FILE].
2019-09-04T00:10:14.527Z 26140 TID-gqpwpb3so INFO: ==================================================================
INFO: sidekiq [options]
    -c, --concurrency INT            processor threads to use
    -d, --daemon                     Daemonize process
    -e, --environment ENV            Application environment
    -g, --tag TAG                    Process tag for procline
    -i, --index INT                  unique process index on this machine
    -q, --queue QUEUE[,WEIGHT]       Queues to process with optional weights
    -r, --require [PATH|DIR]         Location of Rails application with workers or file to require
    -t, --timeout NUM                Shutdown timeout
    -v, --verbose                    Print more verbose output
    -C, --config PATH                path to YAML config file
    -L, --logfile PATH               path to writable logfile
    -P, --pidfile PATH               path to pidfile
    -V, --version                    Print version and exit
    -h, --help                       Show help
$

ヘルプ通り、RailsのRootを指定すればいいので、指定してあげる

$ /home/washi/example_app/bin/bundle exec sidekiq -r  /home/washi/example_app/

余談

なお、Demonizeする --daemon と組み合わせるとエラーが出たが、環境依存かどうかは不明。。

関連リンク

MySQLのdatetimeとdateで比較した場合、date側に00:00:00の時刻情報が追加される

どういう仕組みかわからなかったので調べた

環境

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.24, for osx10.14 (x86_64) using  EditLine wrapper

マニュアル曰く

マニュアルには以下のようにある

DATE 値には時間情報が含まれないので、DATETIME または TIMESTAMP 値に変換すると、'00:00:00' の時間部分が追加されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.3.7 日付と時間型間での変換

考慮すべきケース

Railsなどではおなじみ created_at 、こちら大体は datetime の型で作成されるが、そこに対して 2019-08-17 以前のデータを取ろうとして以下のようなSQLを書く

SELECT * FROM users WHERE created_at <= "2019-08-17";

直感的には取れそうだが、下記と同義になるため、実際は意図と異なってしまう

SELECT * FROM users WHERE created_at <= "2019-08-17 00:00:00";

関連リンク