メインコンテンツにスキップ

4件の投稿件の投稿が「cli」タグ付き

すべてのタグを見る

알아두면 쓸데있는 개발자 도구 - CLI 편

· 10分の読み時間
Haril Song
Owner, Software Engineer at 42dot

Overview

최고의 App 을 설명했던 지난 글 에 이어서 Command Line Interface(이하 CLI) 중 추천할만한 도구를 살펴본다. 이번에 소개되는 모든 툴들은 필자가 최소 6개월 이상 써본 도구들이며, 새로운 장비를 설정할 때 반드시 설치하는 것들이다.

zoxide

GitHub - ajeetdsouza/zoxide: A smarter cd command. Supports all major shells.

한 번이라도 방문했던 디렉토리라면 경로를 기억할 필요가 없게 해주는 툴. 예를 들면 아래와 같은 경우다.

cd ~/.config/somewhere/longlong/path

# 다음부터는 아래 명령으로 바로 방문가능
z path

이게 굉장히 편리해서, 특정 설정 파일이 어디있는지 기억할 필요가 없어진다. zi 를 사용하면 우선순위 List 가 출력되기 때문에, fuzzy 하게 찾아갈 수도 있다.

한 번 써보면 다시는 이 툴을 사용하기 전으로 돌아갈 수 없을 것.

mise

GitHub - jdx/mise: dev tools, env vars, task runner

각종 환경변수 및 언어, 패키지들의 버전 매니저. 구조상 안정성이 매우 뛰어나며, Rust 로 구현되어 속도도 빠르다. 직관적인 명령어는 러닝커브를 크게 완화시켜 준다.

이미 본 블로그에 글로도 소개했을만큼, 굉장히 애정하는 툴이다. mise 역할을 해줄 비슷한 도구는 몇가지 더 있지만 개인적으로는 그 중 가장 추천할만하다고 생각한다. 예를 들면, direnv 는 mise 로 완전히 대체가 가능하고 nix 는 과하게 복잡하여 범용성이 떨어진다.

다양한 언어를 다루는 프로그래밍 Multilingual 이라면, 꼭 써보자.

chezmoi

chezmoi

사용하는 장비가 여러 대라면, 개발 환경을 동기화하기가 여간 귀찮은게 아니다. 특히 CLI 를 자주 사용하는 개발자라면 더더욱.

아예 동기화를 포기하고 지낼 생각이라면 모르겠지만, 어떻게 동기화할 수 있을지 고민하고 있다면 chezmoi 를 써보자. 혹여, 새로운 장비를 구매하더라도 초기 설정에 시간을 들일 필요가 없어진다.

mise 와 마찬가지로 본 블로그에 사용법에 관한 이 있으니 참고.

fzf

GitHub - junegunn/fzf: :cherry_blossom: A command-line fuzzy finder

GitHub Star 약 70k, 더 이상의 설명이 필요할까(참고로 spring-framework 가 57k 이다).

한국인 개발자인 junegunn 님께서 관리하시는 오픈소스 fuzzy finder 로, 표준입출력 파이프라이닝을 통해 어마어마한 범용성을 자랑한다.

검색이 필요하다면, 종류에 상관없이 fzf 를 쓰면 된다. 워낙 이런저런 패키지들이 가져다가 쓰는 중이라, fzf 의 존재를 몰랐더라도 이미 간접적으로 쓰고 있었을 수 있다.

fd

GitHub - sharkdp/fd: A simple, fast and user-friendly alternative to 'find'

find 명령을 대체한다.

Rust 로 작성되었으며, find 에 비해 최대 50% 빠르다고 한다. highlighting 도 깔끔한 편이고, 명령어 옵션도 find 보다 훨씬 직관적이다.

ripgrep

GitHub - BurntSushi/ripgrep: ripgrep recursively searches directories for a regex pattern while respecting your gitignore

grep 명령을 대체한다. 이름은 ripgrep 이지만 rg 를 명령어로 사용한다.

