【AWS】基礎用語の確認

はじめに

従来の物理サーバー(オンプレミス)ではなく、クラウドコンピューティングを導入する企業が増えてきており、その中でもAWSを導入している企業が多いのではないでょうか。 なので、AWSを勉強しようと思いましたが、基本的なネットワークの知識が欠けていると感じていたため、用語の確認からはじめようと思います。

リージョン(Region)

世界各地の拠点、領域のことです AWSクラウドコンピューティングリソースは世界各地にあります(中国、欧州、南米、米国など)

アベイラビリティーゾーン(vailability Zone)

データセンターのことです 各リージョンには2つ以上のアベイラビリティーゾーンが存在します 複数のアベイラビリティーゾーンが存在することで、耐障害性が向上します

バーチャルプライベートクラウド(Virtual Private Cloud)

これを利用すると、自分で定義した仮想ネットワーク内に、AWSリソース(EC2, RDSなど)を起動させることができます

サブネット(Subnet)

ネットワークを小さく分割(グループ化)したものです

デフォルトゲートウェイ(Default Gateway

ネットワーク上でプロトコルが異なる通信可能にするものです

ルーター(Router)

自身の属するネットワーク外へ通信する際に、ルーターを経由します

NAT(Network Address Translation)

プライベートIPアドレスグローバルIPアドレスに変換する技術のことです

踏み台(Bastion)

サーバーメンテナンスの為の、接続経路用途で用意されるサーバーのことです

セキュリティグループ

異なるセキュリティグループに属するインスタンスと通信を行う際に、 トラフィックの制御を行う仮想ファイアウォールとして機能します

ElasticIP

インターネットからアクセス可能なパブリック IPv4 アドレスのことです

VPCエンドポイント

VPCインスタンスがプライベート IP アドレスを使用して、 他のサービス (S3, RDS等) のリソースと通信できる仕組みのことです

まとめ f:id:haru89:20200607090344p:plain:w70

ネットワークの基礎を理解することで、AWSの知見も深めていきたいと思います。

参考

https://docs.aws.amazon.com/index.html

【Rails】ActionController::RoutingError

エラーが発生した経緯

コントローラとアクションの作成とルーティングの設定をし

bin/rails s

してからビューを確認しようとすると、下記のエラーが発生しました

ActionController::RoutingError (uninitialized constant ManagementController):

ManagementControllerという定数(もしくはクラス)が定義されていない!と怒られました

原因

クラスの読み込みが上手くいっていない

rubyファイルを実行した時にbin/rails sした直後は実行時点でクラスを読み込んでいないので、app/models/management.rbファイルを探しにいきます

app/models/management.rbというファイルがあれば、ファイルをオープンしてクラスを読み込みます

しかし、app/models/management.rbというファイルがなく、ファイルの中にManagementというクラスが定義されていない場合、uninitializedエラーが発生します

Rubyの場合、クラスは定数にClassオブジェクトが保存されてるだけなのでこのようなエラーが出ます

ファイル名とファイルパス、ファイル中のクラス名を確認すると、

コントローラー名が複数形になっていませんでした

management_controller.rb

ではなく、正しくは

managements_controller.rb

参考 f:id:haru89:20200531090445p:plain:w70

https://qiita.com/imotan/items/c73fab5ee230114a08b6

【Heroku】seedデータの投入方法

seedデータとは

データベースに投入する初期データのことです

開発環境と本番環境にそれぞれseedデータを作成してみます

1. 開発環境にseedファイル「members.rb」を作成します

myapp $ touch db/seeds/development/members.rb

2. 作成された「members.rb」を編集します

names = %w(Taro Jiro Hana John Mike Sophy Bill Alex Mary Tom)
fnames = ["佐藤", "鈴木", "高橋", "田中"]
gnames = ["太郎", "次郎", "花子"]
0.upto(9) do |idx|
  Member.create(
    number: idx + 10,
    name: names[idx],
    full_name: "#{fnames[idx % 4]} #{gnames[idx % 3]}",
    email: "#{names[idx]}@example.com",
    birthday: "1981-12-01",
    sex: [1, 1, 2][idx % 3],
    administrator: (idx == 0),
    password: "asagao!",
    password_confirmation: "asagao!"
  )
end

0.upto(29) do |idx|
  Member.create(
    number: idx + 20,
    name: "John#{idx + 1}",
    full_name: "John Doe#{idx + 1}",
    email: "John#{idx+1}@example.com",
    birthday: "1981-12-01",
    sex: 1,
    administrator: false,
    password: "password",
    password_confirmation: "password"
  )
end

3. seedデータを投入します

myapp $ rails db:seed

4. 先ほど作成したseedファイル「members.rb」を本番環境にコピーします

myapp $ cp db/seeds/development/members.rb db/seeds/production

5. ここまでの変更をpushします

myapp $ git push
myapp $ git push heroku

6. Herokuのデータベースをリセットします

myapp $ heroku pg:reset DATABASE

7. マイグレーションを実行します

myapp $ heroku run rails db:migrate

8. seedデータを入れて完了です

myapp $ heroku run rails db:seed

参考 f:id:haru89:20200509141621p:plain:w70

https://blog.cloud-acct.com/posts/spa-seeddata-setup/

【Rails】migrationのメリットと注意点

マイグレーションとは

「移動」「移入」「移住」といった意味をもつ言葉です。

マイグレーションの機能

データベース内にテーブルを作成することができます。

SQLよりも簡単にテーブル作成ができる?

SQLを使ってテーブルを作成する場合

1. テーブルを作成するSQLを作成する

2. コンソール上でデータベースに接続する

3. 作成したSQLを実行する

4. 実行した結果を確認するSQLを作成する

5. 作成したSQLを実行する

マイグレーションを行ってテーブルを作成する場合

1. マイグレーションファイルを作成

$ rails g migration マイグレーションファイル名

2. マイグレーションファイルの中身を書き換える

マイグレーションファイルの中身の例)

