りんごとバナナとエンジニア

エンジニア修行の記録

sh -cでコマンドを渡すときはシングルクォートを使う

KubernetesのPod内の環境変数が正しく設定されているかを確認しようとして、以下のようにしたところ、何も出力されなかった。 $ kubectl exec -it pod_name -- /bin/sh -c "echo $VAR_NAME" Podの中に入って確認すると正しく出る。 $ kubectl exec -it pod_n…

netcatのzero I/Oモードで疎通確認する

疎通確認をする際はcurlかwgetを使うことが多かったが、CKADの講座で講師がnetcatを使っているのを見て調べてみた。 netcatはサービスとの通信を確認できるコマンドであり、たいていのLinuxディストリビューションに同梱されている。KubernetesのPodに入って…

【GitHub Actions】AWS Lambdaの環境変数を自動で更新する

最近システムのリリースフローの自動化を進めることが多い。先日はLambda関数の更新の自動化を行った。この関数は環境変数を持っており、これを頻繁に更新する必要があった。 新しい環境変数をどのように渡すかが最も難しいポイントだったが、この環境変数は…

【Kubernetes】--dry-runでmanifestファイルの雛形を手に入れる

CKAD対策で学んだtips。 Kubernetes上のリソースを作る際、複雑な設定の場合はmanifestファイルを書かなければいけない。しかしYAML形式で記述を行うのはとても時間がかかるうえ、それぞれのリソース種別ごとの記法を全部は覚えられない。公式ドキュメントか…

【GitHub Actions】ファイルパスのワイルドカード指定には「*」では不十分

先日いつものようにプルリクエストを作ったら、GitHub Actionsのworkflowが全く動いてくれなかった。GitHub ActionsのSpending limitやGitHub自体の障害も疑ったが、原因はもっと単純なものだった。 yamlファイルでは、 on 節を以下のように記述していた。 o…

【GitHub Actions】docker-build-pushでECRにimageをpushする

