もりはやメモφ(・ω・ )

インフラなエンジニアからSREへ

メル社さんのSREイベントに参加してきました

2019-09-11に開催された "mercari merpay SRE ✕ microservices platform meetup" の感想を簡単に。

mercari.connpass.com

3行で書くと以下の感想で、学びと刺激と持ち帰りが多い内容に始終圧倒されまして、参加できたことにとても感謝しています。

  • 技術力と視座の高さに圧倒される
  • 人材の豊富さに圧倒される
  • 会場クオリティの高さに圧倒される
続きを読む

Embulkでinputするzipファイルをデコードする2つの方法

Embulkではpluginにより様々な形式のファイルをimputとして扱うことができます。今回はzipファイルを解凍(decorde)する二つの方法を紹介します。

  • 利用の仕方
    • embulk-decoder-commons-compres
    • embulk-decoder-command
  • プラグインを切り替えた訳
続きを読む

PostgreSQLで2バイト文字が含まれるカラムかを調査する方法

これは

PostgreSQLで文字列型のカラムに 2バイト文字 が含まれるかを調査する方法です。まさかこんな調査が必要になるとは思っていなかったのですが、必要になったのでやりました。

  • これは
    • TL;DR
      • charの場合
      • varcharの場合
    • 検証
      • テストテーブルの作成&テストデータのInsert
      • char
    • varchar
    • 余談
    • 参考

TL;DR

以下をやるだけです。

charの場合

以下のようなクエリで 0なら2バイト無し です。

select count(*) from 対象テーブル
where octet_length(対象カラム) > 対象カラムの桁数;

varcharの場合

以下のようなクエリで 0なら2バイト無し です。

select count(*) from 対象テーブル
where octet_length(対象カラム) <> char_length(対象カラム);
続きを読む

AWXのバージョンアップをしました (2.1.0 -> 4.0.0)

f:id:morihaya:20190610004613p:plain
AWX4.0.0

  • TL;DR
    • 最初にバージョンアップについて調べました
    • サーバ
  • 手順
    • pipでtower-cliを導入(初回のみでいいはず)
    • tower-cliをセットアップ
    • AWXの情報をバックアップ(結局使わなかった)
    • PostgreSQLのバックアップ(結局使わなかった)
    • アップグレード
  • ハマったこと
    • 何も考えずにgit cloneしただけのブランチで作業を進めたらエラーで起動してこなかった
    • dockerのインターナルIPが変わったらしくてPostgreSQLのpg_hbaに引っかかっていたので多めに許可。

最新のAWXが4.0.0に対し、使っていたAWXが2.1.0と古いため、バージョンアップを行いましたのでメモ。 環境はシングルノードでdockerを利用してAWXを動かしていますが、PostgreSQLだけはコンテナじゃなくてノード上の物を利用しています。

TL;DR

要はこれをやっただけ。バックアップもとりましたが、結局利用していないです。 結果として2.1.0を利用している場合、DBさえあればスムーズにアップグレードができると言っていいのかもしれません(個人の環境ですが)

  • AWXとPostgreSQLのバックアップ*1
tower-cli receive --all > assets.json
pg_dump -d awx | gzip >  pg_dump-awx$(date +%Y%m%d-%H%M%S).sql
  • 最新版をgit pull*2
cd <任意の場所>/awx
git pull
git checkout -b 4.0.0 refs/tags/4.0.0
vim  installer/inventory
-> portやpostgresなどの固有設定を反映
  • 既存のAXWコンテナを停止

これはAWXに限定しない危険コマンドなので、手で一つずつ選択して止めることを個人的には推奨します。*3 私の環境はAWX専用だったので手順通りに行いました。

docker rm -f $(docker ps -aq)
  • 通常の手順に従いInstall
# Set the working directory to installer
cd installer

# Run the Ansible playbook
ansible-playbook -i inventory install.yml

*1:結局使わなかった

*2:cloneじゃないのは既存がすでにあるので

*3:でも手順にこうある

続きを読む

datadogのMulti-Organizationを開始するまで

これは

datadogを使っている状況で、新システムについては請求額や利用者を分割したい要望が出たため、Multiple-Organizationと言う機能を利用したい、と言う話です。

