長生村本郷Engineers'Blog

千葉県長生村本郷育ちのエンジニアが書いているブログ

AWS ECS prefix 指定してまとめてタスク登録解除

概要

awscli でタスク定義のまとめて登録解除がなかったので簡単に Shell 化しました

gist.github.com

実行

sh deregister_all_tasks_filtered_by_family_prefix.sh <profile> <task definition family prefix>

サクッと削除

Docker入門

Docker入門

AWS Vault で複数アカウントにMFA認証通過

f:id:kenzo0107:20180514221849j:plain

AWS Vault とは?

AWS Vault は IAMの認証情報 (Access Key Id, Secret Access Key) を安全に OS のキーストアに保存しアクセスできる仕組みを提供するツールです。

Vault = 金庫 というだけあって PC 落としても秘匿情報が漏れにくい仕組みにしてくれます。

今回の目的

AWS Vault で複数アカウントのコンソールログインを簡単にしたいと思います。
AWS IAM を頂く際に MFA 設定をしているかと思います。

バイス認証することでセキュアなアカウントを管理をする為です。

その際に、以下の様なアプリをインストールし
1分置きに更新される 6桁 の数字で認証する仕組みにします。

MFA 自体は
その会社の開発ポリシーにも依りますが、入れておいて損なしの仕組みです。

ただ、毎回 6桁の数字をコピぺするのは面倒です。

それを簡易的に認証通過する様にしました。

aws-vault インストール

macOS%$ brew cask install aws-vault

profile 設定

aws-vault add <profile>
Enter Access Key ID: <Access Key ID 入力>
Enter Secret Access Key: <Secret Access Key 入力>

事前準備

brew tap peco/peco
brew install peco

bash 設定

ご利用の .bashrc, .zshrc 等に設定してください。

function peco-login-aws-account() {
    local account=$(aws-vault ls | awk 'NR>2 {if ($2 != "-") print $2}' | peco)
    aws-vault login $account
}

function peco-aws-exec() {
    local account=$(aws-vault ls | awk 'NR>2 {if ($2 != "-") print $2}' | peco)
    echo -e "aws-vault exec \"$account\" -- \\" | pbcopy
}

alias avl='peco-login-aws-account'
alias ave='peco-aws-exec'

使い方

  • 設定した profile を選択して Login
avl
  • 設定した profile を選択してコマンド実行
ave

実際のコマンドを rec して出すのは憚れる内容でしたので貼り付けられず汗

是非一度利用し使用感を試してみてください♪

毎回パスワード入力というのも辛いところではありますが
MFA の手間に比べれば数段楽です。

AWS Vault は本来はそういう意図ではないと思いますが
楽になるならば良し♪

続 ECR にログイン(aws ecr get-login)無しでプッシュする

概要

前回 ECR への Docker イメージをプッシュする際の認証コマンドを実行せずにプッシュできる様にしました。

kenzo0107.hatenablog.com

ですが、 設定が手間というのがあり、CircleCI, AWS CodeBuild 等でワンライナーでささっと書きたいときには不便です。

解決

awscli profile で設定した profile を利用し ecs-cli を利用することで認証をよろしくやってくれます。

ecs-cli push <image> --aws-profile <profile> --region <region>

設定 Step

aws configure set --profile hogehoge aws_access_key_id $ACCESS_KEY_ID
aws configure set --profile hogehoge aws_secret_access_key $SECRET_ACCESS_KEY
aws configure set --profile hogehoge region ap-northeast-1
ecs-cli push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/stg-mogemoge-rails:latest \
    --aws-profile hogehoge \
    --region ap-northeast-1

以上で aws ecr get-login を使用せず、ECR へプッシュができる様になりました♪

WEB+DB PRESS総集編[Vol.1~102] (WEB+DB PRESS plusシリーズ)

WEB+DB PRESS総集編[Vol.1~102] (WEB+DB PRESS plusシリーズ)

docker build 時に Text file busy で shell が実行できない対策

f:id:kenzo0107:20180418215217j:plain

概要

Dockerfile 内に以下のように shell の実行を記述していました。

RUN chmod +x hoge.sh \
  && hoge.sh

上記記述のある状態で docker build 実行した所、以下のようなエラーに遭遇しました。

/bin/sh: hoge.sh: Text file busy

What is Text file busy ?

書き込みのために現在開いている手続きのみの (共用テキスト) ファイルを実行しようとした場合や、実行中の手続きのみのファイルを書き込みのために開こうとしたり、削除しようとしたりする場合に発生します。

上記鑑みると chmod +x hoge.sh 実行中に hoge.sh を実行しようとしたが為に発生しているということ?? と推測。

環境情報

  • Ubuntu 14.04.5 LTS \n \l
  • Docker version 17.05.0-ce, build 89658be
  • Base Image: ruby:2.5-alpine

対策

以下 sync 処理を追加し無事問題解決できました。

RUN chmod +x hoge.sh \
  && sync \
  && hoge.sh

What is sync command ?

sync - システム管理コマンドの説明 - Linux コマンド集 一覧表

