lsyncdで更新ファイルを検知してaws s3へファイルアップロード
皆さま, こんにちわ
10月になってしまって涼しくなって来たと思ったら三連休は暑いですね〜
今日は, aws s3ネタです.
やりたいこと
対象ディレクトリ配下でファイル更新があったもののみs3にアップロードしたい, という場合には aws s3 cp
を使えば良いという話.
毎回対象ディレクトリを aws s3 sync
してもよいのですが, それだとファイル数が多いと検索に時間がかかってしまい, 1ファイルをアップロードするのにも十数分とか掛かってしまうことがある. (時間はファイル数によって上下します)
そのため, 更新したファイルだけを検知して aws s3 cp
をその都度実行した方が効率が良いだろうということで採用した.
仕組み
更新(タイムスタンプが変更), もしくは新規作成されたファイルがあった場合に, lsyncdで検知させ, スクリプト(aws s3 cp)を実行させる.
検証環境
前提
- 検証環境に記載されているソフトウェアがインストールされていること.
- 使用する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が点灯しており, 勝ったら優勝決定という色々盛りだくさんなゲームでした
雨だったけど, 優勝が決まる(かもしれない)試合だけあってほぼ満員でしたね
結果は.......
1ー3で敗戦!泣
松田の2打席連続ホームランが痛すぎた..., 空気読んでくれ松田, 今日ホーム最終戦なんだよ...(褒め言葉
今井も2失点で踏ん張っていたんだけど, 今日は援護がなく敗戦. うーん, 残念. 今シーズン打ち勝ってきたライオンズが1点しか取れないゲームは久々に見た気がする
でも, 今シーズンはこのままリーグ優勝できそうだし, あとはクライマックスも期待できそうなので良しとしましょう!
あと, このブログは一応テックブログを謳ってる?ということでシステム関連のネタも1個突っ込んでおくと,
ライオンズのファンクラブ特典は, 他球団と比較してお得度が高いことで知られています(私も入会済み)
公式サイトはこちら
新規入会するとユニフォームなどのグッズも貰えるのですが, 特にお得なのは内野指定席引換券ですね. レギュラーA会員だと2枚貰えるので, 個人的にはレギュラーA会員がおススメ.(ハイグレードは2枚, レギュラーBは1枚なので)
レギュラーA会員は年会費¥5500, 内野指定席のチケットを普通に2枚購入すると, ¥6800なので, それだけでもお得になります.
ただ, 去年までこの内野指定席引換券がクセ者でした.....
引換券なので, 観に行きたい試合の内野指定席チケットと引換なければなりません.
しかし, なんとメットライフドームもしくはお近くのライオンズストア(大宮 or 池袋)での直接引換しか対応しておらず, わざわざ引換に出向かねばならないというサービスの悪さ......
せっかくファンクラブ入っても, 引換めんどくさーってなるじゃないか...
なんとかしてくれよ球団職員(のシステム担当)ってずっと思ってました(´-`)
ですが, ようやく今年からインターネットから引換が可能になりました!(ありがとう開発してくれたエンジニアの方々^ ^)
※補足しておくとファンクラブの内野指定席引換券ではなく, 通常のチケット購入は以前からインターネットで購入でき, コンビニ発券が可能でした
加えて会員サイトで引換したチケットは, LINEと連携して, 画面表示(Eチケ化)できるようになりました. (LINEのライオンズ公式アカウント登録が必要)
システム的には, たぶんというか十中八九LINEビジネスコネクトを使ってると思われます.
チケットはこんな感じ
LINEのトーク画面から本日のチケットをクリックすると, リンク送ってくれるのでそいつをクリック
その日のチケットが表示される(薄くライオンズロゴが付いてるのは入場時にスタッフが読みとるとロゴが付く, 使用済みの証)
※ファンクラブ特典の内野指定席引換券だと土日は内野指定席Bになります.(↑の画像は通常購入したチケットです)
他にも, 試合前日になると通知してくれる機能とかはありがたいですねー(私は忘れっぽいので)
ファンクラブ特典引換券のネット対応&Eチケ対応もやってくれたことだし(?)
このままの勢いでクライマックスも頑張って欲しいです〜
おわり
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
$ 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
適時アップデート予定...