ようへいの日々精進XP

よかろうもん

2018 年を振りかへりと 2019 年の目標的な何か

tl;dr

2018 年をざっくりと振り返りたいと思う. そして, 2019 年の目標も書いてみたい.

2018 年を振りかへる

2017 年からの繰越

inokara.hateblo.jp

2018 年冒頭に, 2017 年の目標を踏襲すると書いていたので, 基本的に 2018 年の目標は上記の通り.

資格取得

AWS 各資格のプロフェッショナルレベルについては, 来年, ボチボチ頑張ろうと思う.

ラソンサブスリー

inokara.hateblo.jp

inokara.hateblo.jp

  • 鹿児島マラソン 2018 にて, 2 時間 57 分 25 秒
  • 福岡マラソン 2018 にて, 2 時間 58 分 01 秒

目標は達成出来たけど, 後半の足の攣りとか課題だし, 現在は故障でまったく走れていない.

www.betsudai.com

2 月 3 日に別府大分毎日マラソンに走るんだけど... 大丈夫かな.

英語, 読書

  • すいません, まったく...
  • 読書については, 技術書については読みたい部分だけをちょこちょこ読む感じになっている

アウトプット

俺のツールズ

主に業務の効率改善を目的として, 雑なコマンドラインツールを思いの外たくさん作ってリリースした.

俺のツールズ

主に RubyGolang で作ったが, なかなかこれらの言語について上達することは無かった...のは反省ポイント. しかし, 何かしらの課題に対して, コードで解決するという選択肢があるというちょっとした自信が付いた気がする. あと, 先人達のコードを読むことが本当にすごく勉強になることを実感出来た.

来年も, サンデープログラマーとして, 業務改善を目的としてたくさんのツールをリリースしていきたいと思う.

ブログや登壇

技術的な内容の記事をなかなか書くことが出来なかった. 書くネタはあるんだが, 下調べをするうちに情報の鮮度とモチベーションが落ちるということを繰り返していたような気がする. あと, これは永遠の課題なんだけど, どうやったら記事の質を上げられるのか, 未だに試行錯誤している. 2019 年もきっと試行錯誤するんじゃないかなと思っているが, できるだけ, こまめに記事を書いていくことで質自体も上げられるのではと考えているので, 2018 年の記事数を超えられるように頑張りたい.

登壇, んー, 登壇は得意ではないし, そんな人様の前に立ってなにかを話すほどネタがあるわけではないけど, 登壇することによって得られることがあるというのも事実. 機会があれば, 各種勉強会に参加して LT を積み重ねて, そこから得られるなにかを糧にできればと考えている.

JAWS-UG 福岡 もくもく会

アメンバーをやらせて頂いている, JAWS-UG 福岡. なんの飲み会がきっかけだったか忘れたけど, もくもく会を毎週やろうみたいな話になって夏くらいから出来るだけ毎週開催した. 他のコアメンバーの方の協力や場所を提供して下さる企業様には感謝しかない. 本当にありがとうございました. 来年も引き続き続けていければなーと考えている.

2019 年の目標

定量的なもの

まずは, 定量的な目標のみを掲げておく. その都度, その都度, 適当な間隔で振り返りを行い目標を補正していこうかなと考えている.

仕事

この歳で転職することになった. 1 月 4 日から新しい職場である. まずは, 新しい職場に慣れること, 4 年半リモートワークだったが, 次の職場はオフィスに通勤することになるので, 通勤の感覚やオフィスで他のメンバーとともに仕事をする感覚を取り戻す必要があると考えている. 業務の内容としては, サービスのインフラ構築, 運用がメインとなるが, それと合わせてバックエンドサービスにも関わらせてもらいつつ, 単に技術にフォーカスするだけではなく, もっと広い視点でサービスの質や信頼性をより高めるような仕事が出来るようになりたいと考えている.

変ジニアリング魂

