ラベル AWS の投稿を表示しています。 すべての投稿を表示
ラベル AWS の投稿を表示しています。 すべての投稿を表示

2016年11月9日水曜日

aws-sdk v2でS3操作するとエラー出た

rubyのaws-sdkでS3の操作しようとしたら、エラー出たのでその時の対応。
sdkのバージョンは以下で指定
gem 'aws-sdk', "~>2.1"

出たエラーは以下のようなもの
F, [2016-11-08T11:23:44.711503 #21962] FATAL -- : 
Aws::Errors::MissingRegionError (missing region; use :region option or export region name to ENV['AWS_REGION']):
  app/xxx:12:in `new'
  app/xxx:12:in `update_s3_bucket_acl'
  app/xxx.rb:338:in `update_s3_bucket_acl'
  app/xxx.rb:323:in `block in update'
  app/xxx.rb:306:in `update'
  config/initializers/quiet_assets.rb:6:in `call_with_quiet_assets'

そのときのコードの一部がこれ
require 'aws-sdk'

s3 = Aws::S3::Resource.new(
  access_key_id: #{access_key_id},
  secret_access_key: #{secret_access_key}
)

bucket = s3.bucket(bucket_name)

対応内容はエラーにまんま書いてあるように、regionを追加しました
s3 = Aws::S3::Resource.new(
  region: 'ap-northeast-1',
  access_key_id: #{access_key_id},
  secret_access_key: #{secret_access_key}
)

S3ってregion関係ないと思うので指定いらなそうなのになと思うのは勉強不足なのでしょう...


参考URL
http://qiita.com/rikitoro@github/items/45f9c85c218343e69014
http://stackoverflow.com/questions/28825047/aws-sdk-v2-for-s3

2016年10月24日月曜日

rubyのaws-sdkでELBに紐付いているEC2インスタンスのIPを取得しようとしたらバージョン2系で記法が変わってた件

ELBに紐付いているEC2インスタンスのIPを取得していたのですが、
aws-sdkのバージョンを1系から2系に変更したらけっこう記法が変わってたので調べました。

バージョン1系
require 'aws-sdk'

elb_name = 'aaa'

AWS.config({
  access_key_id: 'xxx',
  secret_access_key: 'xxx',
  ec2_endpoint: 'xxx',
  elb_endpoint: 'xxx'
})

elb = AWS::ELB.new
lb_instances = elb.load_balancers[elb_name].instances
instance_ips = lb_instances.map { |instance| instance.public_ip_address }

バージョン2系
require 'aws-sdk'

elb_name = 'aaa'

# ELBクライアント
elb = Aws::ElasticLoadBalancing::Client.new(
  region: 'xxx',
  access_key_id: 'xxx',
  secret_access_key: 'xxx'
)

# EC2クライアント
ec2 = Aws::EC2::Client.new(
  region: 'xxx',
  access_key_id: 'xxx',
  secret_access_key: 'xxx'
)

lb_instances = elb.describe_load_balancers({ load_balancer_names: [elb_name] })[:load_balancer_descriptions][0][:instances]
ec2_instances = ec2.describe_instances({ instance_ids: lb_instances.map { |instance| instance.instance_id } })
instance_ips = ec2_instances.reservations.map { |e| e.instances[0].public_ip_address }

2016年8月10日水曜日

nginxのせいでDisk Fullになってアクセス不能になった件

正直恥ずかしい話ですし、Disk監視ちゃんと入れておけば防げる話です。

AWSのEC2でnginx動かしていたら、Disk使用率が100%になってレスポンスが返せなくなりました。
原因はnginxが巨大なログファイルを出力していたためなのですが、
dfだとdiskが喰われているのに、/に移動してdu -sh *でディレクトリごとの使用量を見てみても、
どこがdiskを喰っているのかわかりませんでした。

そこで何かのプロセスがファイルをつかんでいるだろうと調べたところ、nginxが巨大なログファイルをつかんでいました。
なぜそれがduでわからなかったかというと、実際のファイルは存在していなかったからです。
nginxの起動ユーザーはec2-userになっていたのですが、nginxはyumでインストールしたものなので、
log出力先のディレクトリのオーナーがnginxユーザーになっており、
ログがローテーとするタイミングで実ファイルへの書き込みができなくなっていて、
その存在しないファイルにずっと出力が続けられていて、ディスクを喰っていた感じです。

まずnginxのプロセスを調べました。
$ps -ef|grep nginx
root      2258     1  0  2015 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
ec2-user  2259  2258  0  2015 ?        01:06:48 nginx: worker process
ec2-user  2260  2258  0  2015 ?        01:06:14 nginx: worker process
ec2-user  4949  4810  0 22:31 pts/0    00:00:00 grep nginx

プロセスIDが2259が開いているファイルを調べたところ、deletedな巨大なaccess.logが見つかりました。
$sudo lsof -p 2259
COMMAND  PID     USER   FD   TYPE             DEVICE   SIZE/OFF   NODE NAME
nginx   2259 ec2-user    2w   REG              202,1     175662 275456 /var/log/nginx/error.log-20150528 (deleted)
nginx   2259 ec2-user    4w   REG              202,1     175662 275456 /var/log/nginx/error.log-20150528 (deleted)
nginx   2259 ec2-user    5w   REG              202,1 5977988117 275453 /var/log/nginx/access.log-20150528 (deleted)
nginxを再起動すると、diskの空きが増えて、またレスポンスが返せるようになりました。

2016年2月26日金曜日

itamaeでrbenv入れるのにはまった恥ずかしい話

ec2でrbenv入れるのにitamaeで入れようとしてたのですが、
rbenvのインストール手順を普通になぞっていったら地味にはまってしまいました。

最初に書いたレシピはこんな感じ
rbenv/default.rb
%w(
  git
  gcc-c++
  glibc-headers
  openssl-devel
  readline
  libyaml-devel
  readline-devel
  zlib
  zlib-devel
  libffi-devel
  libxml2
  libxslt
  libxml2-devel
  libxslt-devel
  sqlite-devel
  mysql-devel
  patch
).each do |pkg|
  package "#{pkg}" do
    action :install
  end
end

git '/usr/local/rbenv' do
  repository 'https://github.com/sstephenson/rbenv.git'
end

directory "/urs/local/rbenv/plugins" do
  action :create
end

git '/usr/local/rbenv/plugins/ruby-build' do
  repository 'https://github.com/sstephenson/ruby-build.git'
end

remote_file "/etc/profile.d/rbenv.sh" do
  action :create
  source "files/etc/profile.d/rbenv.sh"
  owner 'root'
  group 'root'
  mode '644'
end

execute 'install ruby' do
  command("source /etc/profile.d/rbenv.sh; rbenv install 2.3.0")
  command("source /etc/profile.d/rbenv.sh; rbenv global 2.3.0; rbenv rehash")
end

実行してみるとこんな感じ
$ bundle exec itamae ssh -i pem/test.pem -h 172.31.21.186 roles/test.rb
 INFO : Starting Itamae...
 INFO : Recipe: /home/ec2-user/deploy/xxx/roles/test.rb
 INFO :   Recipe: /home/ec2-user/deploy/xxx/cookbooks/rbenv/default.rb
 INFO :     package[git] installed will change from 'false' to 'true'
 INFO :     package[gcc-c++] installed will change from 'false' to 'true'
 INFO :     package[openssl-devel] installed will change from 'false' to 'true'
 INFO :     package[libyaml-devel] installed will change from 'false' to 'true'
 INFO :     package[readline-devel] installed will change from 'false' to 'true'
 INFO :     package[libffi-devel] installed will change from 'false' to 'true'
 INFO :     package[libxml2-devel] installed will change from 'false' to 'true'
 INFO :     package[libxslt-devel] installed will change from 'false' to 'true'
 INFO :     package[sqlite-devel] installed will change from 'false' to 'true'
 INFO :     package[mysql-devel] installed will change from 'false' to 'true'
 INFO :     package[patch] installed will change from 'false' to 'true'
 INFO :     git[/usr/local/rbenv] exist will change from 'false' to 'true'
 INFO :     directory[/urs/local/rbenv/plugins] exist will change from 'false' to 'true'
 INFO :     git[/usr/local/rbenv/plugins/ruby-build] exist will change from 'false' to 'true'
 INFO :     remote_file[/etc/profile.d/rbenv.sh] exist will change from 'false' to 'true'
 INFO :     remote_file[/etc/profile.d/rbenv.sh] mode will be '0644'
 INFO :     remote_file[/etc/profile.d/rbenv.sh] owner will be 'root'
 INFO :     remote_file[/etc/profile.d/rbenv.sh] group will be 'root'
 INFO :     diff:
 INFO :     --- /dev/null 2016-02-25 02:37:28.211836042 +0000
 INFO :     +++ /tmp/itamae_tmp/1456368153.1309056 2016-02-25 02:42:33.144609603 +0000
 INFO :     @@ -0,0 +1,3 @@
 INFO :     +export RBENV_ROOT=/usr/local/rbenv
 INFO :     +export PATH="$RBENV_ROOT/bin:$PATH"
 INFO :     +eval "$(rbenv init -)"
 INFO :     execute[install ruby] executed will change from 'false' to 'true'

正常に終わったように見えてるが、rubyのバージョンが変わってない。。。
$ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

レシピのrubyインストール部分を以下のようにコマンドを分割する形に修正
rbenv/default.rb
execute 'install ruby' do
  command("source /etc/profile.d/rbenv.sh; rbenv install 2.3.0")
end

execute 'set ruby global' do
  command("source /etc/profile.d/rbenv.sh; rbenv global 2.3.0; rbenv rehash")
end

再度実行してみる
$ bundle exec itamae ssh -i pem/test.pem -h 172.31.21.186 roles/test.rb
 INFO : Starting Itamae...
 INFO : Recipe: /home/ec2-user/deploy/xxx/roles/test.rb
 INFO :   Recipe: /home/ec2-user/deploy/xxx/cookbooks/rbenv/default.rb
 INFO :     execute[install ruby] executed will change from 'false' to 'true'
 INFO :     execute[set ruby global] executed will change from 'false' to 'true'

ちゃんとrubyのバージョンがrbenvで入れたものに変わりました
$ ruby -v
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]


