S3の特定のパス配下のファイル総容量

表題の通り。awscliで、S3のあるパス配下にあるすべてのファイルの総容量を知りたい。

■ 環境

  • awk
  • awscli 1.11.47

■ s3

下記コマンドで取得することができる。

$ aws s3 ls s3://[bucket]/[path] --recursive | awk 'BEGIN {sum=0} {sum+=$3} END {print sum}'

肝となるところは”–recursive“で配下全てのファイルについて`ls`で詳細を取得しているところであろうか。`ls`の表記の中からファイル容量が3つ目の項目に表示されているので、この3つ目の項目を`awk`で総和計算している。

試しに自身のとある環境で行ってみたところ、下記のような結果を得られた。

$ aws s3 ls s3://[bucket]/[path] --recursive | awk 'BEGIN {sum=0} {sum+=$3} END {print sum}'
373689
$

表示はByteなので、`awk`の最後で`/1024`としていけば”KByte“や”MByte“で取得することも可能である。

以上。

Lambda用に`npm deploy`

表題の通り。`npm deploy`コマンドを設定してしまっているというお話。

■ 環境

  • AWS Lambda
  • node v4.4.7
  • Mac OSX El Capitan

■ きっかけ

ServerlessFrameworkとかを使っていない環境で、Lambdaに簡易的にデプロイしたいなと思った時に、”package.json“に1行加えてデプロイをしている。いや、ServerlessFrameworkとかも使ったことすらないけど…。

■ AWS Lambda

各種設定等は”Management Console“で先にやってしまっている。そこでARNを取得する。

AWS Lambda > Functions > Function選択 > Actions > Show ARN

ここで得られた”ARN“を元にコマンドを設定する。

■ pakcage.json

{
  "name": "test",
  "version": "0.0.1",
  "description": "test test test.",
  "main": "index.js",
  "scripts": {
    "zip": "zip -r test.zip index.js node_modules",
    "update": "aws lambda update-function-code --function-name arn:aws:lambda:ap-northeast-1:XXXXXXXXXXX:function:test --zip-file fileb://`pwd`/test.zip --publish",
    "deploy": "npm run zip && npm run update"
  },
  :
}

上記のような”scripts“を追加している。後は実行するだけでOKである。

$ npm run deploy

当初はかなり適当に設定してみたのだが、意外と使えたので最近はもっぱらこれを使用している。

以上。

DockerでAmazonLinux

表題の通り。

■ 環境

  • Amazon Linux 2016.09.20161028
  • Docker for Mac 1.12.3
  • Mac OSX El Capitan

■ AmazonLinux

少し前にECRからAmazonLinuxのDockerコンテナイメージをダウンロードすることができると知り実際にも試してみたのだが、今回はDockerHubで公開されているようなので、こちらの方が手っ取り早い感じがしたのでやってみることにした。

$ docker pull amazonlinux

現時点では”2016.09.20161028“が落とされてくるようである。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
amazonlinux         latest              57cfffcf4ff3        5 days ago          328.3 MB
  :
$

現時点で既に5日前には存在していたようである。

■ run

起動してログインしてみる。

$ docker run -ti --rm amazonlinux /bin/bash
bash-4.2#
bash-4.2# cat /etc/system-release
Amazon Linux AMI release 2016.09
bash-4.2#

なるほど。また`yum`でパッケージも取得できるようである。

bash-4.2# yum search nginx
Loaded plugins: priorities, update-motd, upgrade-helper
========================================================= N/S matched: nginx ==========================================================
collectd-nginx.x86_64 : Nginx plugin for collectd
munin-nginx.noarch : Network-wide graphing framework (cgi files for nginx)
nginx-all-modules.x86_64 : A meta package that installs all available Nginx modules
nginx-mod-http-geoip.x86_64 : Nginx HTTP geoip module
nginx-mod-http-image-filter.x86_64 : Nginx HTTP image filter module
nginx-mod-http-perl.x86_64 : Nginx HTTP perl module
nginx-mod-http-xslt-filter.x86_64 : Nginx XSLT module
nginx-mod-mail.x86_64 : Nginx mail modules
nginx-mod-stream.x86_64 : Nginx stream modules
nginx.x86_64 : A high performance web server and reverse proxy server

  Name and summary matches only, use "search all" for everything.
bash-4.2#

これは開発環境がとても便利になりそうである。

以上。

■ 関連

ELBのヘルスチェックログを出力しない

表題の通り。AWSのELBからのヘルスチェックのログが邪魔なので非表示にという設定メモ。

■ 環境

  • nginx
  • ELB
  • AWS

■ 削除したいログ

下記のようなログである。

10.0.1.154 - - [16/Nov/2016:19:04:21 +0900] "GET /health.txt HTTP/1.1" 200 3 "-" "ELB-HealthChecker/1.0"
10.0.2.20 - - [16/Nov/2016:19:04:21 +0900] "GET /health.txt HTTP/1.1" 200 3 "-" "ELB-HealthChecker/1.0"

■ nginx.conf

該当の設定ファイル内、”server”ディレクティブの所に下記を追記する。

  location /health.txt {
    access_log off;
    break
  }

これでログに出力されなくなった。

以上。

OpsWorksのInstanceIdとEc2InstanceId

表題についての単なるメモ。

■ 環境

  • awscli 1.11.2
  • OpsWorks
  • AmazonWebServices
  • Mac OSX El Capitan

■ OpsWorks

現在の職場ではOpsWorksを使用している。`awscli`, `aws-sdk`でOpsWorksから起動しているインスタンス情報を下記のように取得した。

$ aws opsworks describe-instances --stack-id XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

この中から、インスタンスが起動された時間を取得したかったのであるが、”CreatedAt“しか取得できない。これは最初にインスタンスを作成した日時であって`stop`→`start`しても変化は無い。よってインスタンスIDを元にEC2のAPIを再度叩けば取得できるかな、と試してみようとしたのだが、”InstanceId“が見慣れない文字列になっている…。

当初はこの見慣れない文字列でEC2のAPIを叩いてみたのだが、もちろん失敗する。再度`opsworks describe-instances`で出力された内容を見ていると…”Ec2InstanceId“というのがあった。こちらは見慣れた文字列である。これを元にEC2のAPIを叩くことで、”LaunchTime“で起動時間を取得することができた。

$ aws ec2 describe-instances --instance-ids i-XXXXXXXXXXXXXXXX

以上。