エンジニアとして定年はとっくに超えてしまっている年齢なのかもしれないけど, せっかくこの業界で仕事しているので, 技術者の端くれとして勉強は欠かさないようにしたい. 特に 2018 年に全くキャッチアップ出来ていなかった Kubernetes を始めとするコンテナオーケストレーション実装やコンテナランタイム等のコンテナ技術について, 1 から勉強して業務に活かせるようになりたい. また, コードを書くことを止めないようにしたい. RubyGolang については業務レベルで使えるように研鑽を重ねたい. また, よりコンピュータと仲良くなりたいので C 言語を勉強したいと考えている.

走る

出来るだけ故障はしないように, フルマラソンサブスリーをキープ出来ればと考えている. 今年こそ, 夏場に阿蘇合宿をしたいと思っている.

奥さん

いつも支えてくれている奥さんに感謝.

明けましておめでとうございます。今年も夫婦共々宜しくお願い致します。

2019 年で結婚 8 年目に突入するけど, この写真のようにいつも明るく馬鹿が言い合えるような夫婦で過ごせたらいいなと思っている.

以上

風邪気味で体調イマイチな年明けとなりましたが, 今年もよろしくお願いいたします.

2018 年 12 月 31 日 (月)

ジョギング

  • 引き続き, お休み
  • 早く走りたい

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

年末のお買い物

奥さんと一緒に柳橋商店街へ. 人, 人, 人, 本当にすごい人手で年末感がマックスに. まぐろやブリが飛ぶように売れていた. ただ, 年末プライスなのか高価で我が家は手が出なかった.

お仕事

  • 今年最後, そして, アイレットの社員としては最後のお仕事

CircleCI で Docker イメージをビルドして Amazon ECR に push するまでのハンズオン

tl;dr

Docker のコンテナイメージを AWS の CodePipeline や CodeBuild を介して, コンテナレジストリ (ECR) に push する流れを実装したくて, 色々と調査していましたが, とりあえず, CircleCI で実施してみたらどうなるだろうと思ってドキュメントなどを参考にハンズオンしてみました.

やんなきゃいけないこと

コンテナレジストリにコンテナイメージを push するにあたって, 以下のような流れを実装したいなと考えています.

  1. Docker イメージをリポジトリに push
  2. CircleCI にてコンテナイメージをビルド
  3. ビルドしたイメージに対してテスト
  4. テストが正常に完了したら ECR に push

今回, 三番目のステップであるビルドイメージのテストは goss と goss を Docker コンテナイメージに対してテストをする為のラッパーである dgoss を利用してテストするように実装しようと思います.

github.com

github.com

やったこと

リポジトリ

以下にやったことをまとめてあります.

github.com

超シンプルな Apache が起動するだけの Docker イメージを作成するものです. ファイルの一覧は以下の通りです.

$ tree .
.
├── Dockerfile
├── README.md
├── goss.yaml
└── terraform
    ├── Makefile
    ├── main.tf
    └── provider.tf

1 directory, 6 files

Dockerfile

前述の通り, Amazon Linux コンテナを利用して, Apache をインストールしているだけのコンテナが作成されます.

FROM amazonlinux
RUN yum install -y httpd && echo 'circleci-docker-test-and-build' > /var/www/html/index.html

goss.yaml

goss の詳しい説明については, Githubリポジトリをご一読いただければと思います. テストケースが YAML で書くことができるインフラ構成のテストツールとなります. 類似したツールでは Serverspec が挙げられます. 以下は YAML で書かれたテストケースです.

$ cat goss.yaml
package:
  httpd:
    installed: true
process:
  httpd:
    running: true
port:
  tcp:80:
    listening: true
file:
  /var/www/html/index.html:
    exists: true
    filetype: file
    contains:
    - "circleci-docker-test-and-build"

