SRE NEXT 参加

先週末に開催されたSRE NEXTに参加してきました。

sre-next.dev

個人スポンサーとして参加していたのでノベルティもいただきました。

これ、ボトル保温もできるし、直接ステンレスマグとしても使えると思ってるんですけど、どうなんですかね? めちゃくちゃノベルティのマグ使いやすくて自宅では圧倒的な使用率を誇っています。

印象に残ったセッション

個人的にはやはりキーノートで樽石さんが話してくれた ギークがイオンに飛び込んだ結果がやばい〜Reliabilityと経営〜 が印象的でした。

www.youtube.com

SREっぽいプラクティスなのか?と言われると難しいところではあるものの、アーキテクチャ選定としての審美眼や 経歴を踏まえつつどういった戦略をとってきたのかが面白く、 また現状の私としては共感を得ることも多くて分かりみが深かったです。

感想

感想としては、会場も和気あいあいとして雰囲気が良かったことを覚えています。 また参加者層もかなり若い印象を受けました。

ただ私用による午後にはオンラインに切り替えてしまったので、懇親会に参加できなかったのが心残りです。 次回は予定調整しつつ、近くにホテルでもとっておこうかと思っています。 後は、ちゃんとCFPも出しましょうね。

おうちクラスタのcloudflaredをDaemonSetに変更する

おうちクラスタのcloudflaredはDeploymentとしてデプロイしていましたが、 DaemonSetとしてデプロイするように変更しました。

Why?

これといった強い理由はないですが、おうちクラスタの特定のノードにcloudfalredのPodが偏ってデプロイされて、 かつそのノードが何らかの理由で通信できない場合に外部からのアクセスが不可能になってしまうためです。

Deploymentでも特定のノードに偏らないように定義すること自体はできるのですが、 それをやるぐらいならDaemonSetにしておいた方が素直で良さそうだったので DaemonSetに変更しました。

DaemonSetとしてデプロイする

実際に変更する場合には、以下2つだけを実施すれば良いです。

  • kind: Deploymentkind: DaemonSetに変更する
  • DaemonSetで使えないパラメータを削除する(replicasなど)

github.com

これだけでDaemonSetに切り替えることができました。

Argo CDでCalicoをデプロイしているとmetadata.annotations: Too longエラーが出る

はじめに

TL; DR

  • Argo CDのApplicatoinのsyncOptionsServerSideApply=trueを追加すれば良い

github.com

問題

スクショを取っていなくて申し訳ないんですが、CalicoのHelm Chartをアップデートしたところ以下のようなエラーが出るようになりました。

CustomResourceDefinition.apiextensions.k8s.io "installations.operator.tigera.io" is invalid: metadata.annotations: Too long: must have at most 262144 bytes

解決策

こちらの記事が参考になりましたが、Argo CDは大きなCRDを同期する場合にエラーになるようでして、
その場合はServerSideApplyを有効化にすれば良いようです。

www.arthurkoziel.com

おうちクラスタでも、ServerSideApplyを有効化にしたらエラーが出なくなりました。

  syncPolicy:
    syncOptions:
    - CreateNamespace=true
+    - ServerSideApply=true
    automated:
      prune: true
      selfHeal: true

github.com

めでたし、めでたし。

いずれはServerSideApplyがデフォルトの挙動になるような記述がありますが、どうなんでしょうかね。

ルーターの設定ファイルをArgo WorkflowsでS3にバックアップする方法

はじめに

今回は、自宅で使用しているルーターの設定ファイルをArgo Workflowsを使ってS3にバックアップする方法について説明します。

Argo Workflowsとは

Argo Workflowsは、ワークフローエンジンの1つであり、コンテナベースのジョブオーケストレーションを提供します。
Argo Projectの1つであり、Kubernetes上でのジョブ管理に特化しています。

argoproj.github.io

CronWorkflowとは

CronWorkflowは、Argo WorkflowsのCRDの1つで、CronJobのように定義したスケジュールに従ってWorkflowを実行してくれます。
CronWorkflowは、Workflowの定義の中にスケジュールを記述し、指定されたスケジュールに従ってArgo WorkflowsがWorkflowを実行します。

