とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

プログラムからstackdriver monitoring dashbordを作ってみて諦めたはなし

Spinnakerのspinnaker-monitoringでStackdriverが使えるって書いてあったので試したところ、 どうもうまく動かせない。

github.com

データをStackdriverに送れているようなのだが、メトリクスが多すぎるせいでHTTP status code 429 (APIリクエスト多過ぎ)をもらう。 Filterを書いてみてもうまく動いてる気がしない・・・

また、spinnaker-monitoringからDashboardを作ろうでみようとしてもコードが古くてうまく動かないようなので、 自分でStackdriver Dashboardを作るプログラムを書いてみた。

sample.py

import json

from google.cloud.monitoring_dashboard import v1

client = v1.DashboardsServiceClient()

parent = 'projects/yoru-project-id'

with open('./dashboards/clouddriver-metrics-dashboard.json') as f:
    dashboard = json.load(f)
    response = client.create_dashboard(parent, dashboard)

    print(response)

requirements.txt

cachetools==4.1.1
certifi==2020.6.20
chardet==3.0.4
google-api-core==1.21.0
google-auth==1.18.0
google-cloud-monitoring-dashboards==1.0.0
googleapis-common-protos==1.52.0
grpcio==1.30.0
idna==2.10
protobuf==3.12.2
pyasn1==0.4.8
pyasn1-modules==0.2.8
pytz==2020.1
requests==2.24.0
rsa==4.6
six==1.15.0
urllib3==1.25.9

./dashboards/clouddriver-metrics-dashboard.json

{
  "display_name": "Clouddriver Microservice",
  "row_layout": {
    "rows": [
      {
        "widgets": [
          {
            "title": "Clouddriver Invocations (success)",
            "xy_chart": {
              "data_sets": [
                {
                  "time_series_query": {
                    "time_series_filter": {
                      "filter": "metric.type=\"custom.googleapis.com/spinnaker/clouddriver/controller.invocations__count\" metric.label.status=\"2xx\"",
                      "aggregation": {
                        "per_series_aligner": "ALIGN_DELTA"
                      }
                    }
                  }
                }
              ]
            }
          },
          {
            "title": "Clouddriver Invocations (failure)",
            "xy_chart": {
              "data_sets": [
                {
                  "time_series_query": {
                    "time_series_filter": {
                      "filter": "metric.type=\"custom.googleapis.com/spinnaker/clouddriver/controller.invocations__count\" metric.label.status!=\"2xx\"",
                      "aggregation": {
                        "per_series_aligner": "ALIGN_DELTA"
                      }
                    }
                  }
                }
              ]
            }
          }
        ]
      },
      {
        "widgets": [
          {
            "title": "JVM Memory (clouddriver)",
            "xy_chart": {
              "data_sets": [
                {
                  "time_series_query": {
                    "time_series_filter": {
                      "filter": "metric.type=\"custom.googleapis.com/spinnaker/clouddriver/jvm.memory.used__value\" metric.label.area=\"heap\"",
                      "aggregation": {
                        "per_series_aligner": "ALIGN_MEAN"
                      }
                    }
                  }
                }
              ]
            }
          }
        ]
      }
    ]
  }
}

spinnaker-monitoringに置いてある既存のJSONではうまく表示されなかったので色々書き直したりしていたが埒が明かない。

Spinnaker のSlackで聞いてみたところ、Stackdriverを使ってる人がぜんぜんいなさそうな雰囲気で、 Armoryが作っているobservabilityのPluginをおすすめされたので、こっちを試してみようと思う。

github.com

July Tech Festa 2020で話した「組織/企業/グループを超えたエンジニアのつながりを広げるイベントをしている話」の補足

先週の7/25(Sat)にJuly Tech Festa 2020(以下、JTF)に登壇させてもらいました。

発表資料はこちら

speakerdeck.com

朝10:00からのセッションにお越しいただいた皆さん本当にありがとうございました。

なんか別所で運営が「強い発表者が集まった死の組と言われる時間帯」と言っていたと聞かされたけど、 イベント運営する側からすると、やはり朝から人を集めたいのでトップバッターに強い人達を置く気持ちはすごくわかるw

終わったあとに知り合いから「SpeakerDeckだと資料のリンクが踏めないので補足のブログでも書いたら?」と言われて、 QAも1つしか回答できなかったのでそれも含めて補足を書こうと思ったので今こうして書いております。

QA(slido)

当日は質問を一つだけしか拾えなかったので、JTFのスタッフにお願いしてslidoに書かれていた質問をもらいましたので以下回答。

Q1. グループ間と社外それぞれの取り組みの使い分けのようなものはありますか?