fd 와 비슷하게, Rust 로 작성되었다. grep 에 비해 출력으로 훨씬 다양한 정보를 얻을 수 있다. 명령어도 직관적이라 사용도 쉬운데 속도까지 빠르니 안쓸 이유가 딱히 없다.

그야말로 'RIP, grep'.

lsd

GitHub - lsd-rs/lsd: The next gen ls command

ls 명령을 대체한다.

ls 명령은 어마어마하게 많이 쓰는 명령이다. 명령어 자체가 오래되었기도 하지만, 출력으로 알 수 있는 정보가 다양하지는 않다. lsd 를 사용하면 기존 ls 를 완전히 대체할 수 있다.

bat

GitHub - sharkdp/bat: A cat(1) clone with wings.

cat 명령을 대체한다.

cat 명령은 단순 출력이지만, bat 을 사용하면 code highlighting 을 누릴 수 있다. 어느 정도 눈치 빠른 개발자라면 라인 출력을 보고 '쉘 파이프라이닝을 방해하는거 아닐까' 걱정이 될 수 있지만, 전혀 방해하지 않는다. 걱정말고 신문물을 누려보자.

필자는 bat 명령의 alias 를 cat 으로 설정하여 사용하고 있다.

HTTPie

HTTPie – API testing client that flows with you

curl 을 대체한다.

APP 도 있어서 어느 글에 포함시켜야할까 고민을 했지만, 개인적으로는 cli 로만 사용하기 때문에 이쪽 글로 넣었다.

curl 대신 HTTPie 를 선호하냐하면, 매우매우 직관적이기 때문이다. 간단한 GET 요청은 아래처럼 보낼 수 있다.

https httpie.io/hello

응답은 이렇게 포맷팅되어 온다.

curl 응답을 떠올려보자. 개발자도 예쁜걸 좋아한다.

Orbstack

OrbStack · Fast, light, simple Docker & Linux

Docker Desktop 을 대체한다.

Docker 컨테이너를 사용할 때 조금 더 빨라지고 몇몇 버그들이 사라진다. 하지만 진정한 진가는 VM 을 사용할 때인데, 전통적으로 VM 을 쓰기 어려웠던 맥에서 VM 을 굉장히 가볍게 실행시킬 수 있다. 우분투나 칼리리눅스 등의 OS 에서 테스트가 필요할 경우, orbstack 을 사용하면 매우 빠르고 편리하게 관리할 수 있으니 사용해보자. 개인적으로 매우 재밌는 경험이었다.

atuin

GitHub - atuinsh/atuin: ✨ Magical shell history

chezmoi 를 사용하면 사용하는 도구들의 설정은 동기화할 수 있었다. atuin 을 사용하면 회사에서 쳤던 명령어 history 를 동기화할 수 있다. 더 이상 회사에서 사용했던 명령어가 뭐였는지 기억해내려고 안간힘을 쓸 필요가 없다.

警告

한가지 아쉬운 점은 터미널로 Warp 를 사용한다면 온전히 atuin 을 활용하기 어렵다는 점이다. Warp 는 자체 history 기능을 제공하여 atuin 과 간섭이 있다. 아래 명령을 사용하면 history 에서 명령어 검색이 가능하여, 임시방편으로 쓰고 있다.

atuin history list | fzf

trash-cli

터미널에 '휴지통' 기능을 구현한다. 따라서 더 이상 rm -rf / 을 두려워할 필요가 없어진다. 얼마든지 복원이 가능하기 때문.

개발자 최대의 적인 rm -rf / 에서 자유로워질 수 있다는데, 그 이상의 이유가 필요한가?

Conclusion

지금까지 개인적으로 매우 좋아하는 여러 툴들을 소개했다.

사실 이 외에도 추천할만한 도구는 얼마든지 더 있지만, 누가 뭘 추천해주든 자기 손에 익은게 제일 좋은 법이다. 나머지는 자신의 환경에 맞게 찾아써보자.

情報