argoproj.github.io

設定をファイルとして出力する

RTX1300の設定をファイルとして出力するためには、Ansibleを使います。

Playbookでは、以下のようにして設定をファイル化しています。

  1. show config で標準出力に設定内容を書きだす
  2. 1の結果をconfig.txtに保存する

これを実行するためのPlaybookをConfigMapとして定義します。

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: backup-playbooks
data:
  backup.yaml: |
    ---
    - hosts: all
      connection: network_cli
      vars:
        ansible_network_os: yamaha_network.rtx.rtx
      tasks:
        - name: get configuration
          yamaha_network.rtx.rtx_command:
            commands:
            - show config
          register: result
        - name: Copy output to file
          ansible.builtin.copy:
            content: "{{ result.stdout[0] }}"
            dest: "config.txt"
        - name: Print config
          ansible.builtin.debug:
            msg:
              - "{{ result.stdout[0] }}"

これで設定をファイルとして出力するためのPlaybookができたので、CronWorkflowを定義してWorkflowが定期的に実行されるようにします。
日本時間の午前0時に実行されるように定義し、volumeMountsで先ほどのPlaybookをマウントして実行するように定義します。

---
apiVersion: argoproj.io/v1alpha1
kind: CronWorkflow
metadata:
  name: backup
spec:
  timezone: 'Asia/Tokyo'
  schedule: "0 0 * * *"
  concurrencyPolicy: "Allow"
  startingDeadlineSeconds: 0
  workflowSpec:
    entrypoint: backup
    templates:
    - name: backup
      serviceAccountName: backup
      volumes:
      - name: playbooks
        configMap:
          name: backup-playbooks
      container:
        image: ghcr.io/corrupt952/home/ansible:85f40b4ceff32b809d507d234920ce45b2303a60
        env:
          - name: ANSIBLE_HOST_KEY_CHECKING
            value: "False"
        envFrom:
        - secretRef:
            name: backup-credentials
        volumeMounts:
        - name: playbooks
          mountPath: /playbooks
        command:
        - bash
        - -lc
        # NOTE: When specifying an IP address directly in the i option,
        #       a trailing comma is used to treat it as an IP address instead of a file.
        - >-
            ansible-playbook
            --ssh-common-args="-o StrictHostKeyChecking=no"
            -e "ansible_user=$BACKUP_USERNAME ansible_ssh_pass=$BACKUP_PASSWORD"
            -i "$BACKUP_HOSTNAME,"
            /playbooks/backup.yaml

出力した設定ファイルをS3にアップロードする

Argo WorkflowsのWorkflowには、コンテナ上にあるファイルを外部ストレージへ保存するための機能がついています。
この機能を使用して、Argo WorkflowsでS3ファイルにアップロードすることができます。

argoproj.github.io

argoproj.github.io

外部ストレージへの保存設定は各templatesのoutputsに定義します。

---
apiVersion: argoproj.io/v1alpha1
kind: CronWorkflow
metadata:
  name: backup
spec:
  timezone: 'Asia/Tokyo'
  schedule: "0 0 * * *"
  concurrencyPolicy: "Allow"
  startingDeadlineSeconds: 0
  workflowSpec:
    entrypoint: backup
    templates:
    - name: backup
      serviceAccountName: backup
      volumes:
      - name: playbooks
        configMap:
          name: backup-playbooks
      container:
        image: ghcr.io/corrupt952/home/ansible:85f40b4ceff32b809d507d234920ce45b2303a60
        env:
          - name: ANSIBLE_HOST_KEY_CHECKING
            value: "False"
        envFrom:
        - secretRef:
            name: backup-credentials
        volumeMounts:
        - name: playbooks
          mountPath: /playbooks
        command:
        - bash
        - -lc
        # NOTE: When specifying an IP address directly in the i option,
        #       a trailing comma is used to treat it as an IP address instead of a file.
        - >-
            ansible-playbook
            --ssh-common-args="-o StrictHostKeyChecking=no"
            -e "ansible_user=$BACKUP_USERNAME ansible_ssh_pass=$BACKUP_PASSWORD"
            -i "$BACKUP_HOSTNAME,"
            /playbooks/backup.yaml

      # ここから下が追記
      outputs:
        artifacts:
          - name: config
            path: /home/ansible/config.txt
            s3:
              endpoint: s3.dualstack.ap-northeast-1.amazonaws.com
              bucket: x
              key: backup/routers/rtx1300/config.txt
              accessKeySecret:
                name: backup-credentials
                key: BACKUP_AWS_ACCESS_KEY_ID
              secretKeySecret:
                name: backup-credentials
                key: BACKUP_AWS_SECRET_ACCESS_KEY

