lsyncdで更新ファイルを検知してaws s3へファイルアップロード

皆さま, こんにちわ

10月になってしまって涼しくなって来たと思ったら三連休は暑いですね〜

今日は, aws s3ネタです.

やりたいこと

対象ディレクトリ配下でファイル更新があったもののみs3にアップロードしたい, という場合には aws s3 cp を使えば良いという話. 毎回対象ディレクトリを aws s3 sync してもよいのですが, それだとファイル数が多いと検索に時間がかかってしまい, 1ファイルをアップロードするのにも十数分とか掛かってしまうことがある. (時間はファイル数によって上下します) そのため, 更新したファイルだけを検知して aws s3 cp をその都度実行した方が効率が良いだろうということで採用した.

仕組み

更新(タイムスタンプが変更), もしくは新規作成されたファイルがあった場合に, lsyncdで検知させ, スクリプト(aws s3 cp)を実行させる.

f:id:namio6243:20181007123429p:plain

検証環境

前提

  • 検証環境に記載されているソフトウェアがインストールされていること.
  • 使用するIAMユーザーのアクセスキーID, シークレットアクセスキーを取得済み

構築

公式サイトの手順通りに credintialをdatacenter側のサーバに登録

下記の通りに設定したら aws s3 ls コマンドでバケット情報が取得できることを確認する. docs.aws.amazon.com

ファイル更新検知時に実行させるスクリプトを作成

私はshellで書くのが楽だったのでshellにしちゃいましたが, 他のスクリプトでも良いと思います.

s3-upload.sh

#!/bin/bash
# aws s3バケット名
S3_BUCKET_NAME='************'
# 送信元のファイルパスを設定
SRC_PATH="${1}"

  # 送信元ファイルパスから不要な部分をカットして送信先用に使う. 例として17に設定してますが, 文字数それぞれで合わせてください.
  DST_PATH=`echo ${SRC_PATH} | cut -c 17-`
  if [ -f ${SRC_PATH} ]; then
    # excludeオプションを使って, 更新検知から除外したいファイルを指定する. includeオプションも一緒に設定しないとexcludeが効かないので要注意.
    aws s3 cp ${SRC_PATH} s3://${S3_BUCKET_NAME}${DST_PATH} --include "*" --exclude "*.log"
  else
    # ファイルが削除されたら, s3側も同じように削除されるように設定する.
    aws s3 rm s3://${S3_BUCKET_NAME}${DST_PATH}
  fi
lsyncdにスクリプトを登録

lsyncdのconfigに作成したスクリプトを登録します. ファイルパスなどは各自読み換えて設定して下さい.

lsyncd_to_s3.conf

settings{
        logfile = "/var/log/lsyncd/s3-upload.log",
        statusFile = "/var/log/lsyncd/s3-upload.stat",
        statusInterval = 5,
        nodeaemon = false,
}

exec = function(event)
    local src_path = event.sourcePathname
    spawnShell(event, "/bin/bash /opt/lsyncd/s3-upload.sh " .. src_path .. " || :" );
end

s3_upload = {
    maxProcesses = 2,
    delay = 0,
    onCreate = exec,
    onDelete = exec,
    onMove = exec,
}

sync {
    s3_upload,
    source = "/opt/s3_src_dir",
}
lsyncdを起動

上記で作成したconfigのパスを引数に指定して実行.

$ lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd_to_s3.conf

起動してれば, こんな感じです.

$ ps -ef | grep lsyncd
test      3295     1  0 13:18 ?        00:26:48 lsyncd -pidfile /var/run/lsyncd.pid /etc/lsyncd_to_s3.conf
該当ディレクトリ配下にファイルを配置してみる

適当にファイルをtouchで作成.

$ touch /opt/s3_src_dir/test.txt

あとは, s3にファイルがアップロードされていることを確認して, アップされてればOK.

総括

  • 構築してみて思ったのは, やはり送信元のファイル更新からs3への同期は, 体感的にはほぼ即時反映になった. (速い!)
  • 1日とか1時間に1回の頻度で同期する, みたいな使い方しかしない場合はここまでやらないでOKだなーと思った. (定期的に s3 sync 叩けば良し)
  • 枯れた技術ではあるが, 他に代替えも見当たらないのでlsyncdは便利.

埼玉西武ライオンズの2018シーズンホーム最終戦を観てきたよ #プロ野球 #特典引換券のネット対応&Eチケ対応ありがとう

皆さま、こんにちわ^_^

 

お久しぶりです. もうすぐ10月ですがいかがお過ごしでしょうか

 

唐突ですが9/29は, 何の日か知ってましたか?

 

 

 

 

 

 

 

そう、今日は私の応援する埼玉西武ライオンズの今シーズンホーム最終戦でしたw(ビジターでの試合はまだ残ってますが)

しかも, 対戦カードは, 1位西武 vs 2位ソフトバンクという好カードの上, 我がライオンズはマジック1が点灯しており, 勝ったら優勝決定という色々盛りだくさんなゲームでした

f:id:namio6243:20180929182104j:image

雨だったけど, 優勝が決まる(かもしれない)試合だけあってほぼ満員でしたね

 

 

結果は.......

f:id:namio6243:20180929182518j:image

 

f:id:namio6243:20180929182948j:image

 

f:id:namio6243:20180929183007j:image

 

1ー3で敗戦!泣

 

