サウナ行きたい

Rails, AWSのことについて書きます

【M1 Mac】Rails×Docker環境でbundle installが通らないときに確認すること

結論

M1 Macであることは関係なく、メモリ割り当てが少なかった。

Dockerのメモリ設定が初期の2GBになってたので6GBに設定したら解決しました。

起きたこと(タイトルの内容)

Docker上でRailsの環境構築をしている際、 bundle installが途中でKilledになる

解決法

🐳→Preferences→Resources→Advanced→Memory を変更

自分は6GBにしましたがスペックに合わせてください。

その他の問題(M1 Mac特有?)

MySQLコンテナが使えない

docker-compose.ymlの抜粋です

変更前

  db:
    image: mysql:5.7

変更後

db:
    image: mysql:5.7
    platform: linux/x86_64 # ←この行を追加

参考

stackoverflow.com

yarn を入れるコマンドでno valud opengpg data found

変更前

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

変更後

RUN wget --quiet -O - /tmp/pubkey.gpg https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
    echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

参考

zenn.dev

ECS(EC2起動タイプ)のインスタンスタイプ変更でterminatedのインスタンスが増え続ける現象に遭遇した

はじめに

  • 自分の理解度が足りてないので曖昧なことを書いている可能性があります。ご了承ください。

やりたかったこと

  • ECSのEC2起動タイプで、動作が不安定だったのでインスタンスタイプの変更をしたかった

試みたこと

起きたこと

原因(推測)

  • AutoScalingの設定でロードバランサ(ELB)とELBによるヘルスチェックを設定していて、EC2にヘルスチェックが飛んでいたっぽい
    • ヘルスチェック失敗して新しいインスタンスができてた
    • 今回作成した環境では両方不要だった

CircleCIのaws-ecs Orbで指定するオプションについて

はじめに

GUIからECSを設定したのでfamilyという単語に聞き覚えがなかったり、自分の設定ファイルではservice名を指定していないのに動いたりと不思議が多かったのでメモ

よく使うオプション

family

  • タスク定義名
  • 最初は「何故task-nameじゃなくてfamily..?」と思いましたが、タスク定義の詳細画面でJSONタブを開いてみるとタスク名がfamilyの値になっているので「もともとそういう名前なのか...」と気づくことができます

cluster-name

container-image-name-updates

  • タスク定義内のコンテナのイメージを更新するためのオプション
  • container=<container-name>,image-and-tag=<image-name>:<tag-name>|image=<image-name>|tag=<tag-name>,container=...,image-and-tag|image|tag=...,
    • 複数指定したい場合は、container=<container-name>,image-and-tag=<image-name>,container=<container-name>,image-and-tag=<image-name>...のようにコンマで繋いでいく
    • containerは必須で、imageの指定法が、
      • image名のみ
        • タグは更新前のタスク定義のものを使用
      • tagのみ
        • イメージは更新前のタスク定義のものを使用
      • image名とtag

service-name

  • サービス名
  • 指定しなかった場合はfamilyの値が使用されます -個人的にプチハマりポイントだと思います。サービスとタスク定義の名前を同じにしていて

参考文献

https://circleci.com/orbs/registry/orb/circleci/aws-ecs?version=1.3.0#jobs-deploy-service-update

accepts_nested_attributes_for で、 "no implicit conversion of Symbol into Integer" エラーが出るときに確認すること

accepts_nested_attributes_forとは

Railsで関連テーブルを関連元と同時に保存する機能

accepts_nested_attributes_for の設定例

関連元モデル

class User < ApplicationRecord
  has_many :devices
  accepts_nested_attributes_for :devices
end

関連先モデル

class Device < ApplicationRecord
  belongs_to :user
end

controllerのストロングパラメータ

params.require(:user).permit(
  :name,
  :email,
  devices_attributes: [
    :name
  ]
)

起きたことと解決法

{
  "user": {
    "name": "taro",
    "email": "aa@example.com",
    "devices_attributes": {
      "name": "phone"
    }
  }
}

上記のパラメータを InsomniaからPOSTした際に、 no implicit conversion of Symbol into Integer が発生

一見意味がわかりませんでしたが、ストロングパラメータをよく見ると、devices_attributesが配列になっているではありませんか!

ということで、パラメータを

{
  "user": {
    "name": "taro",
    "email": "aa@example.com",
    "devices_attributes": [
      {"name": "phone"}
    ]
  }
}

に変更するとスパッと通りました

ECS (EC2起動タイプ) 他のコンテナに接続できない

背景

Railsの環境構築中、redisとappコンテナの接続をする必要があったのですが、ありとあらゆるホスト名を試しても接続できませんでした。

そこで、普段docker-composeを利用しているように書く方法はないかと思ったら普通に存在して驚いたので書き残そうと思った次第であります。

前提

  • ECS EC2起動タイプ
  • タスク定義のネットワークモード:default

ECSの設定

タスク定義→コンテナの定義→link で、

{リンクしたいコンテナの名前}:{接続する際の名前}, {リンクしたいコンテナの名前}:{接続する際の名前}, ...

のように書けるそうです。

特にこだわりがなければ、

redis:redis

のようにすれば、コンテナ名と接続する際の名前が同じになってわかりやすいと思います

RailsでRedis設定をしている人向け

(Railsのredis設定)

config/environments/●●.rb に

config.cache_store = :redis_cache_store, {
    url: 'redis://redis/0/cache',
    expires_in: 90.minutes
  }

を追記

Rails enumではないカラムで値のパターンがある場合の日本語化

記事を書いた動機

Railsの日本語化で、元カラムがintegerでenumを使っている場合の日本語化はenum_helpというgemを使えば簡単なのですが、

そうではないパターンで、元カラムがstringで、enumも使っていない場合の日本語化はどうすればいいのか少し悩んだ為

(activeadmin使用中に悩んだので、activeadminでの使用例も載せています)

問題と解決法

やりたかったこと

  • Documentテーブルのstatusというカラム(仮)が、stringで管理されているが日本語化対応したい
    • 入る文字のパターンは決まっているが、諸事情でenumによる管理はできない

解決法

  • ja.yml
ja:
  document:
    status:
      approved: 承認
      denied: 否認
      checking: 確認中
  • 表示部分
# statusにはstatusの実際の値が入ります
I18n.t("document.status.#{status}")

activeadminで使った例

  • index画面
column :status do |document|
  I18n.t("document.status.#{document.status}")
end

activeadminでcssが読み込まれない(staging, production環境)

記事を書いた動機

  • staging環境(productionと同じ設定)を作成しているとき、activeadminのcss(たぶんjsも)が読み込まれなくて困った

起きたことと解決法

The asset "active_admin.css" is not present in the asset pipeline.

  • 原因:assets:precompileを忘れていた
  • 解決法:assets:precompileを実行
    • ECSなのでDockerfileにRUN DB_ADAPTER=nulldb bundle exec rails assets:precompileを追加

ActionController::RoutingError (No route matches [GET] "/assets/admin/active_admin-●●.css

  • 原因:まだ理解しきってないので書けません
  • 解決法:config/enviroments/staging.rbのconfig.public_file_server.enabledをtrueに変更