これで毎日設定ファイルをS3ファイルにアップロードすることができました。

実務上の応用例

今回は自宅のルーターの設定ファイルのバックアップについて説明しましたが、Argo Workflowsを使うことで、様々な用途に利用することができます。

  • CronJobをCronWorkflowに置き換え、各種実行ログを外部ストレージへ直接保存する
  • 調査・分析用Worklfow実行後に生成されるファイルを外部ストレージへ保存する
  • 賛否はありますが、アプリケーションのバッチ処理から外部ストレージへの保存処理を分離する

おわりに

今回は、Argo Workflowsを使って、自宅で使用しているルーターの設定ファイルをS3にバックアップする方法について説明しました。
Argo Workflowsは、Kubernetes上でのジョブ管理に特化しており、CronWorkflowという機能を利用することで、定期的に実行されるジョブを簡単に定義することができます。
Argo Workflowsを使って、様々な用途に利用することができるので、ぜひ活用してみてください。

revealerというデバッグ用Webアプリを公開しました

注意事項

この記事は、Notion AIに対して

  • 問題と解決策の概要
  • 例示用のコード

を渡して生成した実験的な記事になります。

はじめに

revealerというHTTPのリクエストデータを表示するWebアプリを公開しました。

revealerとは

revealerは、アクセス元のIPアドレスやリクエストの詳細情報を表示するWebアプリです。
元々は、自分自身が開発中のアプリの検証用途で作成したものを、ブラッシュアップして公開したものになります。

github.com

そのためできることは、

  • アクセス元のIPアドレスの表示
  • リクエストヘッダや、リクエストボディ、クエリストリングが意図した値になっているか

になります。

CloudFlareを使っているため、それ関連のヘッダが余計についていますが無視してください。

実際に試してみる

revealerは、r.zuki.dev もしくは revealer.zuki.dev で実際にアクセスすることができます。

おわりに

今回は、HTTPリクエストデータを表示するWebアプリ「revealer」について紹介しました。
HTTPリクエストデータを確認したい時には、ぜひrevealerをご利用ください。

1周回って個人のタスク管理はGoogle Tasksでもいいかもしれない

昔から自分のタスク管理方法について2,3年に1度見直していますが、1周回ってGoogle Tasksでいいのかもしれないと思い始めてきた。

以下の記事のように必要な機能を洗い出して、その機能が担保できるものを使ってきている。

khasegawa.hatenablog.com

現在はNotionでWeekly Dashboardというのを毎週自動作成されるようにしており、それを使ってタスク管理している。

今の状態で決して不満はないし、管理しやすい方だとは思っているんだけど、 Google Calendarで予定調整をしているのもあって、タスクとスケジュールの2重管理になってしまっている。

Notion以外の会社が提供している有料サービスを使えば、Notionであってもこれを実現できるけど、 別にそこまでしてやりたいわけではない。
となってくると、案外Google Tasksが選択肢としてはいいんじゃないかと思えてきた。

ただ、Googleのサービスは急にサ終する可能性も否定できないから、Notionのままだったり、別のサービス(Mondayとか)のほうがいいかもしれないが、そこまでやるメリットがあるかは検討したい。

www.youtube.com

OpenAI API を使ったChrome 拡張「br1efly」の紹介

注意事項

この記事は、Notion AIに対して

  • 問題と解決策の概要
  • 例示用のコード

を渡して生成した実験的な記事になります。

はじめに