参考

github.com

qiita.com

curl で FTPS (File Transfer Protocol over SSL/TLS) 接続確認

f:id:kenzo0107:20180418082402p:plain

以下コマンドで FTPS 接続確認ができます。

curl -u <user> --ftp-ssl -k ftp://<ftp domain>/

概要

備忘録記事です。

社外向けに FTPS で接続許可をする必要があり設定しました。

単純に作成・更新した user, password で認証をパスできるか、 の確認だけができれば良いので、その確認方法を模索している時に 程よいコマンドがありました。

その接続確認を FileZilla, Cyberduck でしましたが どうもうまくいかず。。

改めて、 lftp とか色々 ftp だけでもコマンドは多々あるんだなと実感しました。

ECR にログイン(aws ecr get-login)無しでプッシュする

f:id:kenzo0107:20180307231703p:plain

概要

Docker version 1.11 で実装された credential-helper を利用し
ECR へのプッシュを安全に簡易的に行う仕組みを実装します。

Docker ver 1.11 以上にアップグレード

$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
$ sudo sh -c "echo deb https://apt.dockerproject.org/repo ubuntu-trusty main\
> /etc/apt/sources.list.d/docker.list"
$ sudo apt-get purge lxc-docker docker
$ sudo apt-get update
$ sudo apt-get install docker-engine
$ sudo service docker restart

pull Dockerized ECR credential helper

$ docker pull pottava/amazon-ecr-credential-helper

認証設定

以下3つの中から1つ利用ください。 EC2 であれば、1. インスタンスロールで認証 が一番すっきりしていてコードの見通しが良いです。

  1. インスタンスロールで認証
  2. credential で認証
  3. 環境変数で認証

1. インスタンスロールで認証

docker run --rm \
  -e REGISTRY=123457689012.dkr.ecr.us-east-1.amazonaws.com \
  pottava/amazon-ecr-credential-helper
sudo sh -c 'cat << EOF > /usr/bin/docker-credential-ecr-login
#!/bin/sh
SECRET=\$(docker run --rm \\
  -e METHOD=\$1 \\
  -e REGISTRY=\$(cat -) \\
  pottava/amazon-ecr-credential-helper)
echo \$SECRET | grep Secret
EOF'

sudo chmod +x /usr/bin/docker-credential-ecr-login

2. credential で認証

docker run --rm \
  -e REGISTRY=123457689012.dkr.ecr.us-east-1.amazonaws.com \
  -v $HOME/.aws/credentials:/root/.aws/credentials \
  pottava/amazon-ecr-credential-helper
sudo sh -c 'cat << EOF > /usr/bin/docker-credential-ecr-login
#!/bin/sh
SECRET=\$(docker run --rm \\
  -e METHOD=\$1 \\
  -e REGISTRY=\$(cat -) \\
  -v $HOME/.aws/credentials:/root/.aws/credentials \\
  pottava/amazon-ecr-credential-helper)
echo \$SECRET | grep Secret
EOF'

sudo chmod +x /usr/bin/docker-credential-ecr-login

3. 環境変数で認証

export AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE
export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
docker run --rm \
  -e REGISTRY=123457689012.dkr.ecr.us-east-1.amazonaws.com \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  pottava/amazon-ecr-credential-helper
sudo sh -c 'cat << EOF > /usr/bin/docker-credential-ecr-login
#!/bin/sh
SECRET=\$(docker run --rm \\
  -e METHOD=\$1 \\
  -e REGISTRY=\$(cat -) \\
  -e AWS_ACCESS_KEY_ID \\
  -e AWS_SECRET_ACCESS_KEY \\
  pottava/amazon-ecr-credential-helper)
echo \$SECRET | grep Secret
EOF'
sudo chmod +x /usr/bin/docker-credential-ecr-login

credential 保存設定

mv $HOME/.docker/config.json $HOME/.docker/config.json.org

cat << EOF > $HOME/.docker/config.json
{
    "credsStore": "ecr-login"
}
EOF

これで aws ecr get-login から解放されます♪

Linux に rbenv をセットアップして ruby バージョンを切り替える

f:id:kenzo0107:20180307225204p:plain

概要

サーバの ruby のバージョンが古かった為、 rbenv で ruby のバージョンを切り替える様にした際の設定メモです。

setup rbenv

$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
 
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
 
$ source ~/.bash_profile
$ rbenv --version
rbenv 1.1.1-30-gc8ba27f

rbenv 経由で Ruby 2.5.0 インストール

$ rbenv install 2.5.0

// 現 version は system. まだ 2.5.0 に切り替わっていない
$ rbenv versions
* system (set by /home/vagrant/.rbenv/version)
  2.5.0

// 2.5.0 へ切り替え
$ rbenv global 2.5.0

// 切り替え確認
$ rbenv versions
  system
* 2.5.0 (set by /home/vagrant/.rbenv/version)

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]

// リフレッシュしないと .rbenv/versions/2.5.0/bin 以下のパスを通らない
$ rbenv rehash