ようへいの日々精進XP

よかろうもん

2021 年 12 月 29 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

今朝はエアロバイク。

足の痛みは引き続き。とりあえず、1 日走って 2 日くらいはエアロバイクで様子を見たい。

レアジョブ

今日はお休み。

仕事が納まった

夕飯

鶏むね肉をガッツリと頂いた。美味しゅうございました。

2021 年 12 月 28 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

今朝は 10 マイル走ってきた。

今日は、先日と比べると足に痛みを感じながらの走りだった。

レアジョブ

今日はお休み。

夕飯

2021 年 12 月 27 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

今日もエアロバイク。

レアジョブ

今日は 19 時から val 先生だった。

夕飯

2021 年 12 月 26 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

今日はエアロバイク。

レアジョブ

今日もお休み。明日は、19 時から val 先生。

夕飯

みぞれ鍋。奥さんが好きなはんぺんをフライパンで軽く焼いてお鍋に入れたら、「ちくわ」みたいと不評だった。素材はそのまま楽しむのがセオリーということを改めて痛感した。

2021 年 12 月 25 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

山王公園を 10 マイルほど。

レアジョブ

今日はお休み。

夕飯

寒さに便乗してお鍋。というかお豆腐と奥さんが好きなはんぺんしか入っていないお鍋。温まりましたー

2021 年 12 月 24 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

今日もエアロバイクを 70 分。

レアジョブ

今朝も正蔵先生。クリスマスの準備で忙しいとのこと。自家製ハムの仕込みについて色々と教えてもらった。正蔵先生の言っていることがだいたい解るようになったのは大きな進歩かもしれない。

夕飯

我が家の定番豚ハラミのネギのせがジューシーで美味しゅうございました。

2021 年 12 月 23 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている。色が濃くなれば濃くなる程強度が高い (歩行、走行距離が長い) ということで。実装の詳細はこちら

ジョギング

エアロバイクを 70 分。

レアジョブ

今朝も正蔵先生。フィリピンでは、クリスマスに向けて盛り上がっているとのこと。素敵なクリスマスをお過ごし下さいmm

夕飯

会社の TGIF

にリモートで参加した。

JAWS-UG 福岡もくもく会 #55

jaws-ug-kyushu.doorkeeper.jp

会社のアドベントカレンダー用の記事を書いていた。

俺は月末の振り返りを Slack と Ruby でやっている

これは

YAMAP エンジニア Advent Calendar 2021 の第 17 日目の記事にします。

qiita.com

はじめに

皆さん、日々の作業の振り返りってどのようにされていますか?

自分は、以下のように、退勤しますポストのスレッドに「俺の夕会」と称して、Slack を相手に独りでやっています。

f:id:inokara:20211223214838p:plain

こうやって、日々のやったことが Slack 上に記録されることになります。

さて

この Slack 上に記録した「俺のやったこと」を一ヶ月分取得したくなりました。なぜなら、月末に、社内で利用している勤怠管理システムに、工数登録をする必要になったからです。ということで、以下のような Ruby スクリプトで Slack にポストした投稿を取得して、一ヶ月分の「俺のやったこと」をリストアップすることにしました。

require 'json'
require 'net/http'
require 'csv'

SLACK_API_BASE_URL = 'https://slack.com/api'
SLACK_BASE_URL = ENV['SLACK_BASE_URL']
SLACK_USER_TOKEN = ENV['SLACK_USER_TOKEN']
MY_SLACK_CHANNEL_ID = ENV['MY_SLACK_CHANNEL_ID']
OLDEST = ARGV[0].nil? ? 7 : ARGV[0]

# 7 日前のタイムスタンプを取得
now = Date.today
days_ago = now - OLDEST.to_i
oldest = sprintf("%.5f", days_ago.to_time.to_i)