結論としては

Multiple-Organizationは便利でした。

  • 左下の自分のアイコンから表示されるメニューから、サクサクとOrganizationを変更することが出来ます
  • それ以外は基本的に新規アカウントをもう一つ作成したのとほぼ変わりませんので、クレジットカードやメンバーや監視対象は全て新規で登録する必要があります
続きを読む

Embulkのfilter pluginが定義ミスで読まれなかったメモ

これは

ものすごいしょーもないミスでembulkのfilterプラグインが読まれなかった事象に遭遇したのでメモ

何がどうだった

filters: とすべきところを filter: とsなしで記載した結果

  • embulkの処理自体は実行される(書式エラーとして判定されない)
  • filterプラグインは読まれない

という事象になった。

続きを読む

AWS Code兄弟の自分なりの理解メモ殴り書き

これは

AWSのCode兄弟を最近触り始めていて、雰囲気がわかったので一度言語化しておこう&ブログ止まっててまずいので小ネタで、という記事

想定読者

完全に自分

  • EC2へのデプロイ(Lambda/ECSは出てこない)
  • GitLabCIとかJenkinsでパイプラインは作ってきた
  • 完全にCode兄弟初めて

一言で言うと

  • CodeCommit -> 超シンプルなGitLab/GitHub。pushとpullとpullreqができる
  • CodeBuild -> コンテナ使ってビルドやテストできる。成果物はS3に置ける
  • CodeDeploy -> CodeBuildが作った成果物をEC2にデプロイできる。AgentをEC2に入れておく必要がある(AmazonLinux2はデフォで入ってる)。オンプレのインスタンスにもデプロイできる
  • CodePipline -> 上述した3兄弟(Commit/Build/Deploy)を順番に実行するジョブ管理的な役割

GitLabCI触ってるとgitlab-ci.ymlでbuild/deploy/pipline全部書いちゃうケースが多かったので、最初なんでこんなに分割されてるんだと思ったけれど、慣れてくると役割がしっかりしてて良くできてるなあと関心。

なお最低限の理解が上の箇条書きだと感じており、付加的な機能もまだまだあるので全くもって完全に理解してない。

理解の勘所

  • Pipelineは最後に作れば良いので、Commit/Build/Deployをそれぞれ単体で動かせるとこまで最初にやる
  • CodeBuildはbuildspec.ymlを書いてCodeCommitに置く
  • CodeBuildで使うカスタムイメージはECRに置く(Dockerfile自分で書く)
  • CodeDeployはappspec.ymlとhook用のシェルを書いてCodeCommitに置く
  • hook用のシェルもbuildの成果物に入れる必要がある

ハマりどころ

  • appspec.ymlでのCodeDeployを使ったデプロイは、直接ファイルを上書きできないのでhook用のシェルで対応する。4年越しのissueがあり、hookシェルの中での対応方法がレスされてる
  • CodeBuild単体とCodePipelineからの実行で、secondaryなsourceの展開場所が異なるのでbuildspec.ymlで吸収した
    • build単体実行だとカレントに
    • pipeline実行だと全く別のパスに(これ本当にトラップ)

具体的にはこんな感じで吸収した。理由としてはsettings.gradleの中で includeFlat してビルドするケースだった。

version: 0.2

phases:
  pre_build:
    commands:
      - gradle --version
      - pwd
      - bash -c "[ ! -d ../<reponame> ] && mv ${CODEBUILD_SRC_DIR_<reponame>} ../"
      - ls -l ../
      - ls -l
  build:
    commands:
      - echo Build started on `date`
      - echo Building by gradle ...
      - gradle war
  post_build:
    commands:
      - echo Build completed on `date`
      - ls -l build/gradle/libs/hogehoge.war

artifacts:
  files:
    - build/gradle/libs/hogehoge.war
    - appspec.yml
    - codedeployhooks/*
  discard-paths: yes
  • CodeDeployのhookシェルのライフサイクルを理解する必要があるけど、とりあえずApplicationStopは初回時実行されないのでAfterInstall使っておく方が安全かもしれない