Rspec DSL でテストケースを記載する Serverspec とは異なり, Ansible などで馴染み深い YAML でテストケースを記述できるという点が異なりますが, Serverspec との決定的な違いは goss はリモートホストのテストには対応していないという点です. これをネガティブポイントと捉えるかどうかはユースケース次第なので, 必要に応じて使い分けることができればと考えています.

上記のテストケースは実にシンプルで, 以下のような点をテストします.

  • httpd パッケージがインストールされていること
  • httpd プロセスが起動していること
  • 80 番ポートが Listen していること
  • /var/www/html/index.html が存在していること, circleci-docker-test-and-build という文字列が含まれていること

goss は CircleCI では, 以下のように実行します. ${FULL_IMAGE_NAME} には, 前段階で docker build した際のコンテナイメージ名が入ります.

dgoss run ${FULL_IMAGE_NAME} /usr/sbin/httpd -DFOREGROUND

例えば, コンテナイメージを test:httpd でビルドした場合, 以下のように実行してテストを走らせることが出来ます.

$ dgoss run test:httpd /usr/sbin/httpd -DFOREGROUND
INFO: Starting docker container
INFO: Container ID: 101827da
INFO: Sleeping for 0.2
INFO: Container health
PID                 USER                TIME                COMMAND
2888                root                0:00                /usr/sbin/httpd -DFOREGROUND
2939                48                  0:00                /usr/sbin/httpd -DFOREGROUND
2940                48                  0:00                /usr/sbin/httpd -DFOREGROUND
2942                48                  0:00                /usr/sbin/httpd -DFOREGROUND
2944                48                  0:00                /usr/sbin/httpd -DFOREGROUND
2972                48                  0:00                /usr/sbin/httpd -DFOREGROUND
INFO: Running Tests
Process: httpd: running: matches expectation: [true]
File: /var/www/html/index.html: exists: matches expectation: [true]
File: /var/www/html/index.html: filetype: matches expectation: ["file"]
File: /var/www/html/index.html: contains: matches expectation: [circleci-docker-test-and-build]
Port: tcp:80: listening: matches expectation: [true]
Package: httpd: installed: matches expectation: [true]


Total Duration: 0.039s
Count: 6, Failed: 0, Skipped: 0
INFO: Deleting container

.circleci/config.yml

Docker ビルドして, テストして, ECR にログインして, コンテナイメージを push するまでの操作をまとめると以下のような感じになりました.

version: 2
jobs:
  build:
    machine: true
    steps:
      - checkout
      - run:
          name: Setup common environment variables
          command: |
            echo 'export ECR_REPOSITORY_NAME="${AWS_RESOURCE_NAME_PREFIX}"' >> $BASH_ENV
            echo 'export FULL_IMAGE_NAME="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_DEFAULT_REGION}.amazonaws.com/${ECR_REPOSITORY_NAME}:${CIRCLE_SHA1}"' >> $BASH_ENV
      - run:
          name: Setup AWS CLI
          command: |
            curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
            unzip awscli-bundle.zip
            sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
      - run:
          name: Setup goss & dgoss
          command: |
            curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.6/goss-linux-amd64 -o ${HOME}/bin/goss
            chmod +x ${HOME}/bin/goss
            export GOSS_PATH=${HOME}/bin/goss
            curl -L https://raw.githubusercontent.com/aelsabbahy/goss/master/extras/dgoss/dgoss -o ${HOME}/bin/dgoss
            chmod +x ${HOME}/bin/dgoss
      - run:
          name: Build Image
          command: |
            docker build -t ${FULL_IMAGE_NAME} .
      - run:
          name: Run Tests
          command: |
            dgoss run ${FULL_IMAGE_NAME} /usr/sbin/httpd -DFOREGROUND
      - run:
          name: Login to AWS ECR
          command: eval $(aws ecr get-login --region $AWS_DEFAULT_REGION --no-include-email)
      - run:
          name: Push Docker Image
          command: |
            docker push ${FULL_IMAGE_NAME}

