LoginSignup
0
1

書籍「AWSではじめるインフラ構築入門」 サンプルアプリに関するメモ

Last updated at Posted at 2024-05-04

はじめに

「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.

この問題については、以下の記事に従い、nokogirirails-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_idaws_secret_access_keyを要求しているというメッセージである。
fogはS3にファイルをアップロードするためのライブラリ)
本書のアプリへのアクセス権限付与方法は、本書9.4「ロールを作成してEC2に適用する」でAmazonS3FullAccessの許可ポリシーを持つロールを作成して、EC2(web01、web02)に適用するというものである。
もちろんその通りにロールを作成、適用し、本書9.5「動作確認」も実施済である。
p325の.bash_profileに記載するAWS_INTRO_SAMPLE_S3_REGIONAWS_INTRO_SAMPLE_S3_BUCKETも適切である。
素人なりに調べたところ、以下のことがわかった。

  • fogのS3のアクセス権限の取得方法は/アプリのインストールフォルダ/config/initializers/carrier_wave.rbに記載される。use_iam_profile => trueの時、EC2に適用されたロールの情報を使用する。
  • foguse_iam_profile => trueとしても、適切に動作しないことがあるらしい。

結局、EC2に適用されたロールの情報を使用することをあきらめ、本書3.2.4「グループを使用したアクセス許可の割り当て」でPowerUserAccessを割り当てたユーザー(Developersグループに所属するユーザー)のアクセスキーを使用することにした。

まず、以下の記事などを参考に、アクセスキーを取得する。
AWSのアクセスキーを取得する方法

次に、carrier_wave.rbを以下の通り修正する(web01、web02とも)。

carrier_wave.rb
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とも)。

.bash_profile
# 追加の設定
export AWS_ACCESS_KEY_ID=PowerUserAccessを割り当てたユーザーのアクセスキー
export AWS_SECRET_ACCESS_KEY=PowerUserAccessを割り当てたユーザーのシークレットアクセスキー

.bash_profileを書き換えた後は、source .bash_profileを実行する。
上記により、PowerUserAccessを割り当てたユーザーの権限で、WebアプリがS3にアクセスできる。
carrier_wave.rbaws_access_key_idaws_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アプリのデプロイにおいていくつか不明点が残っているものの、サンプルアプリを動作させることに成功した。

投稿画面

AWS_Qiita.png

フォロワー画面

フォロワー.png

おわりに

付け焼刃ながらもいくつかの対処により、サンプルアプリを動かすことができた。
ただし、上に記載した事象、特に「S3にアクセスできない」(EC2にロールを付与する方法で)は、私の設定ミス等の問題か、Webアプリの共通の問題なのかわかっていない。

したがいまして、本書のサンプルアプリに関しまして、この記事と同じ事象が発生した(この記事が役立った、もっと良い対処がある)同じ事象は発生しなかった、別の事象が発生した等の情報をいただけますと幸いです。

追記

自分と同じエラーの人を見つけた。
(AWSのアクセスキーIDとシークレットアクセスキーの設定不足)
https://ebookstore.sony.jp/review/LT000177258001711192/
やっぱり共通の問題がありそうね。

参考

著者サポートページ

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1