既に多くの方々が似たChrome拡張を作っているため何番煎じかは分かりませんが、Chrome拡張を作成しました。
今回は、自身の勉強のためにOpenAI APIと連携して、選択している文字列を操作する拡張でbr1eflyという名前にしています。

github.com

この記事では、br1eflyの使い方や設定方法などについて紹介します。新しい操作方法に挑戦したい方は、ぜひお試しください。

機能概要

br1eflyが現時点でできる機能は以下になります。

  • 要約
  • 言い換え
  • 言語検出
  • 対案の作成
  • 文章の構成

を行うことができます。
これらの機能は設定画面で選択した言語で出力されるように調整しています。

またOpenAIだけではなく、Azure OpenAI Serviceにも対応しているため、組織で契約している場合でも利用がしやすいです。

br1eflyの使い方

br1eflyを使うには、以下の手順を実行します。

  1. 操作をしたい文章をブラウザ上で選択する
  2. 右クリックをしてコンテキストメニューを開き、br1eflyのメニューから行いたい指示を選ぶ
  3. 選択範囲の1番下に"Processing..."というものが出てくるので、しばらく待つ
  4. エラーがなければ、"Processing..."の代わりに結果の文字列が表示される
  5. Closeを押して閉じる

手順を画像付きでスライドのように表示できるサービスを使っているマニュアルは以下です。(見れない場合があるかも?)

注意事項

  • 出力結果の言語は、設定画面で指定している言語になります
  • それなりに安定していますが、設定を無視して別の言語になることがあります

インストール

bri1eflyは現時点ではStoreに公開しているわけではないため、GitHubからzipをダウンロードして手動でインストールする必要があります。
API Keyなどを不正に取得するようなコードは書いていませんが、不安な方は気軽に質問でもしてください。

  1. br1eflyのリリースから最新版のzipをダウンロードする
  2. zipを展開する
  3. Chrome拡張の画面を開く
  4. Developer modeを有効にする
  5. Load unpackedで展開したディレクトリを選択する

手順を画像付きでスライドのように表示できるサービスを使っているマニュアルは以下です。(見れない場合があるかも?)

設定

br1eflyを使うためには、API Keyとエンドポイントの設定が必要です。

設定方法は以下の通りです。

  1. br1eflyのoptionsを開く
  2. Output Languageで出力結果の言語を指定する
  3. API TypeでOpenAIかAzureを選択する
  4. API Keyを入力する
  5. API Keyを発行したアカウントの利用可能なModelを選択する
  6. 【Azureのみ】 Endpointを入力する
  7. Saveをクリックして保存する

手順を画像付きでスライドのように表示できるサービスを使っているマニュアルは以下です。(見れない場合があるかも?)

追加したい機能

今後追加しておきたいと思っている機能は、以下になります。

  • 履歴機能
    • 元々は特定のプロンプトを特定の文字列に実行した結果を簡単に記録しておいて後から振り替えれるようにしたかったので気が向いたら実装するかも
  • データ構造・プログラミング言語変換機能
    • ブラウザで使うかは怪しいですが、ちょいちょい使うこともあるため実装されると嬉しいかも
  • ユーザが独自にメニューとプロンプトを追加できる機能
    • デフォルトで決まっている指示のみを実行しているが、組み込む前に動作確認をしたかったり、公開したくないプロンプトもあるため、この機能を追加したい
    • 関連してパラメータもプロンプトごとに設定できると嬉しい
  • 設定のExport/Import機能
    • 他の人と共有したい場合に簡単に共有できるようにしておきたい
    • APIキーなどは除外すると思います

ここには書いてないですが、ポップアップで表示されるHTMLをもう少しまともにするか、 任意の文字列を入れれるようにしておくことも検討しておきたいですね。

まとめ

本記事では、OpenAI APIを使ったChrome拡張「br1efly」について紹介しました。
機能の使い方や設定方法、また追加したい機能についても触れました。 仕組みの具体的な話や、TypeScriptで書くにあたって大変だったことなどは別の記事で触れようと思います。

ぜひ、APIの課金には気をつけながらbr1eflyを触ってみてください。