事前に以下のような環境変数を CircleCI のプロジェクトに登録しておく必要があります.

実際に

リポジトリに対して push すると CircleCI によるビルドとテスト, ECR への push が行われます.

f:id:inokara:20181230164739p:plain

いい感じです.

ECR にも意図した通りにコンテナイメージが push されていることが判ります.

$ aws ecr describe-images --repository-name=httpd
{
    "imageDetails": [
        {
            "registryId": "123456789012",
            "repositoryName": "httpd",
            "imageDigest": "sha256:ae7cefb61f88f132eadc4eb98fa545a0054dd3a2888be26c9da48f29ab21c0b0",
            "imageTags": [
                "40f82524001fe52644c2cee1ab9b7895572aa94f"
            ],
            "imageSizeInBytes": 142276848,
            "imagePushedAt": 1546063334.0
        },
        {
            "registryId": "123456789012",
            "repositoryName": "httpd",
            "imageDigest": "sha256:9afcd192b4e9c51fc43706d00c755747e890811c367422cb53e69f2071df42d2",
            "imageTags": [
                "7c92bdaac1c92f0f317f4e5692f5c6833642be48"
            ],
            "imageSizeInBytes": 142276745,
            "imagePushedAt": 1545953477.0
        },
        {
            "registryId": "123456789012",
            "repositoryName": "httpd",
            "imageDigest": "sha256:7ba84149310e448739a2f91e06641a63e8ed37bf9cf3b9991cc8860ba54d25f2",
            "imageTags": [
                "79697d588b9efb809cc07621f403a63744079e66"
            ],
            "imageSizeInBytes": 142276832,
            "imagePushedAt": 1546065921.0
        }
    ]
}

以上

今回は, コンテナイメージをテストしてイメージを push するところまでをハンズオンしましたが, 次回は, もう少し複雑なアプリケーションを使って, ECS や Fargate にデプロイするところまでやってみたいと思います.

参考

circleci.com

今夜だけ git clone と git checkout するだけのコマンドラインツールを作ったので, 何卒, ご容赦下さい

tl;dr

www.youtube.com

スターダストレビューが歌う「今夜だけきっと」良い歌ですよね. 「今夜だけきっと」を聞きながら作ってみました. 「今夜だけ git (ぎっと)」

konyadake-git

これ

github.com

konyadake-git で出来ること

使い方

インストール

インストールはリリースページがダウンロードして頂いて, パスの通ったディレクトリにバイナリを放置して下さい. 強いて言えば, 念の為, 実行権限を付与して下さい.

chmod +x ~/bin/konyadake

例えば

https://github.com/inokappa/circleci-docker-test-and-build を clone する場合.

ssh 経由で clone する場合.

$ konyadake -repo=git@github.com:inokappa/circleci-docker-test-and-build.git
✅  対象リポジトリ git@github.com:inokappa/circleci-docker-test-and-build.git を circleci-docker-test-and-build に clone します.
Enumerating objects: 70, done.
Counting objects: 100% (70/70), done.
Compressing objects: 100% (34/34), done.
Total 70 (delta 24), reused 64 (delta 18), pack-reused 0
✅  対象リポジトリの clone に成功しました.

https 経由で clone する場合.

$ konyadake -repo=https://github.com/inokappa/circleci-docker-test-and-build.git -dir=myrepo
✅  対象リポジトリ https://github.com/inokappa/circleci-docker-test-and-build.git を myrepo に clone します.
Enumerating objects: 70, done.
Counting objects: 100% (70/70), done.
Compressing objects: 100% (34/34), done.
Total 70 (delta 24), reused 64 (delta 18), pack-reused 0
✅  対象リポジトリの clone に成功しました.

-dir オプションで clone 先のディレクトリを設定出来ます.

さらに

https://user.git.backlog.jp/YOUR-PJ/example.git を clone する場合.

みんな大好き Backlog の Git リポジトリにも対応しています.

