📮

AWS の最新情報を nostr に投稿するコンテナイメージを作成する

2023/07/25に公開

課題

個人で確認するために AWS の最新情報の RSS Feed からタイトルとリンクを Twitter に投稿していたのですが、Twiiter API に色々とあったため、nostr に投稿するように変更しようと思います。

解決策

非常にありがたい事に nostr のライブラリは様々な言語で公開されており、今回は deno(typescript) で実装し、コンテナイメージ化する事で様々なクラウドサービスで利用できるようにしたいと思います。

自分要件

  1. 使い回しができるように RSS Feed の URL は、環境変数から読み込むようにする。
  2. 同じく nostr の秘密鍵も環境変数から読み込めるようにする。
  3. 何分前の記事を投稿対象とするかも環境変数で設定するようにする。

実装

feed を deno で nostr に投稿するので feedenostr という安直な名称にしました、ディレクトリ構成はこのようになります。

.
├── docker
│   └── Dockerfile
└── src
    ├── deps.ts
    ├── feedenostr.ts
    └── lock.json

メインの処理は feedenostr.ts に実装しており、Dockerfile をソースとは別の階層で管理したかったためイメージをビルドする際は、ビルドコンテキストを指定し src 配下をコピーするようにビルドします。
docker build -t feedenostr -f ./docker/Dockerfile .

Dockerfile 内ではソースのコピーと、モジュールの再読み込みを行い、CMD で deno run でプログラムを実行するようにイメージを作成しました。

Dockerfile
ARG DENO_VERSION=1.35.0

FROM denoland/deno:bin-$DENO_VERSION AS deno
FROM debian:11-slim

COPY --from=deno /deno /usr/local/bin/deno
COPY src /srv
RUN deno cache --reload --lock=lock.json /srv/deps.ts

CMD ["deno", "run", "-A", "/srv/feedenostr.ts"]

.env ファイルを利用するほど環境変数は多くないので、Deno.env を利用し自分要件の環境変数を取得しています。
https://github.com/gajirou/feedenostr/blob/main/src/feedenostr.ts#L10-L12
ソースと詳細な利用方法は、以下のリポジトリにあげています。
https://github.com/gajirou/feedenostr

また、各クラウドサービスからは以下のサービスを利用し定期実行を行ってみました、環境変数の設定も同サービス内で行います。

AWS

利用したリソース
・Amazon ECR
・Amazon ECS
=> タスクスケジューラから定期実行の設定を行う。

GCP

利用したリソース
・Artifact Registry
・Cloud Run Jobs
=> Scheduler から定期実行の設定を行う。

Azure

・Azure Container Registry
・Azure Containers Apps
=> コンフィグ設定から定期実行の設定を行う。

まとめ

現在は無事 nostr へ投稿ができる状態となりましたが、deno で公開されている nostr client が非常に便利だっため、躓く事なく nosrt への投稿ができるようになりました。

AWS 最新情報の Feed は AWS News Bot JP というユーザで nostr に投稿しております。

コンテナを定期的に動作するという点においては、GCP の Cloud Run Jobs が一番直感的に実行できたなという所感ですが、現状では AWS で動作させています。

Discussion