参考URL
http://qiita.com/fukuiretu/items/337e6ae15c1f01e93ec3

2016年1月26日火曜日

daemon系プロセスでのファイルディスクリプタを一律で設定する

fluentdを入れる際にファイルディスクリプタの値を増やしたほうがいいと書いてあったので、
/etc/security/limits.confに書いたのですが、daemonとして立ち上げたときに
設定が効いてなかったので調べました。

検証環境
Amazon Linux AMI 2015.09

まずは現在のファイルディスクリプタの値とdaemonでの状態を確認
$ ulimit -n
1024

$ sudo service httpd start
Starting httpd:                                            [  OK  ]

$ chkconfig --list httpd
httpd           0:off 1:off 2:on  3:on  4:on  5:on  6:off

$ cat /proc/`pgrep httpd | head -1`/limits | grep 'open files'
Max open files            1024                 4096                 files

ulimitでファイルディスクリプタを設定して、手動で起動するとその設定値になります。
$ ulimit -n 4048
$ ulimit -n
4048

$ cat /proc/`pgrep httpd | head -1`/limits | grep 'open files'
Max open files            4048                 4048                 files

rebootすると戻ります。
$ cat /proc/`pgrep httpd | head -1`/limits | grep 'open files'
Max open files            1024                 4096                 files