cursor = nil
loop do
  # https://api.slack.com/methods/conversations.history
  uri = URI("#{SLACK_API_BASE_URL}/conversations.history")
  params = {
    channel: MY_SLACK_CHANNEL_ID,
    cursor: cursor,
    limit: 1000,
    oldest: oldest
  }

  uri.query = URI.encode_www_form(params)
  req = Net::HTTP::Get.new(uri)
  req[:Authorization] = "Bearer #{SLACK_USER_TOKEN}"

  res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    http.request(req)
  end
  res_body = JSON.parse(res.body)

  res_body['messages'].each do |message|
    next if message['subtype'] == 'bot_message'

    myts = message['thread_ts'] if message['text'].include?('撤収')
    next if myts.nil?

    ts = message['ts'].to_i
    time = Time.at(ts, in: "+09:00").strftime("%F %T")

    # https://api.slack.com/methods/conversations.replies
    uri = URI("#{SLACK_API_BASE_URL}/conversations.replies")
    params = {
      channel: MY_SLACK_CHANNEL_ID,
      ts: myts
    }

    uri.query = URI.encode_www_form(params)
    req = Net::HTTP::Get.new(uri)
    req[:Authorization] = "Bearer #{SLACK_USER_TOKEN}"

    res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
      http.request(req)
    end
    res_body = JSON.parse(res.body)

    res_body['messages'].each do |msg|
      puts "\n-----------------------------------------------\n" if msg['text'].include?('俺の夕会')
      ts = msg['ts'].to_i if msg['text'].include?('俺の夕会')
      time = Time.at(ts, in: "+09:00").strftime("%F %T")
      puts "#{time}\n#{msg['text']}" if msg['text'].include?('俺の夕会')
    end
  end

  break unless res_body['has_more']
  cursor = res_body['response_metadata']['next_cursor']
end

このスクリプトを yattakoto.rb なんてファイル名で保存しておいて、以下のように実行します。

$ export SLACK_BASE_URL=https://xxxxxxxxxxxx
$ export SLACK_USER_TOKEN=your-token
$ export MY_SLACK_CHANNEL_ID=your-channel
$ ruby yattakoto.rb

以下のように出力されます。

-----------------------------------------------
2021-12-22 22:08:28
# 俺の夕会 2021-12-22

## 今日やったこと

• 楽しいミーティング
• あれ
• これや

-----------------------------------------------
2021-12-21 23:33:59
# 俺の夕会 2021-12-21

## 今日やったこと

• つらいミーティング
• あれ
• これや

-----------------------------------------------
2021-12-17 18:40:46
# 俺の夕会 2021-12-17

## 今日やったこと

• ねむいミーティング
• まけないこと
• なげださないこと

-----------------------------------------------
2021-12-16 19:09:13
# 俺の夕会 2021-12-16

## 今日やったこと

• ねむいミーティング
• にげださないこと
• しんじぬくこと

yattakoto.rb はデフォルトで、過去 7 日分の「俺のやったこと」を取得しますが、今回は休みが重なったので 4 日分の「俺のやったこと」が取得出来ました。

以上

Slack APIRuby を使うことで、定期的な振り返りが捗りました!

ECS デプロイが失敗した際の挙動を確認 〜 Nヶ月後の自分の為に 〜

これは

YAMAP エンジニア Advent Calendar 2021 の第 16 日目の記事にします。

qiita.com

はじめに

YAMAP では、全てのプロジェクトにおいて ECS 上にアプリケーションを展開していて、デプロイには ecspresso を利用しています。これまでに、特にデプロイが失敗したことで、サービスの障害につながるようなケースは発生していませんが、ECS のデプロイが失敗した際の挙動について確認したいと思ったので、実際にデプロイ失敗時の挙動を確認してみました。

尚、この検証を行ったのは、2021 年の 8 月中旬となりますので、場合によっては、異なる挙動となるかもしれませんのご注意下さい。

コンテナの pull に失敗した場合 (例えば、コンテナイメージが存在しない場合)

  • ecspresso に設定したタイムアウトまでは待機する
  • ECS の deployment にデプロイが滞留してしまう
  • コンテナイメージの所在を正しく設定して、デプロイを再実行することで、滞留していたデプロイも削除される

コンテナの起動に失敗した場合 (アプリケーションの異常終了)

  • ecspresso に設定したタイムアウトまでは待機する
  • deployment にデプロイが滞留してしまう
  • アプリケーションを修正し (コンテナイメージを登録し直して)、正しいデプロイを再実行することで、滞留していたデプロイも削除される

ecspresso rollback

  • 一つ前の正常に動いていたタスク定義に自動的に戻してくれる、rollback という便利なコマンドが用意されている
  • コンテナイメージタグが固定だと、タスク定義をロールバックしても、コンテナイメージは更新されてしまっていると、rollback の意味を成さない
    • デプロイ毎にコンテナイメージタグはユニークにする必要がある