GitHub Actionsでworkflowを書くとき、imageをビルドしてECRにpushする処理を書く機会が多い。今までは以下の様に書いていた。 jobs: build: name: Build and push Docker image runs-on: ubuntu-latest env: IMAGE_NAME: ${{ secrets.CONTAINER_REGISTRY_PA…

【Kubernetes】Jobの結果をコマンドで取得する

KubernetesのJobのうち、backOffLimit を超えてしまい失敗したもののみを抽出して削除したいときがあった。Jobの結果は type フィールドに入っており、値は Complete か Failed のいずれか。また、Jobが実行中の場合 type フィールド自体が存在しない。 kube…

【AWS】iam:PassRoleとsts:AssumeRoleの違い

AWS

AWSでロールを扱う際、iam:PassRole と sts:AssumeRole の両方が説明に出てくることが多い。どちらもロールを使えるようにするために必要なアクションだが、いまいち違いがわからなかったので改めて調べてみた。 iam:PassRole まず iam:PassRole は、ユーザ…

【AWS】CloudTrailログからリクエストのGlobal Condition Keyを推測する

AWS

AWSのポリシーを作るとき、 Condition 句を使って特定のプリンシパルをポリシー適用の例外として指定したい時がある。 Condition 句の中で指定した条件は、リクエストに含まれるGlobal Condition Keyと照らし合わせて確認され、リクエストが許可されるかどう…

【Terraform】AWS providerの認証で詰まった

先日リモート環境から、terraformで管理しているAWSのresourceを更新する作業を始めようとして terraform init したところ、アクセスができずに詰まってしまった。 $ terraform init Initializing modules... Initializing the backend... Error refreshing …

kubectlのコマンド補完を有効にする

kubectlを使っていると、current-contextの確認やnamespaceの切り替えなどでコマンドを打つのが面倒になってくる。こんなときはプラグインをインストールするのが一般的だが、その前に素の状態でできることはないか探してみたところ、kubectl自体に補完機能…

【Terraform】Dynamic BlockでModuleのArgumentを出し分ける

業務ではAWS Lambda FunctionをTerraformのModuleで管理しているが、先日Lambda Functionの1つに失敗時のアラートをつけるべく、dead letter queueを設定したいと思い立った。Terraformでは dead_letter_config Argumentを使うことで設定することができる。 …

【CKAD】素のVimでYAMLファイルを扱う時のTips

www.cncf.io CKADを受験しようと思い練習をしているが、YAMLファイルを扱うのが面倒になってきた。特にインデント調整にかなり精神力を削られる。 時間が足りないことで有名な試験なので何か便利な拡張ライブラリを探したいところだが、CKADの場合実行環境が…

localstackでローカルにS3を建てる

AWS

先日、localstackの存在を知った。このライブラリはAWSの各サービスをローカルで再現できるもので、AWSを使った機能を開発環境下でテストするのに役立つ。 github.com 一部のサービスは有料版でないと使えないが、今回は無料で使えるS3の機能を試してみた。 …

【GitHub】ssh.github.comからcloneできない

他の人が書いたスクリプトの中で、 git clone git@ssh.github.com:user/repo.git のように ssh.github.com からcloneする処理があったが、なぜかこれに失敗して困った。 error: couldn't make loader for git@ssh.github.com:user/repo.git: trouble cloning…

【Terraform】既存resourceの名前だけを変えたい

社内勉強会で教えてもらった内容。 Terraformで既存のresourceの名前を変えたいとき、普通にtfファイル内でresourceの名前を変更するだけだと、resource全体が作り直し(destory->create)されてしまう。 例えば以前の記事で使った aws_internet_gateway resou…

【MySQL】あるはずの権限が使えない場合はログインアカウントを確認する

先日MySQLにログインしたとき、付与されているはずの権限がなくクエリを投げられなかったことがある。ユーザ名は確かに合っていたのだが、問題はログイン元のホストにあった。 MySQLのユーザに権限を付与するとき、以下のようにユーザ名だけではなくホストも…

【terraform】importコマンドでtfstateファイルを複数モジュールに分割する

「コンテナ時代のWebサービスの作り方」を読みながらTerraformを触ってみている。 booth.pm その中で、Terraformを使う例としてVPCとEC2を作成する項目があった。本ではまず1つのtfファイルに両方のリソースをまとめて記述した後、ec2とvpcでモジュールを分…

【bash】コマンドの戻り値をワンライナーで確認するときの注意

bashのスクリプトを書くとき、直前のコマンドの戻り値を見て条件分岐させたいことがよくある。戻り値は $? で取得できるのだが、このコマンドはいかなる場合でも直前のコマンドしか考慮してくれない。 例えば、以下は $? の誤った使い方である。 which aws |…

Kafka Dockerで$KAFKA_HOMEと$ZKの値を設定する

Kafka Dockerを使ってKafkaの実行環境を作っていたが、コンテナに接続してtopic一覧を表示しようとした際に、チュートリアルにある環境変数 $KAFKA_HOME と $ZK がどこで設定できるのかわからず詰まってしまった。 $KAFKA_HOME/bin/kafka-topics.sh --descri…

【Java】Nested Classの使いどころ

Javaで特定のクラスに強く紐づく小さなクラスがあるとき、それをネストさせている書き方と、ネストさせずに1ファイル内に並列して置く書き方の両方をよくみる。どちらを使うと良いのか迷うことが多かったので、Effective Javaの項目24にあたってみた。 www.a…

ファイルの1行目だけスキップして出力するコマンド

コマンドラインでCSVファイルを出力し、パイプで渡して処理を行うことが多いのだが、その際ヘッダ行が邪魔になることが多い。例えば以下のようなCSVファイルの場合、データ集計をする際にヘッダ行は必要ない。 $ cat filename.csv 会員番号,職業,スコア 1000…

【Docker】Volumeを使わない場合のデータ書き込みの仕組み

Dockerのcontainer上にS3等の外部サービスからファイルをダウンロードできないか考えたが、そもそもVolumeを使わない場合にContainer上で書き込みを行うとどこに保存されるのかよくわかっていなかったので、ドキュメントに当たり直してみた。 まずimageとcon…

【書評】「実践Vim」を読んだ

普段からエディタとしてVimを使っているが、ショートカットがなかなか身につかない。不便だと思ったときはその都度調べているので断片的な知識はあるが、もっとテクニックを体系的に身に着けて編集作業の効率を上げたいと思い、この本を読んでみた。 www.ama…

「DataDogで始めるモニタリング基盤」を読んだ

業務でDataDogを使っているのだが、今あるログやダッシュボードがパフォーマンス管理のために本当に十分なのか検証する必要性が生じてきた。その前提としてDataDog自体の知識を得たいと思っていたところ、 id:sadayoshi_tada さんのブログでこの本を知った。…

なるセミ「実践クリーンアーキテクチャ」に参加しました

nrs-seminar.connpass.com Youtubeのライブ配信で行われたイベントに自宅から参加。設計理論にとどまらない話を聞ければと期待していたが、予想以上に濃い2時間だった。 背景 nrsさんの開発チームでは、APIの定義やDBの選定すらそもそもできていない段階で先…

AWS上でRedashを動かす

普段業務でお世話になっているRedash。個人ではローカルで動かしたことはあるが、せっかくなのでちゃんとした環境に立ち上げてみたいと思った。 EC2インスタンスを作成 まずRedash用のVPCを作り、その中にEC2インスタンスを立ち上げる。 Redash公式サイトでA…

Google Documentに良い感じのスタイルをつけるtips

開発ドキュメントの執筆はesaやConfluenceを使うことが多いのだが、先日ビジネスサイド向けにどうしてもGoogle Documentを使ってドキュメントを作らなければいけないことになってしまった。Word系のツールは久しく触っていなかったので、Markdown系ツールで…

【Scala】A => B => C 型の関数の意味

Scalaのコードを読んでいると、時々 val f: A => B => C のような関数が出てくることがある。見るたびに少し混乱していたので整理。 この A => B => C は A => (B => C) と等しい。すなわち、型Aの引数を渡すと、 B => C である関数が返ってくるということ。…

【Scala】パターンマッチングでの "unbound placeholder parameter" エラー

「Scala関数型デザイン&プログラミング」を進めている。今は3章でデータ型を定義しているところなのだが、パターンマッチングを書いたときに凡ミスでエラーを起こしたのでメモ。 sealed trait List[+A] case object Nil extends List[Nothing] case class Co…