松田の2打席連続ホームランが痛すぎた..., 空気読んでくれ松田, 今日ホーム最終戦なんだよ...(褒め言葉

 

今井も2失点で踏ん張っていたんだけど, 今日は援護がなく敗戦. うーん, 残念. 今シーズン打ち勝ってきたライオンズが1点しか取れないゲームは久々に見た気がする

 

でも, 今シーズンはこのままリーグ優勝できそうだし, あとはクライマックスも期待できそうなので良しとしましょう!

 

 

あと, このブログは一応テックブログを謳ってる?ということでシステム関連のネタも1個突っ込んでおくと,

 

ライオンズのファンクラブ特典は, 他球団と比較してお得度が高いことで知られています(私も入会済み)

www.google.co.jp

 

公式サイトはこちら

sp.seibulions.jp

 

新規入会するとユニフォームなどのグッズも貰えるのですが, 特にお得なのは内野指定席引換券ですね. レギュラーA会員だと2枚貰えるので, 個人的にはレギュラーA会員がおススメ.(ハイグレードは2枚, レギュラーBは1枚なので)

 

レギュラーA会員は年会費¥5500, 内野指定席のチケットを普通に2枚購入すると, ¥6800なので, それだけでもお得になります.

 

ただ, 去年までこの内野指定席引換券がクセ者でした.....

 

引換券なので, 観に行きたい試合の内野指定席チケットと引換なければなりません.

 

しかし, なんとメットライフドームもしくはお近くのライオンズストア(大宮 or 池袋)での直接引換しか対応しておらず, わざわざ引換に出向かねばならないというサービスの悪さ......

 

せっかくファンクラブ入っても, 引換めんどくさーってなるじゃないか...

 

なんとかしてくれよ球団職員(のシステム担当)ってずっと思ってました(´-`)

 

ですが, ようやく今年からインターネットから引換が可能になりました!(ありがとう開発してくれたエンジニアの方々^ ^)

※補足しておくとファンクラブの内野指定席引換券ではなく, 通常のチケット購入は以前からインターネットで購入でき, コンビニ発券が可能でした

 

加えて会員サイトで引換したチケットは, LINEと連携して, 画面表示(Eチケ化)できるようになりました. (LINEのライオンズ公式アカウント登録が必要)

システム的には, たぶんというか十中八九LINEビジネスコネクトを使ってると思われます. 

www.google.co.jp

 

 

チケットはこんな感じ

LINEのトーク画面から本日のチケットをクリックすると, リンク送ってくれるのでそいつをクリック

f:id:namio6243:20180929190922p:image

 

 

その日のチケットが表示される(薄くライオンズロゴが付いてるのは入場時にスタッフが読みとるとロゴが付く, 使用済みの証)

f:id:namio6243:20180929194300j:image

※ファンクラブ特典の内野指定席引換券だと土日は内野指定席Bになります.(↑の画像は通常購入したチケットです)

 

 

他にも, 試合前日になると通知してくれる機能とかはありがたいですねー(私は忘れっぽいので)

f:id:namio6243:20180929190834p:image

 

 

ファンクラブ特典引換券のネット対応&Eチケ対応もやってくれたことだし(?)

このままの勢いでクライマックスも頑張って欲しいです〜

f:id:namio6243:20180929191624j:image

 

f:id:namio6243:20180929191638j:image

 

おわり

 

AWS CLI + jq で AWS各サービスの一覧情報を取得する

みなさま, こんにちわ.

9月になっても, まだ日中は残暑のこってますねー. いかがお過ごしでしょうか?

最近の私というものも, めっきりAWSを触るようになってしまい, cliのコマンドを全く記憶できないのでメモることにしました笑

というのも, awsで色々構築していると, 全体像がよくわからないようになってしまうので, 定期的に一覧を取得して, 全体的な設計から外れたものがないかチェックするという目的があり, 用意しました.

jsonを整形してくれるjqコマンドは便利ですね!

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.13.5
BuildVersion:   17F77

$ aws --version
aws-cli/1.15.76 Python/2.7.15 Darwin/17.6.0 botocore/1.10.75

$ jq -V
jq-1.5

aws側のIAMなどの設定はこちらを参考にしました.(formatはjson.)

一覧取得コマンド

ec2

$ aws ec2 describe-instances --filter "Name=tag:Name,Values=*" | jq -r '.Reservations[].Instances[] | [.Tags[] | select(.Key == "Name").Value][] + "\t" +  .InstanceId + "\t" + .PublicIpAddress + "\t" +  .PrivateIpAddress + "\t" + .InstanceType + "\t" + .SubnetId + "\t" + .VpcId + "\t" + .ImageId + "\t" + .RootDeviceType + "\t" + .KeyName + "\t" + .Placement.AvailabilityZone' | sort

lb

$ aws elbv2 describe-load-balancers | jq -r '.LoadBalancers[] | .LoadBalancerName + "\t" + .DNSName + "\t" + .LoadBalancerArn + "\t" + .VpcId + "\t" + .IpAddressType + "\t" + .Type + "\t" + .Scheme + "\t" + .AvailabilityZones[].SubnetId + "\t" + .AvailabilityZones[].ZoneName' | sort

vpc

$ aws ec2 describe-vpcs| jq -r '.Vpcs[] | [.Tags[] | select(.Key == "Name").Value][] + "\t" + .VpcId + "\t" + .State + "\t" + .CidrBlock + "\t" + .DhcpOptionsId' | sort

subnets

$ aws ec2 describe-subnets | jq -r '.Subnets[] | [.Tags[] | select(.Key == "Name").Value][] + "\t" + .SubnetId + "\t" + .State + "\t" + .VpcId + "\t" + .AvailabilityZone + "\t" + .CidrBlock' | sort

適時アップデート予定...