$ konyadake -repo=user@user.git.backlog.jp:/YOUR-PJ/example.git
✅  対象リポジトリ user@user.git.backlog.jp:/YOUR-PJ/example.git を example に clone します.
Counting objects: 11, done.
Compressing objects: 100% (10/10), done.
Total 11 (delta 1), reused 0 (delta 0)
✅  対象リポジトリの clone に成功しました.

いい感じです.

おまけに

https://github.com/inokappa/circleci-docker-test-and-build を clone して, develop ブランチを checkout する場合.

$ konyadake -repo=git@github.com:inokappa/circleci-docker-test-and-build.git -branch=develop
✅  対象リポジトリ git@github.com:inokappa/circleci-docker-test-and-build.git を circleci-docker-test-and-build に clone します.
Enumerating objects: 70, done.
Counting objects: 100% (70/70), done.
Compressing objects: 100% (34/34), done.
Total 70 (delta 24), reused 64 (delta 18), pack-reused 0
✅  対象リポジトリの clone に成功しました.
✅  対象ブランチの checkout に成功しました.
$ cd circleci-docker-test-and-build/
(develop)$ git branch
* develop
  master

いい感じです.

以上

俺のクソコードシリーズ, 第 N 弾である, konyadake-git をご紹介しました. 普通に git コマンドでええやんって感じになりますので, 本当に, 本当に, よろしければ, お手元にダウンロード頂きましてお試し頂ければ幸いです. 尚, 今回, 以下のような点が学びになりました.

2018 年 12 月 29 日 (土)

ジョギング

  • 患部周辺の温め二日目
  • 痛みが少し治まった感じがする

日課

  • お休み

自転車購入

ヨドバシカメラで二台目の自転車を購入. 薄いブルーの三段切り替えで, 奥さん曰くとっても軽いとのこと. 一応, 奥さんの専用機になるが, 二台体制になり行動範囲が広がりそうな感じ.

油屋

天神の油屋という五島サバが美味しいお店で奥さんと忘年会.

tabelog.com

少し予算オーバーだったけど, 料理もお酒も美味しくてサイコーだった.

2018 年 12 月 28 日 (金)

ジョギング

  • お休み
  • 今まで, 痛いところを冷やすことしかしていなかったけど, 温めるようにしてみたら痛いところのつっぱりが無くなった気がする

日課

  • お休み

たぐと忘年会

突然, 奥さんの高校時代の同級生だった「たぐ」が福岡に来ているとのことで, 「たぐ」の元同僚達も交えて博多で一杯. 自分とは全く接点の無い人たちと呑むのちょっと緊張したけど, ワイワイと楽しい話を肴に呑むことが出来た.

2018 年 12 月 27 日 (木)

ジョギング

  • お休み
  • 足の痛みは相変わらず..., 慌てずに治すことした

日課

  • お休み

オルターブースさんの納会に

お誘い頂いたので, オルターブースさんの納会に参加した. オルターブースさんには JAWS-UG 福岡のもくもく会で場所を提供頂いて, 今年は本当にお世話になった.

納会の中で Rancher の新藤さんとお会いして色々とお話をさせて頂いて, Rancher に非常に興味を持った.

www.rancher.co.jp

2018 年 12 月 26 日 (水)

ジョギング

  • お休み

日課

  • お休み

鍼治療

  • 左足首付近の痛みが収まらないので, 近所の整骨院
  • 体の歪みを矯正され, 針も打ってもらった
  • 針を打ってもらった後は, 体も軽くなった感じがして, 足の具合も良かった

2018 年 12 月 25 日 (火)

ジョギング

  • お休み

日課

  • お休み

長田さんと忘年会

  • 1 軒目は尾ノ上 で美味しいお鮨とお酒でワイワイ
  • 2 軒目は調子こいてカラオケで楽しんだ

楽しい夜だったけど, ちょっと飲みすぎてしまったかも.