調べたところ、/etc/sysconfig/initがdaemonでのプロセス起動時に実行されるようなので、
ここでulimitを実行するように追記しました。
$ sudo vim /etc/sysconfig/init 
$ tail -1 /etc/sysconfig/init 
ulimit -n 4048

rebootしても元に戻らないようになりました。
$ cat /proc/`pgrep httpd | head -1`/limits | grep 'open files'
Max open files            4048                 4048                 files


参考URL
http://staffblog.yumemi.jp/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%82%BF%E6%95%B0%E3%81%AE%E4%B8%8A%E9%99%90%E5%A4%89%E6%9B%B4%E3%81%A8limits-conf%E3%81%AE%E7%BD%A0-2/
http://d.hatena.ne.jp/akishin999/20130213/1360711554

2015年10月1日木曜日

JAWS-UG Meguro #2に参加してきました

先週の話ですが、JAWS-UG Meguro #2に参加してきました。
http://jawsug-meguro.connpass.com/event/18162/

正直、今の会社ではまだ使わないような技術の話ばっかりだったのですが、
今後のためにとてもためになったと思います。

特にmyfinderさんの「今更聞けないストリーム処理のあれとかこれ」の話は、
これからどう入れていこうかなってステージの自分にはすごくためになりました。
発表の資料は↑のイベントページにアップされているので、そちらを見ていただくのがよいです、
要約すると、stream処理ってものはどういうもので、
それを処理するための基盤と技術の選択肢はこういうのがあるよっていうのを、
パターンを提示してくれている発表でした。
実際にどうやってみるかは結局手を動かしてみないとわかんないと思うので、
まずどういうのを試してみるのがいいかってのが判断できるだけでも、
この発表が自分にとってはすごくためになりました。

