はじめに
「AWSではじめるインフラ構築入門 第2版」(翔泳社)を購入して、AWSでのインフラ構築を実践的に学習した。
第1章から順に読み進めたが、第13章「サンプルアプリを動かしてみよう」でいくつか問題が発生したので記事にまとめる。
私は、インフラ、AWS、Webアプリ開発の技術者ではない。簡単なWebアプリを作成し、仮想マシン上でWebサーバーを立てて社内公開したことはある。サンプルアプリで使用されているRuby on Railsについてはよく知らない。
問題点と対処
Ruby2.6.6でRails5.1.6が環境構築できない
本書p322に従って、Ruby2.6.6でRuby on Rails5.1.6をインストールしようとすると以下のエラーメッセージが表示される。
[deploy@ip-10-0-79-108 ~]$ gem install rails -v 5.1.6
...
ERROR: Error installing rails:
The last version of nokogiri (>= 1.6) to support your Ruby & RubyGems was 1.13.10. Try installing it with `gem install nokogiri -v 1.13.10` and then running the current command again
nokogiri requires Ruby version >= 3.0, < 3.4.dev. The current ruby version is 2.6.6.146.
この問題については、以下の記事に従い、nokogiri
とrails-html-sanitizer
というライブラリを更新する。
There are no versions of nokogiri (~> 1.14) compatible with your Ruby & RubyGems. エラーの解消
この対処後、Rails5.1.6をインストールしようとすると、さらに以下のエラーメッセージが表示される。
[deploy@ip-10-0-79-108 ~]$ gem install rails -v 5.1.6
...
ERROR: Error installing rails:
The last version of net-imap (>= 0) to support your Ruby & RubyGems was 0.3.7. Try installing it with `gem install net-imap -v 0.3.7` and then running the current command again
net-imap requires Ruby version >= 2.7.3. The current ruby version is 2.6.6.146.
エラーメッセージに従い、gem install net-imap -v 0.3.7
を実行してnet-imap
というライブラリを更新すると、Rails5.1.6がインストールできる。
(以前は、Ruby2.6.6でRails5.1.6がすんなりと環境構築可能であったが、その後ライブラリの更新により不可になったらしい。)
アプリがS3にアクセスできない
本書p326のテーブルの作成を実行すると、以下のエラーが出る。
[deploy@ip-10-0-79-108 aws-intro-sample-2nd]$ rails db:migrate RAILS_ENV=production
[fog][WARNING] Unable to fetch credentials: Expected(200) <=> Actual(401 Unauthorized)
rails aborted!
ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
/var/www/aws-intro-sample-2nd/config/initializers/carrier_wave.rb:4:in `block in <top (required)>'
/var/www/aws-intro-sample-2nd/config/initializers/carrier_wave.rb:2:in `<top (required)>'
/var/www/aws-intro-sample-2nd/config/environment.rb:5:in `<top (required)>'
/var/www/aws-intro-sample-2nd/bin/rails:9:in `require'
/var/www/aws-intro-sample-2nd/bin/rails:9:in `<top (required)>'
/var/www/aws-intro-sample-2nd/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)
これは、fog
というライブラリが、S3にアクセスする権限がないので、aws_access_key_id
とaws_secret_access_key
を要求しているというメッセージである。
(fog
はS3にファイルをアップロードするためのライブラリ)
本書のアプリへのアクセス権限付与方法は、本書9.4「ロールを作成してEC2に適用する」でAmazonS3FullAccess
の許可ポリシーを持つロールを作成して、EC2(web01、web02)に適用するというものである。
もちろんその通りにロールを作成、適用し、本書9.5「動作確認」も実施済である。
p325の.bash_profile
に記載するAWS_INTRO_SAMPLE_S3_REGION
とAWS_INTRO_SAMPLE_S3_BUCKET
も適切である。
素人なりに調べたところ、以下のことがわかった。
-
fog
のS3のアクセス権限の取得方法は/アプリのインストールフォルダ/config/initializers/carrier_wave.rb
に記載される。use_iam_profile => true
の時、EC2に適用されたロールの情報を使用する。 -
fog
でuse_iam_profile => true
としても、適切に動作しないことがあるらしい。
結局、EC2に適用されたロールの情報を使用することをあきらめ、本書3.2.4「グループを使用したアクセス許可の割り当て」でPowerUserAccess
を割り当てたユーザー(Developersグループに所属するユーザー)のアクセスキーを使用することにした。
まず、以下の記事などを参考に、アクセスキーを取得する。
AWSのアクセスキーを取得する方法
次に、carrier_wave.rb
を以下の通り修正する(web01、web02とも)。
if Rails.env.production?
CarrierWave.configure do |config|
config.fog_public = false
config.fog_credentials = {
# Amazon S3用の設定
:provider => 'AWS',
:region => ENV['AWS_INTRO_SAMPLE_S3_REGION'], # 例: 'ap-northeast-1'
# :use_iam_profile => true # コメントアウト
:use_iam_profile => false, # 追加
:aws_access_key_id => ENV['AWS_ACCESS_KEY_ID'], # 追加
:aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] # 追加
}
config.fog_directory = ENV['AWS_INTRO_SAMPLE_S3_BUCKET']
end
end
さらに、EC2のdeployユーザーの.bash_profile
に以下を追記する(web01、web02とも)。
# 追加の設定
export AWS_ACCESS_KEY_ID=PowerUserAccessを割り当てたユーザーのアクセスキー
export AWS_SECRET_ACCESS_KEY=PowerUserAccessを割り当てたユーザーのシークレットアクセスキー
.bash_profile
を書き換えた後は、source .bash_profile
を実行する。
上記により、PowerUserAccess
を割り当てたユーザーの権限で、WebアプリがS3にアクセスできる。
carrier_wave.rb
にaws_access_key_id
とaws_secret_access_key
を直接記載しても動作するが、ソースコードの流出により、本書p122にも記載されている「アクセスキーの漏洩と被害」が発生する恐れがあるので避ける。
また、.bash_profile
に記載する方法でも、ロールを用いる方法よりセキュリティのレベルは低いと思われるので、自己責任でお願いします。
補足
本書p324のbundle install
を実行すると以下のメッセージが表示される。
[deploy@ip-10-0-79-108 aws-intro-sample-2nd]$ bundle install
...
Post-install message from fog:
------------------------------
Thank you for installing fog!
IMPORTANT NOTICE:
If there's a metagem available for your cloud provider, e.g. `fog-aws`,
you should be using it instead of requiring the full fog collection to avoid
unnecessary dependencies.
'fog' should be required explicitly only if:
- The provider you use doesn't yet have a metagem available.
- You require Ruby 1.9.3 support.
------------------------------
fog
でなくfog-aws
を使用することが望ましいとのことか?
前述のfog
に関するトラブルとの関係しているかはよくわからない。
デプロイ時のメッセージ
本書p327のrails assets:precompile RAILS_ENV=production
のコマンドを入力すると、次のメッセージが表示される。
[deploy@ip-10-0-79-108 aws-intro-sample-2nd]$ rails assets:precompile RAILS_ENV=production
Yarn executable was not detected in the system.
Download Yarn at https://yarnpkg.com/en/docs/install
...
実行可能なyarn
がシステム内で検出されなかったとある。
yarn
というライブラリがどのようなもので、アプリの動作にどのような影響を与えるかは理解できていない。
本書の読者で同じ報告があるので、私固有の問題ではないようだ。
結果
Webアプリのデプロイにおいていくつか不明点が残っているものの、サンプルアプリを動作させることに成功した。
投稿画面
フォロワー画面
おわりに
付け焼刃ながらもいくつかの対処により、サンプルアプリを動かすことができた。
ただし、上に記載した事象、特に「S3にアクセスできない」(EC2にロールを付与する方法で)は、私の設定ミス等の問題か、Webアプリの共通の問題なのかわかっていない。
したがいまして、本書のサンプルアプリに関しまして、この記事と同じ事象が発生した(この記事が役立った、もっと良い対処がある)、同じ事象は発生しなかった、別の事象が発生した等の情報をいただけますと幸いです。
追記
自分と同じエラーの人を見つけた。
(AWSのアクセスキーIDとシークレットアクセスキーの設定不足)
https://ebookstore.sony.jp/review/LT000177258001711192/
やっぱり共通の問題がありそうね。
参考
著者サポートページ