circuit breaker 機能

$ aws ecs describe-services --services test-service --cluster test-cluster --query services[].deployments
[
    [
        {
            "id": "ecs-svc/12345678901234567890",
            "status": "PRIMARY",
            "taskDefinition": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:task-definition/test-task:12",
            "desiredCount": 1,
            "pendingCount": 1,
            "runningCount": 0,
            "failedTasks": 5,
            "createdAt": "2021-08-02T16:09:29.510000+09:00",
            "updatedAt": "2021-08-02T16:09:29.510000+09:00",
            "launchType": "EC2",
            "rolloutState": "IN_PROGRESS",
            "rolloutStateReason": "ECS deployment ecs-svc/12345678901234567890 in progress."
        },
        {
            "id": "ecs-svc/99999999999999999999",
            "status": "ACTIVE",
            "taskDefinition": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:task-definition/test-task:11",
            "desiredCount": 1,
            "pendingCount": 0,
            "runningCount": 1,
            "failedTasks": 0,
            "createdAt": "2021-08-02T16:06:15.444000+09:00",
            "updatedAt": "2021-08-02T16:10:04.498000+09:00",
            "launchType": "EC2",
            "rolloutState": "COMPLETED",
            "rolloutStateReason": "ECS deployment ecs-svc/99999999999999999999 completed."
        }
    ]
]

メモ

ecspresso の使い方

ecspresso init

ECS サービスの定義、最新のタスク定義を取得出来る。

ecspresso init --region ap-northeast-1 \
  --cluster test-cluster \
  --service test-service \
  --config test-service.yaml

ecspresso deploy

ECS サービスを更新する。

ecspresso deploy --config test-service.yaml

以上

Nヶ月後の自分の為に書きました。

Github API で仕事が捗ったのでメモ 〜 Nヶ月後の自分の為に 〜

これは

YAMAP エンジニア Advent Calendar 2021 の第 13 日目の記事にします。

qiita.com

そして、記事の内容は、以下の記事の焼き直しです。

inokara.hateblo.jp

経緯 (1)

Github Organization 内のリポジトリで .circleci/config.yml が存在しているリポジトリを抽出する必要がありました。

やったこと (1)

事前に Personal Access Token (xxx_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) を取得しておいて、例えば、oreno-tools Organization を検索してみると...

$ curl -s \
  -H "Authorization: token xxx_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -H "Accept: application/vnd.github.v3+json" \
  'https://api.github.com/search/code?l=YAML&p=2&q=org%3Aoreno-tools+in%3Apath+%22.circleci%2F%22&type=Code&per_page=100' \
| jq -r .items[].repository.full_name

以下のように出力されました。

oreno-tools/bibuild
oreno-tools/wafoo
oreno-tools/amiCtrl

いい感じです。

以下のドキュメントを参考にしました。

docs.github.com

経緯 (2)

同じく、Github Organization 内のリポジトリで Terraform コード (HCL) が存在しているリポジトリを抽出する必要がありました。

やったこと (2)

事前に Personal Access Token (xxx_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX) を取得しておきます。例えば、oreno-tools Organization を検索してみると...

TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
curl -s \
  -H "Authorization: token $TOKEN" \
  -H "Accept: application/vnd.github.v3+json" \
  'https://api.github.com/search/repositories?q=org%3Aoreno-tools+language:hcl&sort=&order='
| jq -r .items[].html_url

残念、oreno-tools Organization 内には、HCL が含まれたリポジトリはありませんでした。

検索結果が存在していない場合には、以下のように出力されます。

{
  "total_count": 0,
  "incomplete_results": false,
  "items": [

  ]
}

HCL ではなく、Ruby コードが含まれるリポジトリを検索してみましょう。

TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
curl -s \
  -H "Authorization: token $TOKEN" \
  -H "Accept: application/vnd.github.v3+json" \
  'https://api.github.com/search/repositories?q=org%3Aoreno-tools+language:ruby&sort=&order='
| jq -r .items[].html_url

以下のように出力されました。

https://github.com/oreno-tools/furikake
https://github.com/oreno-tools/daimyo
https://github.com/oreno-tools/wafoo
https://github.com/oreno-tools/seiton
https://github.com/oreno-tools/releases.oreno.tools

いい感じです。

以下のドキュメントを参考にしました。

docs.github.com

以上

N ヶ月後の自分の為に書きました。