🐳 DockerでVimを使ってRails Credentialsを編集する完全ガイド
はじめに
こんにちは、Takeです。都内の自社開発企業でエンジニアとして働いています。
この記事では以下について説明します。
- Slackと連携したアプリケーションでメンションをつけたアラートを通知する方法
- SlackのメンバーIDを安全に管理してアプリケーションコード内で適切に使用するための手順
- Docker環境でVimを利用してRails Credentialsに情報を追加する方法
以下の記事を読むと今回の内容が入ってきやすいので、ぜひクリックしてご覧ください👇
具体的な手順
1. SlackメンバーIDの取得
SlackからメンバーIDを取得します(方法を確認しておく)。
2. アプリケーション側でSlackへのアラートを実装
Slackにアラートを飛ばす部分のメッセージに取得したSlackメンバーIDを記載します。
※過去に書いた以下の記事をもとにコードを記載します。
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"\
問題点その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
の書き方の参照記事
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 |
複数のコンテナをデタッチモードで起動 |
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
と回答するコマンド
-
&&
:A && B
ならば、Aが実行されたらBも実行するといった直列回路のイメージ -
\
:改行
# 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
-
escape
でi
(insert)から抜ける -
:w
で`変更を保存する -
:q
で`vimから抜ける
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でも記事を執筆していますので、ぜひチェックしてみてください。
他にもこのようなことについて記載しているのでお読みいただければ幸いです。
最後までお読みいただき、誠にありがとうございました!🥳
Discussion