どちらもコンテンツとしては共通の発表、議論、展示、ワークショップを行っていますが少しだけその中身を変えています。

社外(一般)向けはNTT Tech Conference #1のアンケートに「内輪感」や「中の愚痴っぽい話」のような指摘を頂いていたので、 なるべくそういった話が出ないようにしつつ、NTTグループらしいはなしができればと思って発表提案を募集しています。

ただ、グループ内のイベントでは逆にそういった「内輪感」や「中の愚痴っぽい話」といったものをを出すことで、 NTTグループ内での交流や改善を促していけるのではないかということで、発表提案ではNTTグループ限りの話などがあった際は、 積極的に採用をしています。

Q2. ソフトウェアだけではなく、電気などの分野の技術者も多いかと思いますが、ソフトウェア以外の分野の技術者にも声かけをしているのでしょうか?それとも、ソフトウェアにテーマを絞っているのでしょうか?

イベント当日は時間の都合、この質問だけお答えさせていただいたのですが改めて回答させていただきます。

現在はソフトウェア系を中心にお声がけさせていただいておりますが、ソフトウェアでなければ駄目という制限は設けておりません。

NTTグループでは活動が多岐にわたっているため、ご質問にあるようにソフトウェア系以外にも電気や光ファイバーなど様々な分野の技術者、研究者がいます。 過去にはNTT研究所においてマクスウェルの悪魔に関する研究発表があり、スタッフの中でNTT Tech Conferenceに呼べないかと検討したこともあります。

www.ntt.co.jp

この件については、私は熱力学などがあまりわからないので、大学で物理学を先行していたスタッフに話を聞いてもらったところ、 あまりに専門的すぎてイベントに呼ぶと参加者がついていけない可能性が高いということだったのでお声がけを見送るということも有りました。

ただ、現在のNTT Tech Conferenceも最初はソフトウェアメインで始めたものの、 参加者の声などをアンケートや直接お聞きし、NWやセキュリティなど分野を少しずつ広げてきています。 もし強いご希望があれば、こうした方々にもお声がけし、イベントでの発表などを企画させていただきたいと思います。

Q3. イベント業者さんにお願いしているのは、どのあたりですか?

現在NTT Engineers' Festa の#2, #3の2回をイベント業者さんにお願いしました。(#4はオンラインでやったので業者さんはお願いしてないです)