names = %w(Taro Jiro Hana John Mike Sophy Bill Alex Mary Tom)
fnames = ["佐藤", "鈴木", "高橋", "田中"]
gnames = ["太郎", "次郎", "花子"]
0.upto(9) do |idx|
  Member.create(
    number: idx + 10,
    name: names[idx],
    full_name: "#{fnames[idx % 4]} #{gnames[idx % 3]}",
    email: "#{names[idx]}@example.com",
    birthday: "1981-12-01",
    sex: [1, 1, 2][idx % 3],
    administrator: (idx == 0),
    password: "asagao!",
    password_confirmation: "asagao!"
  )
end

3. マイグレーションを実行

$ rails db:migrate

また、データベースの種類によっては、SQLの書き方が異なることがあります。

マイグレーションでは、データベースの種類に依存しないこともメリットだと言えそうです。

注意点

開発環境でマイグレーションを実行しても、本番環境に同期されるわけではないので、本番環境でもマイグレーションを実行する必要があります。

参考 f:id:haru89:20200704003853p:plain:w70

https://www.transnet.ne.jp/2015/12/29/rails%E5%88%9D%E5%BF%83%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8D%E3%82%84%E3%81%99%E3%81%84%E3%80%8C%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%8Dcolnr/

【Herokuエラー】Detected sqlite3 gem which is not supported on Heroku:

はじめに

Rails アプリを Heroku にデプロイしようとしたら

remote:        An error occurred while installing sqlite3 (1.3.13), and Bundler cannot
remote:        continue.
remote:        Make sure that `gem install sqlite3 -v '1.3.13'` succeeds before bundling.
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !     Detected sqlite3 gem which is not supported on Heroku:
remote:  !     https://devcenter.heroku.com/articles/sqlite3
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.

sqlite3は使えないよと怒られました。

HerokuはSQLiteが使えない

なので、開発・テスト環境ではSQLite3、本番環境ではPostgresqlを使うようにGemfileを修正しました。

group :development, :test do
  gem 'sqlite3'
end

group :production do
  gem 'pg', '1.2.3'
end

あとは以下のコマンドをたたいて、gemをインストールすればOKです。

$ bundle install

参考 f:id:haru89:20200620193932j:plain:w70

https://qiita.com/MosamosaPoodle/items/7149aa66f1c087472777

【Railsエラー】Could not find gem 'rails-il8n (~> 5.1)' in any of the gem sources listed in your Gemfile or in gems cached in vendor/cache.

はじめに

アプリケーションの文言を日本語化するために、「rails-i18n」というgemをインストールする際に下記のエラーが発生しました。

Could not find gem 'rails-il8n (~> 5.1)' in any of the gem sources listed in your Gemfile or in gems cached in vendor/cache.

エラー発生の経緯

1. Gemfileに「rails-il8n」を追記

gem 'rails-il8n', '~> 5.1'

2. ターミナルで「bundle install」

  → エラー発生

$ bundle install
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
<span style="color: #d32f2f">Could not find gem 'rails-il8n (~> 5.1)' in any of the gem sources listed in
your Gemfile or in gems cached in vendor/cache.</span>

試したこと

1. スペルミスの確認

2. gemをupdate

bundle update

3. bundlerを再インストール

$ rbenv exec gem install bundler
$ rbenv rehash

4. Gemfile.lockを削除

5. springプロセスをkill

$ ps aux | grep spring
$ kill xxxx

6. 再びスペルミスの確認

gemの名前が間違っていることに気づきました

rails-il8n

ではなく、正しくは

rails-i18n

まとめ f:id:haru89:20200614074508p:plain:w70

エラー発生後、一番最初にスペルミスを確認したのに、見逃してしまっていた。今後は「1」と「l」など、紛らわしいものには特に注意して、コーディングしたいと思います。

参考

https://carefree-se.hatenablog.com/entry/2015/07/22/125904

【SQL】サブクエリ(副問合せ)がNULLを含んでいた場合

はじめに

NOT INまたは<>ALLで判定するサブクエリ(副問合せ)の結果にNULLが含まれると、全体の結果もNULLとなります。

データにNULLが含まれると、取得されるはずのデータが取得できなくなることがあるので、サブクエリの結果からNULLを除外する方法を調べてみました。

サブクエリの結果からNULLを除外する方法は2つ

1. サブクエリの絞り込み条件に、IS NOT NULL条件を含める

2. COALESCE関数を使ってNULLを別の値に置き換える

上記それぞれの方法を使って、サブクエリの結果からNULLを除外します

1. サブクエリの絞り込み条件に、IS NOT NULL条件を含める

SELECT * FROM 家計簿
 WHERE 費用 IN ( SELECT 費用 FROM 家計簿
             WHERE 費用 IS NOT NULL )

=> NULLを除外する条件を付与

2. COALESCE関数を使ってNULLを別の値に置き換える

SELECT * FROM 家計簿アーカイブ
 WHERE 費用 IN ( SELECT COALESCE( 費用, '不明’) FROM 家計簿 )

=> 費用がNULLなら代わりに'不明'にする

まとめ f:id:haru89:20200607090344p:plain:w70

データにNULLが含まれていたことが原因で、取得できるはずのデータが取得できないケースは、原因がわかりにくいので、サブクエリの結果から確実にNULLを除外するよう注意が必要だと思います。

参考

スッキリわかるSQL入門 第2版

中山清喬 (著), 飯田理恵子 (著), 株式会社フレアリンク (監修)