사용 중인 모든 툴은 여기서 볼 수 있다.

AWS S3と自動化による環境変数の管理

· 8分の読み時間
Haril Song
Owner, Software Engineer at 42dot

状況

  • コードベースが成長するにつれて、Springアプリケーションを実行するために必要な設定値の数が増加しています。
  • ほとんどの状況はテストコードで検証されますが、ローカルでbootRunを使用してテストする必要がある場合もあります。

問題点

  • 設定値を環境変数に分離して管理したい。
  • .envファイルは通常Gitで無視されるため、バージョン管理が難しく、断片化しやすい。
    • 複数のマシン間でファイルを同期する方法が必要です。

質問

  • 開発者間の摩擦を最小限に抑え、簡単に適用できる便利な方法はありますか?
    • メンテナンスが容易な、馴染みのある方法が望ましいです。
  • .envファイルのバージョン管理は可能ですか?
  • 学習曲線は低いですか?
    • 解決策が問題よりも複雑になる状況は避けたいです。
  • 本番環境に直接適用できますか?

回答

AWS S3

  • AWS CLIを使用して.envファイルを更新するのは便利です。
  • .envファイルのバージョン管理はスナップショットを通じて行えます。
  • AWS S3は多くの開発者に馴染みがあり、学習曲線が低いです。
  • AWS ECSの本番環境では、S3 ARNを使用してシステム変数を直接適用できます。

.

..

...

....

それだけですか?

それだけだと、記事が少し退屈に見えるかもしれませんね?もちろん、まだいくつかの問題が残っています。

どのバケットにあるのか?

S3を使用する際、ファイル構造の最適化やビジネス特有の分類のために多くのバケットが作成されることが一般的です。

aws s3 cp s3://something.service.com/enviroment/.env .env

もし.envファイルが見つからない場合、上記のようにAWS CLIを使用してダウンロードする必要があります。事前に誰かがバケットを共有してくれない限り、環境変数ファイルを見つけるためにすべてのバケットを検索する必要があり、不便です。共有を避けるつもりでしたが、再度共有するために何かを受け取るのは少し面倒に感じるかもしれません。

バケットが多すぎる。envはどこにあるのか?

S3内のバケットを探索して必要な.envファイルを見つけてダウンロードするプロセスを自動化すると、非常に便利です。これはfzfやgumのようなツールを使用してスクリプトを書くことで実現できます。

Spring Bootはシステム環境変数を必要とし、.envではない...

一部の方はすでにお気づきかもしれませんが、Spring Bootはシステム環境変数を読み取ってYAMLファイルのプレースホルダーを埋めます。しかし、単に.envファイルを使用するだけではシステム環境変数が適用されず、Spring Bootの初期化プロセス中に拾われません。

簡単にその仕組みを見てみましょう。

# .env
HELLO=WORLD
# application.yml
something:
hello: ${HELLO} # OSのHELLO環境変数から値を取得します。
@Slf4j
@Component
public class HelloWorld {

@Value("${something.hello}")
private String hello;

@PostConstruct
public void init() {
log.info("Hello: {}", hello);
}
}

SystemEnvironmentPropertySource.java

@Valueのプレースホルダーが解決されず、Beanの登録が失敗し、エラーが発生します。

単に.envファイルがあるだけでは、システム環境変数として登録されません。

.envファイルを適用するには、exportコマンドを実行するか、IntelliJの実行構成に.envファイルを登録する必要があります。しかし、exportコマンドを使用してローカルマシンに多くの変数をグローバルに登録すると、上書きなどの意図しない動作が発生する可能性があるため、IntelliJのGUIを通じて個別に管理することをお勧めします。

IntelliJはGUIを介して.envファイルの設定をサポートしています。

プレースホルダーが解決され、正しく適用されました。

最終回答 - 本当の最終回答

ふう、問題の特定と範囲設定の長いプロセスが終わりました。もう一度ワークフローをまとめ、スクリプトを紹介しましょう。

  1. 自動化スクリプトを使用して、S3から適切な.envファイルを見つけてダウンロードします。
  2. .envをシステム環境変数として設定します。

