先に結論
ここに書いてあるとおり
- 再起動: インスタンスは、同じホストコンピュータで保持される
- 停止/開始: インスタンスは新しいホストコンピュータに移動されます
メンテナンスでEC2のハードウェア退役や再起動する場合は、停止/起動 の方がいいの?
イベントの告知でも、stopping and starting your instance
と書かれているので、停止/起動のほうが良いと思う
そんなおぼえがき
ここに書いてあるとおり
イベントの告知でも、stopping and starting your instance
と書かれているので、停止/起動のほうが良いと思う
そんなおぼえがき
複数バージョンのbundlerがインストールされているとき、どれが選択されるのか曖昧だったので実験
公式ドキュメントの記述がみあたらなかったので、バージョンが変わると挙動が変わるかもしれないです
ruby:3.0.1-alpine
を使用。defaultで入っているbundlerは、2.2.15です
docker run --rm --name ruby -it ruby:3.0.1-alpine /bin/sh
/ # gem list --local | grep bundler bundler (default: 2.2.15) / # bundler -v Bundler version 2.2.15
以下の優先順でバージョンが選ばれるようです。default は関係ない様子
$BUNDLER_VERSION
BUNDLED WITH
default
や、インストール順は左右されず、最新のバージョンが参照される/ # gem install bundler:2.2.20 Fetching bundler-2.2.20.gem Successfully installed bundler-2.2.20 1 gem installed / # gem install bundler:2.2.19 Fetching bundler-2.2.19.gem Successfully installed bundler-2.2.19 1 gem installed / # gem list --local | grep bundle bundler (2.2.20, 2.2.19, default: 2.2.15) / # bundle -v Bundler version 2.2.20
Gemfile.lock
がある場合、そこの BUNDLED WITH
にかかれているバージョンが参照される/ # cat <<EOS > Gemfile.lock > GEM > remote: https://rubygems.org/ > specs: > rack (2.0.6) > > PLATFORMS > ruby > > DEPENDENCIES > rack > > BUNDLED WITH > 2.2.19 > EOS / # bundle -v Bundler version 2.2.20
BUNDLER_VERSION
があると、それが最優先される/ # export BUNDLER_VERSION=2.2.15 / # bundle -v Bundler version 2.2.15
BUNDLER_VERSION
や、Gemfile.lock に書かれたバージョンがインストールされていな場合、最新のバージョンが参照されるbundle install
しない限り、特に警告は出ませんでした
/ # export BUNDLER_VERSION=2.2.13 / # cat <<EOS > Gemfile.lock > GEM > remote: https://rubygems.org/ > specs: > rack (2.0.6) > > PLATFORMS > ruby > > DEPENDENCIES > rack > > BUNDLED WITH > 2.2.16 > EOS / # bundle -v Bundler version 2.2.20
bundle _version_
でバージョンを明示的に指定すると、そのバージョンが参照される/ # bundle _2.2.15_ -v Bundler version 2.2.15
存在しないバージョンを指定すると怒られます
/ # bundle _2.2.00_ -v /usr/local/lib/ruby/3.0.0/rubygems.rb:281:in `find_spec_for_exe': can't find gem bundler (= 2.2.00) with executable bundle (Gem::GemNotFoundException) from /usr/local/lib/ruby/3.0.0/rubygems.rb:300:in `activate_bin_path' from /usr/local/bundle/bin/bundle:23:in `<main>'
docker run --rm --name ruby -it ruby:2.5.1-alpine /bin/sh
/ # gem list --local | grep bundler bundler (1.16.6, default: 1.16.2) / # bundler -v Bundler version 1.16.6
2.2.20
をインストールしても、1.16.6
が参照されたまま
/ # gem install bundler:2.2.20 / # gem list --local | grep bundler bundler (2.2.20, 1.16.6, default: 1.16.2)
/ # bundler -v Bundler version 1.16.6
これは、古い ruby の Dockerfile の中で BUNDLER_VERSION
が設定されているため
そのため、BUNDLER_VERSION
を unset しないと想定通りの挙動してくれない
こちらのissueで議題になって、新しいバージョンでは BUNDLER_VERSION
がセットされないようになっています
elasticbeanstalkのプラットフォーム(ruby puma)のバージョンを上げると、こんなエラーが出るようになる
/opt/rubies/ruby-2.7.3/lib/ruby/site_ruby/2.7.0/bundler/runtime.rb:302:in `check_for_activated_spec!': You have already activated nio4r 2.5.7, but your Gemfile requires nio4r 2.5.5. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
プラットフォームに入っている puma に依存している Gem と、自分が入れた Gem がコンフリクトしているために発生している模様
アプリの puma のバージョンをプラットフォームの puma のバージョンと合わせれば解決
おんなじ問題にハマった人
各環境ごとのpumaのバージョン
Nginxの内部転送の設定がうまく行かない時とかにデバッグログは便利なのですが、その設定方法をよく忘れるのでメモ
error_log /dev/stdout debug;
rewrite_log on;
nginx-debug -g "daemon off;"
いじょうです
CORS: Cross-Origin Resource Sharing
オリジン間リソース共有
同じところからのリクエストであるかを判別するための方法
URIの、scheme、host、portが一致していると、それは「同一オリジン」である
scheme、host、portとか、URIの呼称については、こちらを参照
異なるオリジンにAjaxリクエストやWebフォントの読み込みを行う際に使われる
悪意あるサイトがAjaxで勝手にどこかAPIを叩けないよう、同一オリジン以外へのリクエストはブロックされるようになっている
ただし、異なるオリジンにリクエストを投げる必要もあるため、CORS という仕組みが生まれた
単純リクエストという方式の場合、以下のような流れ
Origin
が含まれる
Origin
は、リクエストの発生元がどこであるかを示すAccess-Control-Allow-Origin
が含まれる
Access-Control-Allow-Origin
はサーバが許可するオリジンを入れる*
の場合は「すべて許可」となるが、非常に脆弱なのでやめるべきOrigin
と Access-Control-Allow-Origin
が一致していれば、処理が行われるクロスオリジンのリクエストが いろいろな条件を満たさなかった場合、上記の単純リクエストではなく、プリフライトリクエストが行われる
ユーザーデータに影響を与える可能性があるようなリクエストの場合、プリフライトが行われる(らしい)
OPTIONS
メソッドをつかって、事前に安全にクロスオリジンの通信が行えるかチェックする
以下のような流れ
OPTIONS
メソッドで以下のリクエストを投げる
Origin
: 単純リクエストと同じAccess-Control-Request-Method
: 送るメソッドAccess-Control-Request-Headers
: 送るリクエストヘッダAccess-Control-Allow-Origin
: 単純リクエストと同じAccess-Control-Allow-Methods
: 許可するメソッドAccess-Control-Allow-Headers
: 許可するリクエストヘッダAccess-Control-Max-Age
: プリフライトリクエストの結果をキャッシュして良い時間(秒)標準では cookie や basic 認証を含むリクエストに関わる情報は送信されない
そのためには、JavaScript 側で withCredentials
というオプションを true
にする必要がある
さらに、cookie の情報をやり取りしたい場合は、レスポンスヘッダに Access-Control-Allow-Credentials: true
をつけて、許可する必要がある
また、Set-Cookie
については、サードパーティCookieと同じく、ドメインが異なるとブラウザの設定によっては読み込めない
あと、 資格情報を含むリクエストの場合 Access-Control-Allow-Origin
に *
は使えない
踏み台サーバに手動で入れる必要が出たので個人的なメモ
だいたいここの通りにやればOK
Amazon Linuxでは、いくつかのパッケージを Extras Library として提供しているが、MySQLは提供していない(mariadbはある)
amazon-linux-extras
で提供しているパッケージを確認可能80番ポートを開ける必要がある
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
localinstall
は、rpm を yum でインストールするコマンド。 rpm -i
と異なり、依存関係がある場合、その rpm もインストールしてくれるyum repolist enabled | grep "mysql.*-community.*"
$ yum repolist enabled | grep "mysql.*-community.*" mysql-connectors-community/x86_64 MySQL Connectors Community 194 mysql-tools-community/x86_64 MySQL Tools Community 126 mysql80-community/x86_64 MySQL 8.0 Community Server 247
sudo yum-config-manager --disable mysql80-community sudo yum-config-manager --enable mysql57-community
確認
$ yum repolist enabled | grep mysql mysql-connectors-community/x86_64 MySQL Connectors Community 194 mysql-tools-community/x86_64 MySQL Tools Community 126 mysql57-community/x86_64 MySQL 5.7 Community Server 504
sudo yum install -y mysql-community-client
無事インストールされました
$ mysql --version mysql Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using EditLine wrapper
RHEL系のお話です
/etc/logrotate.conf
/etc/logrotate.d/
/usr/sbin/logrotate -dv /etc/logrotate.conf
/usr/sbin/logrotate -f /etc/logrotate.conf
/var/lib/logrotate.status
1日1回ローテーションしていて、すでに本日実行済の場合
/var/lib/logrotate.status
にある最終実行日を昨日の日付に変更する/usr/sbin/logrotate -dv /etc/logrotate.conf
して実行されるか確認/usr/sbin/logrotate -f /etc/logrotate.conf
で手動実行ローテーション実行時のスクリプトの戻り値が0以外だとエラーになる
なので例えば、最後に実行したコマンドが test
コマンドで、testの結果が「偽」の場合、exit 1 になるのでエラーとなってしまう
lastaction
の実行結果ならば、ローテーション自体は完了している