2015年9月21日月曜日

rubyのaws-sdkでamazonS3のaclを変更する

ユーザーの権限によって画像の公開範囲を制限する必要が出てきたので、
amazon S3のaclを動的に変えるコードを書きました。

s3 = AWS::S3.new
bucket_name = "xxx"
bucket = s3.buckets[bucket_name]
user.user_photos.each do |photo|
  o = bucket.objects[photo.url.path]
  if user.publicly?
    o.acl = :public_read
  else
    o.acl = :private
  end
end

photo.url.pathにはbucket_name以降の/からファイル名までのパスが入ります。

http://akasata.com/articles/292
http://qiita.com/ryo0301/items/791c0a666feeea0a704c
https://github.com/thoughtbot/paperclip/issues/1416

2015年7月13日月曜日

awsのec2インスタンス作成時にruby2.2.2をインストールするユーザーデータ

完全にメモですが、awsでec2インスタンス作るときに、
ruby2.2.2をrbenvで入れてある状態にするユーザーデータです。

#!/bin/bash
yum update -y
yum install -y git
yum install -y gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel mysql-devel
yum install -y patch
 
cd /usr/local
git clone https://github.com/sstephenson/rbenv.git
mkdir -p /usr/local/rbenv/plugins
cd /usr/local/rbenv/plugins
git clone https://github.com/sstephenson/ruby-build.git
 
cat << EOF >> /etc/profile.d/rbenv.sh
export RBENV_ROOT=/usr/local/rbenv
export PATH="\$RBENV_ROOT/bin:\$PATH"
eval "\$(rbenv init -)"
EOF
 
source /etc/profile.d/rbenv.sh
rbenv install -f 2.2.2
rbenv rehash
rbenv global 2.2.2
rbenv version
最後にrbenv versionを入れてないと、最初にログインした時のruby -vが2.2.2にならなかった

参考URL
http://hivecolor.com/id/129

2015年7月6日月曜日

AWSのS3で静的ウェブサイトホスティングするときのバケットポリシー

AWSのS3で静的ウェブサイトホスティングでjsやcssを配信したいと思い、
どこのサイトからでもアクセスされてかまわない形でアクセスを許可したときの
バケットポリシーについて調べました。
AWSのドキュメントにもあるように、以下の記述でうまくいきました。
{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Sid": "PublicReadGetObject",
   "Effect": "Allow",
   "Principal": "*",
   "Action": "s3:GetObject",
   "Resource": "arn:aws:s3:::バケット名/*"
  }
 ]
}

参考URL
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/WebsiteAccessPermissionsReqd.html