シェルスクリプトはシンプルでありながら、gumを使用してスタイリッシュに書かれています。

フルコード

#!/bin/bash

S3_BUCKET=$(aws s3 ls | awk '{print $3}' | gum filter --reverse --placeholder "Select...") # 1.

# デプロイ環境を選択
TARGET=$(gum choose --header "Select a environment" "Elastic Container Service" "EC2")
if [ "$TARGET" = "Elastic Container Service" ]; then
TARGET="ecs"
else
TARGET="ec2"
fi

S3_BUCKET_PATH=s3://$S3_BUCKET/$TARGET/

# envファイルを検索
ENV_FILE=$(aws s3 ls "$S3_BUCKET_PATH" | grep env | awk '{print $4}' | gum filter --reverse --placeholder "Select...") # 2.

# 確認
if (gum confirm "Are you sure you want to use $ENV_FILE?"); then
echo "You selected $ENV_FILE"
else
die "Aborted."
fi

ENV_FILE_NAME=$(gum input --prompt.foreground "#04B575" --prompt "Enter the name of the env file: " --value ".env" --placeholder ".env")
gum spin -s meter --title "Copying env file..." -- aws s3 cp "$S3_BUCKET_PATH$ENV_FILE" "$ENV_FILE_NAME" # 3.

echo "Done."
  1. gum filterを使用して、目的のS3バケットを選択します。
  2. envという単語を含むアイテムを検索し、ENV_FILEという変数に割り当てます。
  3. .envファイルのオブジェクトキーを最終決定し、ダウンロードを進めます。

実行プロセスのデモビデオを作成しました。

デモ

これが終わったら、先ほど述べたように、現在のディレクトリにコピーされた.envファイルをIntelliJに適用するだけです。

ヒント

direnvとIntelliJのdirenvプラグインを使用すると、さらに便利に適用できます。

結論

  • スクリプトはシンプルであるため、メンテナンスが容易です。
  • チームの反応は非常に良好です。
  • 開発者は美学を評価しています。
  • 機密性の高い資格情報については、AWS Secret Managerの使用を検討してください。

ローカルCLIを使ったGoogle Kubernetes Engineの管理

· 5分の読み時間
Haril Song
Owner, Software Engineer at 42dot

概要

GoogleのCloud Shellを通じてウェブからどこでもkubectlを実行できるのは非常に便利ですが、簡単なクエリコマンドのためにウェブアクセスと認証を行う手間がかかるという欠点があります。この記事では、ローカルCLIを使ってGoogle Cloud Kubernetesを迅速に管理する方法を紹介します。

目次

GCP CLIのインストール

まず、GCP CLIをインストールする必要があります。適切なオペレーティングシステムを確認し、インストールするためにgcp-cliリンクを参照してください。

接続

インストールが完了したら、以下のコマンドを使用して認証プロセスを進めます。

gcloud init

GCP Kubernetes Engineにアクセスし、クラスターの接続情報を取得する必要があります。

GKE-connect

gke-cluster-connect-2

コマンドラインアクセス用のコマンドをコピーし、ターミナルで実行します。

gcloud container clusters get-credentials sv-dev-cluster --zone asia-northeast3-a --project {projectId}
Fetching cluster endpoint and auth data.
CRITICAL: ACTION REQUIRED: gke-gcloud-auth-plugin, which is needed for continued use of kubectl, was not found or is not executable. Install gke-gcloud-auth-plugin for use with kubectl by following https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
kubeconfig entry generated for sv-dev-cluster.

プラグインのインストール

現在使用しているKubernetesのバージョンがv1.26未満の場合、gke-gcloud-auth-pluginのインストールを要求するエラーが発生することがあります。以下のコマンドを使用してプラグインをインストールします。

情報

