㊙️

🐳 DockerでVimを使ってRails Credentialsを編集する完全ガイド

2024/05/31に公開

はじめに

こんにちは、Takeです。都内の自社開発企業でエンジニアとして働いています。

この記事では以下について説明します。

  • Slackと連携したアプリケーションでメンションをつけたアラートを通知する方法
  • SlackのメンバーIDを安全に管理してアプリケーションコード内で適切に使用するための手順
  • Docker環境でVimを利用してRails Credentialsに情報を追加する方法

以下の記事を読むと今回の内容が入ってきやすいので、ぜひクリックしてご覧ください👇

https://zenn.dev/take_tech/articles/93ea22e4818208

具体的な手順

1. SlackメンバーIDの取得

SlackからメンバーIDを取得します(方法を確認しておく)。

https://scheduling.help.receptionist.jp/slack-id/#gsc.tab=0

2. アプリケーション側でSlackへのアラートを実装

Slackにアラートを飛ばす部分のメッセージに取得したSlackメンバーIDを記載します。
※過去に書いた以下の記事をもとにコードを記載します。
https://zenn.dev/take_tech/articles/93ea22e4818208

message = "【メンション】 sampleMemberId \n"\             

問題点その1.

SlackメンバーIDの文法が間違えている。

修正方法

Mentioning users
A mention is a special type of reference that provides a link to the mentioned user's profile in the published text. If the mention is included in an app-published message, the mentioned user will also be notified about the reference. This Help Center article describes what that notification process looks like.
To mention a user in app-published text, provide their user ID in the following syntax:

Hey <@U012AB3CD>, thanks for submitting your report.

上記のように<@〜>でSlackメンバーIDを囲む必要があります。

# 良い例
message = "【メンション】 <@sampleMemberId> \n"\             

https://api.slack.com/reference/surfaces/formatting#mentioning-users

問題点その2.

アプリケーションコード内にSlackメンバーIDを直接記載することはセキュリティリスクを伴います。主に以下の理由によります。

  • 情報漏洩のリスク
    • コードが誤って公開されてしまった場合やリポジトリが不正アクセスを受けた場合にメンバーIDが外部に露出するリスクがあります
  • メンテナンス性の低下
    • 複数の環境(開発、ステージング、本番)で異なるメンバーIDを管理するケースがある場合、IDの管理が困難になります。
  • 可読性の低下
    • もし、複数人にメンションを送る要件になった場合、アプリケーション側の可読性が下がります。

主に3点挙げましたが、情報漏洩のリスクは軽減させたいのでRails Credentials側にSlackメンバーIDを含む秘密情報を保持させていきましょう。

修正方法

以下のようにSlackメンバーIDを任意の変数に置き換えます。
Rails.application.credentialsを追加します。

また、Rails CredentilasにSlackメンバーIDの値を持たせます。(後述)

app/jobs/export_entry_job.rb

retry_on StandardError, wait: 5.seconds, attempts: 3 do |job, exception|
    ・
        ・
        ・
    slack_user_id = Rails.application.credentials.slack[:user_id] // 追加

message = "【メンション】 @#{slack_user_id} \n"\             

Rails.application.credentialsの書き方の参照記事
https://railsguides.jp/security.html#独自のcredential

3. DockerコンテナにVimをインストール

そもそもDockerコンテナが正常に起動するか確認します。

# キャッシュなしでdocker-compose.ymlファイルを読み込みimageを生成
docker image build -no--cache
# フォアグラウンドで全てのコンテナを起動
docker compose up

# バックグラウンドで全てのコンテナを起動
docker compose up -d
# 実行中のコンテナを確認
docker container ls
docker ps
コマンド 引数 結果
docker image build Dockerfile イメージを作成
docker container run イメージ コンテナを起動
docker image pull イメージ Docker Hub から取得
docker container create コンテナ 新しいコンテナを作成
docker container start コンテナ 停止中のコンテナを起動
docker image ls イメージ一覧を表示
docker container ls 実行中のコンテナを表示
docker compose up 複数のコンテナを起動
docker compose up -d 複数のコンテナをデタッチモードで起動