お願いしたのは

  • イベント企画(#2のみ)
  • イベント準備・設営の一部
  • 当日の受付
  • 当日の誘導係
  • 懇親会の手配

イベントの企画が#2のみなのは、いままでスタッフだけで試行錯誤して手探りでイベントを企画したものの、本業の人にお願いするとどうなるのかという学びの意味で発注させていただきましたが、マニュアルやノウハウの一部をいただけたので、#3からはこの部分についてはお願いをせずに自分たちで再度行っております。

受付、誘導などについては、今までスタッフで行ってきていたものの、参加者がこない間はただ立ってる or 座っているだけになりがちで、スタッフがイベントを楽しめないということも有り、それを回避するためにイベント業者の方にお願いをしています。

懇親会については店との間に入ってもらい、打ち合わせの調整などを行っていただいております。

Twitter

Twitterでもいくつかコメントを頂けたのでそれにレスをさせてもらったりしていました。

企業文化について

はたらきかたについて

資料リンク

発表資料の中で使っていたリンク一覧です。

www.ntt.co.jp

  • NTTのエンジニア有志が集まるきっかけ

www.slideshare.net

  • Slackのinviteを可視化するツール(多分現在はSlackの仕様が変わって動かない)

github.com

  • NTT Tech Conferenceのイベント募集などはこちらでやってます

ntt-techconf.connpass.com

  • 昔私が書いたいNTT Tech Conferenceに関するポエム

qiita.com

  • NTT Tech Conference #1に関する記事

www.atmarkit.co.jp

  • @tokoroten さんの名作

medium.com

  • NTT Tech Conference #2で一番話題になった発表

www.slideshare.net

www.itmedia.co.jp

※発表者の土井さんは現在別会社で働いておりますがこの技術を生かしてこんなこともしてます

www3.nhk.or.jp

おわりに

今回JTFという場で発表をさせていただき、いくつかの質問やコメントを頂けてよかったです!

まだまだ喋りたいこともあるのですが、時間も限られているので発表資料としては今回ココまでとなりますが、 またどこかでお話できればと思っております(NTT労働組合のxx本部に乗り込んでいったはなしとか)

次はNTT Tech Conference #5を企画していければと思っておりますので、 その際はぜひご参加いただけると幸いです。

椅子調べまとめ

在宅勤務の結果手が腱鞘炎になったのだが何が悪いのかと考えたいたが、健康診断のために会社に出社して椅子に肘置きがないことだと気づいた。

そんなわけで椅子を調べることにして某所のSlackで相談したところ色々教えてもらったのでそのまとめ。

先に結論を書いておくと

  • 中古でもいいが状態はともかく、椅子が合うかは確認した方がいい
  • 現地で椅子を座って確認できないなら、会社と同じ椅子を買うのがおすすめ(会社の椅子で問題がなければ)
  • キャスターは壊れてたり汚れてる可能性があるので床に傷をつけたり汚したりするのが気になる場合はキャスターを付け替える

つまり、実際に色々座って確かめたほうがいいよってことでまあそうだよね・・・

というわけで、以下おすすめされた椅子の紹介。

セイルチェア

www.hermanmiller.com

吊り橋の原理をもつフレームのないサスペンションで、体を快適にサポートする独創的なチェア。

だそうで、新品だと9万円ぐらいするけどいいらしい(座ったことないので伝聞)。

ogitaka.com

バロンチェア

www.okamura.co.jp

エルゴノミクス(人間工学)が生み出す快適な座り心地。あらゆるオフィスシーンに美しく映えるシンプル&シャープなデザイン。そして、ビジネス空間を彩る12色のメッシュクロスカラー。シーティングのスタンダードとして世界から認められたテクノロジーを受け継ぎ、ビジネスニーズに幅広く応える先進のメッシュチェアシリーズ、それがBaron[バロン]です。

会社はどうもこれらしいので多分間違いはない(1年ほど座ってきて快適で何も問題がなかった)

ただし、お値段はするのでオフィスバスターズなんかを見てる今日このごろ。 (毎日座るやつだから新品でも安いもんだろって言われるとそんな気もするが家庭内決裁が難しい)

なお、有識者いわく

  • 背もたれはローバック、ハイバック、エクストラバックとあるらしいのでそのへんは好みで
  • 肘掛けも可動と固定があるから注意
  • 座面はメッシュとクッションがあるが、メッシュだと座面の下に死ぬほど埃たまるらしく、それが嫌ならクッションの方がマシ

とのこと

デュオレスト/デュオレハイ

背中の部分が左右2つに分かれている椅子で良い感じに腰を支えてくれるらしい。 しかもお値段も上記のものに比べてかなりお安い。

デュオレスト

www.duorest.jp

デュオレストは、人間工学に基づいて、健康、メカニズム、デザインなどを探求して誕生した人間工学椅子です。

デュオレハイ

こっちはニトリが出しているデュオレスト互換?のやつ

KOKUYO デュオラ

有識者いわく

  • 基本性能(丈夫さ、座面の厚さなど)高いけど調整する箇所が少ない

追記(7/10)

結局座りに行けないのでオフィスバスターズでバロンチェアをポチった。

そしてまた有識者からのコメント

  • キャスターが原因で床に傷がつくかもしれないから可能なら新品変えたほうが良い
  • 床がラグとか絨毯ならそのままならナイロンキャスターでもよいが、土足フロアで使われてたのは傷とか汚れがひどいかも

ってなことでバロンチェアのキャスターをポチり。

ちょっとお値段がするのでサンワサプライ(下)に逃げようかと思ったが、微妙に軸の太さが合わないらしく、 軸の太さがあわないと意味ないからメーカーのを買うのが無駄と故障がないというブログや有識者のコメントにつられて上記純正品をポチった。

Secret Managerの使い方

Cloud Functionsで環境変数トークンなんかを置いてはだめって知ったのでSecret Managerを使ってみることにした。

Secretの作成

コマンド例

echo -n "my super secret data" | gcloud secrets create my-secret \
    --replication-policy="automatic" \
    --data-file=-

解説

  • echoコマンドの-n オプションは改行を含まない
  • --replication-policyautomaticuser-managedがある
    • user-managedを指定した場合は--locationsの設定が必用
  • --data-file=--は標準出力の結果をファイルとするもの

Secret一覧の取得

gcloud secrets list

Secretの読み取り

コマンド例

gcloud secrets versions access latest --secret="my-secret"

解説

  • gcloud secrets versions accessコマンドでSecretへアクセス
  • versionの指定が必用(ここではlatestで最新版を取得)
    • バージョン番号(1~)を指定することで任意のバージョンのSecretを取得可能
  • --secret で鍵の名前の指定が必用

プログラム(Python)からの読み取り

requirements.txt

google-cloud-secret-manager

sample.py

def add_secret_version(project_id, secret_id, payload):
    """
    Add a new secret version to the given secret with the provided payload.
    """

    # Import the Secret Manager client library.
    from google.cloud import secretmanager

    # Create the Secret Manager client.
    client = secretmanager.SecretManagerServiceClient()

    # Build the resource name of the parent secret.
    parent = client.secret_path(project_id, secret_id)

    # Convert the string payload into a bytes. This step can be omitted if you
    # pass in bytes instead of a str for the payload argument.
    payload = payload.encode('UTF-8')

    # Add the secret version.
    response = client.add_secret_version(parent, {'data': payload})

    # Print the new secret version name.
    print('Added secret version: {}'.format(response.name))

その他

Secretにアクセスすると403が返ってくる

次のいずれか

  • Secretの名前、バージョンのいずれかが間違えている(存在しないSecretへのアクセス)
  • アクセスする権限がない
    • Secretに対してアクセスするService Accountへ「Secret Manager のシークレット アクセサー」のロールを付与する

参考

在宅用に椅子を買う前に

2月からずっと在宅勤務をしているからか肩こりが酷くなってきた。

普段はダイニングテーブルとダイニングチェアで仕事をしているので、椅子を買うべきかも考えたのだが、ダイニングにオフィスチェアやゲーミングチェアはおきたくないなーと思ったので知り合いにおすすめを聞いたところ、姿勢矯正のシート(?)的なのが良いと聞いたので買ってみた。

知り合いに勧められて上記のMTG Style Athlete IIを購入し、1週間使ってみるとたしかに腰とかは楽になった気はする。

しかし肝心の肩こりは多少良くなったような気もするが・・・まだわからん・・・

とりあえずGW開けまで試してみて、在宅勤務がまだまだ続く(とは思うが)ようだったらイスも検討しようと思う。

子供向けレシピ本

最近上の子がこの本を見て料理を作ってくれる。

イラスト多めでわかりやすいし味も美味しい。

ちょっと難しいレシピになると親も手伝わないといけないけど、一緒にやるのは面白いのでそれはそれで楽しいw

個人的にはオムレツやだし巻き卵などの卵周りの料理を適当に作っていたけど、改めてレシピを見ると思った以上にバターや牛乳が使われていたけどいつもより美味しかったので学びだった。

最近は家を出れないことがおおいけど、子供と家で過ごす時間を楽しくできればと思う今日このごろ。

KubernetesのSecret管理周りの雑調べメモ

GitopsでKubernetesのManifestをGit管理しようとした際に、Secretは暗号化されていると言ってもBase64だしどうするんだろうと思って調べた。

結論からいうと、サイボウズさんのブログをみるかぎりKubeCon19でも話題にはなっていたがまだ決定打はない模様(2020/04/06時点)

blog.cybozu.io

しらべたこと

SecretGenerator

現在Kustomizeを使っているのでKustomizeでSecretをどうするのかを調べたところ、 SecretGeneratorという機能があるらしい。

deeeet.com

secretGenerator:
- name: app-tls
  commands:
    tls.crt: "cat secret/tls.cert"
    tls.key: "cat secret/tls.key"
  type: "kubernetes.io/tls"

しかし調べると上記の commands はセキュリティの理由から廃止になったらしい。

github.com

commands is removed from SecretGenerator due to a security concern. One can use files or literals, similar to ConfigMapGenerator, to generate a secret.

現在はfilesやliteralsを使えとのこと。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
secretGenerator:
  # generate a tls Secret
- name: app-tls
  files:
    - secret/tls.cert
    - secret/tls.key
  type: "kubernetes.io/tls"
- name: env_file_secret
  # env is a path to a file to read lines of key=val
  # you can only specify one env file per secret.
  env: env.txt
  type: Opaque

しかしSecretGeneratorは結局のところ指定したファイルや環境変数などをBase64エンコードしたSecretをKustomizeが生成してくれるだけなので、 SecretのGit管理という意味では意味をなさない。

GCPの場合

GCPで完結させるなら割とシンプルにできるっぽい。

  1. Cloud KMSで鍵を作る
  2. Cloud KMSで作った鍵を使ってデータを暗号化
  3. レポジトリに暗号化したデータをコミットしてPush
  4. Cloud Buildの実行(復号とデプロイ)

qiita.com

Secretとして使うファイルは復号してたあとCloud Buildの中の環境変数として取り込むっぽい

cloud.google.com

まだ調べきれてないやつ

SealedSecret

github.com

Kamus

github.com

Helm-secrets(Sopsというのを使うらしい)

qiita.com

色々ありすぎてまだ調べきれてないので途中までですがなんかの参考になればいいな・・・