v1.26以前では、クライアントとGoogle Kubernetes Engine間の認証を管理するためのクライアント固有のコードが既存のkubectlおよびカスタムKubernetesクライアントに含まれていました。v1.26以降、このコードはOSS kubectlに含まれなくなりました。GKEユーザーは、GKE固有のトークンを生成するために別の認証プラグインをダウンロードして使用する必要があります。新しいバイナリであるgke-gcloud-auth-pluginは、Kubernetes Client-goユーザー認証情報プラグインメカニズムを使用してkubectl認証をGKE用に拡張します。このプラグインはすでにkubectlでサポートされているため、v1.26が提供される前にこの新しいメカニズムに切り替えることができます。 - Google

gcloud components install gke-gcloud-auth-plugin
Your current Google Cloud CLI version is: 408.0.1
Installing components from version: 408.0.1

┌────────────────────────────────────────────┐
│ These components will be installed. │
├────────────────────────┬─────────┬─────────┤
│ Name │ Version │ Size │
├────────────────────────┼─────────┼─────────┤
│ gke-gcloud-auth-plugin │ 0.4.0 │ 7.1 MiB │
└────────────────────────┴─────────┴─────────┘

For the latest full release notes, please visit:
https://cloud.google.com/sdk/release_notes

Do you want to continue (Y/n)? y

╔════════════════════════════════════════════════════════════╗
╠═ Creating update staging area ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: gke-gcloud-auth-plugin ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Installing: gke-gcloud-auth-plugin ═╣
╠════════════════════════════════════════════════════════════╣
╠═ Creating backup and activating new installation ═╣
╚════════════════════════════════════════════════════════════╝

Performing post processing steps...done.

Update done!

接続コマンドを再実行すると、エラーメッセージなしでクラスターが接続されることが確認できます。

gcloud container clusters get-credentials sv-dev-cluster --zone asia-northeast3-a --project {projectId}
Fetching cluster endpoint and auth data.
kubeconfig entry generated for sv-dev-cluster.

接続が成功すると、Docker Desktopにも変化が見られます。具体的には、Kubernetesタブに新しい情報が表示されます。

1.png

その後、kubectlを使用してローカルで直接GKEリソースを確認することもできます。

kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
my-application 1/1 1 1 20d

結論

GKEリソースをローカルで効率的に管理する方法を簡単に紹介しました。ローカルでkubectlを使用することで、オートコンプリートなどの拡張機能が利用でき、Kubernetesの管理が非常に便利になります。GKEの使用が初めての方は、ぜひ試してみてください。

参考

k8s-plugin

エレガントなHTTP CLI、HTTPie

· 2分の読み時間
Haril Song
Owner, Software Engineer at 42dot

概要

curlコマンドを置き換えることができるCLIツール

Linuxを頻繁に使用する開発者であれば、curlコマンドをよく使うでしょう。サーバーから外部APIリクエストを送信するための必須コマンドですが、出力の可読性が低いという欠点があります。HTTPieはこの欠点を解消できる興味深いツールなので、紹介しましょう。

インストール

Macユーザーの場合、brewを使って簡単にインストールできます。

brew install httpie

CentOSの場合、yumを使ってインストールできます。

yum install epel-release
yum install httpie

使用方法

まず、curlを使ってGETリクエストを送信する方法です。

curl https://httpie.io/hello

curl-get

次に、HTTPieを使って比較してみましょう。

https httpie.io/hello

get

コマンドのあらゆる面で可読性が大幅に向上しています。レスポンスとヘッダーの値がデフォルトで含まれているため、別のコマンドを使用せずに一目でさまざまな情報を得ることができます。

コマンドではhttpshttpが区別されることに注意してください。

http localhost:8080

公式サイトに記載されているように、POSTリクエストを送信することもできます。

http -a USERNAME POST https://api.github.com/repos/httpie/httpie/issues/83/comments body='HTTPie is awesome! :heart:'

その他のさまざまな機能についてはGitHubで説明されているので、うまく活用すれば生産性を大幅に向上させることができます。

参考