https://zenn.dev/suzuki_hoge/books/2022-03-docker-practice-8ae36c33424b59/viewer/2-1-points

DockerfileにVimをインストールするスクリプトを記載します。

docker-dev/app/Dockerfile

# 必要なパッケージのインストール
RUN apt-get update -qq && \
    apt-get install -y gnupg2 curl && \
    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash && \
    export NVM_DIR="$HOME/.nvm" && \
    [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" && \
    nvm install --lts && \
    apt-get install -y default-mysql-client && \
    apt-get install -y vim  # ------------------->追加

-yは全ての確認に自動的でyesと回答するコマンド

https://qiita.com/YumaInaura/items/3432cc3f8a8553e05a6e

  • &&A && Bならば、Aが実行されたらBも実行するといった直列回路のイメージ
  • \:改行

https://qiita.com/ydah/items/528aefd1a1cab51285c3

# vimの追加分を反映する
docker image build -no--cache
# 再度Dockerコンテナが正常に起動するか確認する
docker compose up -d

# 実行中全てのコンテナを表示
docker container ls

4. vimでRails CredentialsにSlackメンバーIDを追加

# 該当のDockerコンテナに入る
Docker exec -it ContainerName /bin/bash
# 以下のように表示されたらコンテナに入れています⭕️
root@12345sample:/myapp#

staging環境から行います(今回の場合はdevelopment、productionも環境あり)。

# Editorにvimを指定してRails Credentialsを編集するコマンドを実行する
EDITOR="vim" rails credentials:edit --environment staging
EDITOR="vim" rails credentials:edit --environment development
EDITOR="vim" rails credentials:edit --environment production

vimで編集するためi(insert)を入力して、以下を追加

# 取得したSlackメンバーIDをails Credentialsに記載する
slack:
    user_id: slackMemberId
  • escapei(insert)から抜ける
  • :wで`変更を保存する
  • :qで`vimから抜ける

https://qiita.com/hide/items/5bfe5b322872c61a6896

5. 動作確認

動作確認のため、Dockerコンテナに入った状態でRails Consoleを開きます。

# 以下のように表示されたらコンテナに入れています⭕️
root@12345sample:/myapp#
# 普段はrails c
rails console
# 追加したSlackメンバーIDがレスポンスされればOK⭕️
pry(main)> slack_user_id = Rails.application.credentials.slack[:user_id]
=> "slackMemberId"
# 何かが違う❌
pry(main)> slack_user_id = Rails.application.credentials.slack[:user_id]
=> nil

原因の例:

-master.keyが異なる
- staging.yml.encなどと対応するmaster.keyが異なっているパターンです。

  • yml.enc.ファイルが異なる
    • EDITOR="vim" rails credentials:edit --environment developmentなどでタイポして誤ったファイルが作成されているパターンです。

以上です!🙌

まとめ

以上の手順を通じてSlackメンバーIDを取得し、セキュアに管理しながらアプリケーション内でアラートを送信する方法について学びました。

特に、Rails Credentialsを用いて機密情報を安全に保持すること、Docker環境で必要なツールをインストールして設定を行うことの重要性について理解できたかと思います。

最後に

ここまで読んでいただきありがとうございました!
今回の記事が良かったと思ったらぜひ「いいね」を押していただけると嬉しいです 🎉

noteでも記事を執筆していますので、ぜひチェックしてみてください。
https://note.com/take_lifelog/n/n58df7ce7af6f

他にもこのようなことについて記載しているのでお読みいただければ幸いです。

https://zenn.dev/take_tech/articles/275e5f4242973d

https://zenn.dev/take_tech/articles/374817f256ec9d

最後までお読みいただき、誠にありがとうございました!🥳

Discussion