AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

ECR とやり取りさせるための AWS の OIDC (WebIdentifer) に付与するロールの中身

ポリシーだったかもしれねえ……!

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetAuthorizationToken",
            "Effect": "Allow",
            "Action": "ecr:GetAuthorizationToken",
            "Resource": "*"
        },
        {
            "Sid": "PushImageOnly",
            "Effect": "Allow",
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": "*"
        }
    ]
}

概ねこんなんでいいはず、 JSON でガッとコピペでおわりっ。 必要なら要件に合わせて Action 増やしたり Resource いじったりしてみてください。

docker のコンテナ名でまとめて消す

Docker、コンテナを削除したい時は CONTAINER ID を指定しないといけなくて、けど NAMES に prefix や suffix で整理されているとそっちで絞り込みたいよね、という時がほとんど。

でこれどうすりゃええんや、と思ったら以下のようにすればよいらしい。

qiita.com

  1. docker ps -a --filter name={絞り込み条件}
    • CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS, PORTS, NAMES が出る
  2. docker ps -aq --filter name={絞り込み条件}
    • コンテナ ID だけ取得できる
  3. docker rm `docker ps -aq --filter name={絞り込み条件}
    • 絞り込んだコンテナ ID で対象を削除できる

うれしい。

結構擦られている神奈川県立高校入試のインターネット出願システムのヤツ

X で「MX レコードが」みたいなのは見て「おお、もう……」という感じだったんだけど、クラスメソッドの中の人が個人的に調査してたっぽかった。

それっぽい記事

dev.classmethod.jp

dev.classmethod.jp

短絡的に解決する

AWS SES はやっぱ最強なんすよ。

逆に神奈川県はなんで postfix を EC2 に立てたんだろう。ドメイン周りが設定持ち出せなかったとか、従量課金でランニングコスト読めないのを嫌がったのか?

結論

Gmail の要求レベルに適合するメール環境を用意、継続的に維持する事は 年々難易度が上がっています。

マジこれなんだよな。

Gmail (と Yahoo) が受け入れてくれるように「環境構築してくれ!」というお話あってお断りさせてもらったんだけど、別口でも「構築してくれ!」という案件がまた飛んできて、「このあたりかなり低く見積もられがちなんだよなあ……」と 2024 年開幕早々に感じている。

本来メール配信とはそういうセンシティブなものなんだろうけど、現状のミドルウェアがまあ sendmailpostfix と連綿と続いている系譜の中でめちゃくちゃ難しい、というのは前提にありそう。

Mailbox providers announce new requirements for bulk email senders と Upcoming changes to AWS CloudTrail events published by AWS Secrets Manager

AWS のお知らせきてたので個人的なメモかわりに。

Mailbox providers announce new requirements for bulk email senders

Gmail と Yahoo がメール受信時の制限つよくするよ! って言ってるやつ。 SPF, DKIM, DMARC の設定をしておこう!

詳しくはこのへん。

dev.classmethod.jp

Upcoming changes to AWS CloudTrail events published by AWS Secrets Manager

なんか出力の記述が arn に統一されるらしい。 特に変更前は aRN arn が入り混じっている状態だったとのこと。 ログパースしている人以外は問題なさそう。

詳しくはこのへん。

dev.classmethod.jp

AmazonLinux2023 では dnf や snap 経由で certbot をやれない(ハズ

この記事を書いている時点ではできないはず。

2024/03/01 追記: certbot が追加されたっぽい

certbot has now been added to the just released AL2023.3

github.com

とのことで、アップデートすればおそらく certbot を素朴に利用できるはず。 いやーよかったよかった。

ただこれ例外があるっぽくて。

Missing the cloudflare plugin though.

github.com

どうも Cloudflare ぷらぎんは無いらしい。

AmazonLinux 2023 なんだし Route53 使っとけや、ということっぽくてそれはそう! という気持ちある。 けどドメインは Cloudflare Registration している、とかでサーバリソースだけ AWS で調達したい、というパターンも理解できる (なんなら僕もやろうとしている) ので、別 issue で package request 飛んでいるし、ワンチャン追加されるかもしれない。

という感じ。 少なくとも AmazonLinux2023 においては、標準的な手順でできない! みたいな辛さはほぼほぼ無くなったんじゃないかな。

以下のように certbot 公式の手順一覧にはまだ追加されてないけど、そのうち追加されそうな気がする。

公式の対象ディストリなど

certbot を AmazonLinux2023 へ

Let's Encrypt でもおすすめされている ACME クライアント、事実上の業界標準みたいなトコに落ち着いている気がする。

でこれなんだけど、AmazonLinux2023 にはスッとパッケージマネージャなどでインストールできない。

AmazonLinux 2023 は 2 と違ってわりとピュア寄りめな RHEL クローンというわけではなさそうなので。 Fedora 派生っぽいんだけど、見てる感じ FedoraUbuntu のいいとこ取りをしようとしているんじゃないか? (メンテナンスが追いついてないけど) という気がする。 気がするだけ。

でまあどうするか、というと python3 インストールからの pip を使ってやるのが一番直感的そう (この記事を見ている人の用途的には)。

というのが書いてある

コメント兄貴も pip で動くといっとる。

Please refer to the steps in this link to setup certbot via pip. The steps work fine on Amazon Linux 2023.

pip 経由で certbot をセットアップするには、このリンクの手順を参照してください。この手順は Amazon Linux 2023 で正常に動作します。

repost.aws

これだとシステムワイドに certbot コマンドが配備されるので、難しいこと考えなくていい。

Docker でやる

上記リンク先でも触れられていたんだけど、 AWS はナレッジを更新しろという気持ちがある。

docs.aws.amazon.com

とはいえ自社サービスで CertificateManager あるからそっちを使え、と言及するのは当然だし、 certbot 及び Let's Encrypt が変更されたら追従しつつドキュメント治すのもめんどうような、というのは理解できる。

Certificates generally cost money because of the labor involved in validating the requests, so it pays to shop around. A few CAs offer basic-level certificates free of charge. The most notable of these CAs is the Let's Encrypt project, which also supports the automation of the certificate creation and renewal process. For more information about using a Let's Encrypt certificate, see Get Certbot.

でまあ、 AWS のドキュメントリンク先を見たら、現代の certbot は Docker を提供していた。

eff-certbot.readthedocs.io

ので、システムワイドに certbot のためだけに pip と python3 インストールしたくねえ! という人はこの Docker イメージを用いる方が良さそう。

  1. Docker 経由で httpd/nginx なり SSL アクセラレータ相当が証明書を読むディレクトリをマウント
  2. docker exec certbot ~ など牧歌的なコマンドで証明書を生成
    • 日ごとの実行を crontab などに記述して、証明書自体の自動更新部分とする
  3. 証明書更新の cron 実行よりあとの時間で、 httpd/nginx なり SSL アクセラレータ相当を再起動する cron を記述する
  4. 合せ技一本、みたいな風情で自動更新できている

こうかな、たぶんそう、やってないけどいけるはず。

crontab の例

公式の記載だと、 Docker イメージは以下のように使え、とあった。

sudo docker run -it --rm --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
            certbot/certbot certonly

長すぎるのでシェルスクリプトにしてもいいし、まあこのまま書いてもいいと思う。

以下は手動で証明書発行済という想定です。

# certificate renew
0 1 * * * /bin/bash -l -c 'sudo docker run -it --rm --name certbot -v "/etc/letsencrypt:/etc/letsencrypt" -v "/var/lib/letsencrypt:/var/lib/letsencrypt" certbot/certbot renew'
# restart (httpd の場合
0 2 * * * /bin/bash -l -c 'sudo systemctl restart httpd'
# restart (nginx の場合
0 2 * * * /bin/bash -l -c 'sudo systemctl restart nginx'

たぶんこんな感じでええんちゃうか?

snap

certbot はそもそも snap というパッケージ管理ツールを利用してインストールしてくれ、というのが方針なのですが、これが基本的に RHEL っぽい環境は RHEL クローン向けの提供なので、 EPEL 使える必要があったりなんだり、みたいな色々があるんですね。

でまあ AmazonLinux はわりとクローズなディストリなので、 snap はインストールできなくてウム、という感じです。

以前 AmazonLinux2 で snap をインストールして certbot を使う、みたいな記事も書いたんですが、 2024 年の現在だとどうも削除されたのかアクセスできなくなっておりダメそうな風情があります。

まあ Docker 使うか pip でインストールするか、あたりがよさそうです。

ActiveStorage の blob key で付与される値を変更する

調べたらやってる人はいるもんだった。

qiita.com

本当はこれはこれで Unique が保証されるままにしておいて、 類推できるように意味をもたせた URL にしたい場合は、所謂スラグとかパーマリンク的に扱うのがいいんだろうか。

と思ったけど、結局ダウンロードされるファイルがシステムからユーザの手元に届くまで一貫して有意なファイル名になっていてほしい、という要望があるのでやはり改造した方が扱いは良いのだった。 Unique の担保でアップロード時の unixtime か、 YYYYMMDDhhmmss を prefix として付与しておけばまあいいでしょ……。 いいよな?

特に「テーブルを SELECT したときわけわからんからなんとかしてくれ!」みたいに言われる事があるので、「ええっ……まず SELECT する意味ある?」という感じなんだけど、記事とファイルの紐づけとか、日付からファイル絞り込んで、とかしたい時は UI が無いと確かに SELECT するしかねえもんな、という感じで管理しているアプリケーションのあれそれ事情はあるのだった。

人による。

homebrew で webalizer をインストールしようとしたら it is not maintained upstream! と言われた

手順

ちょっと長くなるので、先に結論だけ書いておく。

❯ brew update
❯ brew tap --force homebrew/core
❯ EDITOR=vi brew edit webalizer

# disable! date: "2023-06-19", because: :unmaintained 行ごと削除HOMEBREW_NO_INSTALL_FROM_API=1 brew install webalizer

homebrew で webalizer をインストールする

所謂ログ可視化の基盤を構築していない (要件外) 環境で、ログ解析をしてほしい、という話が出てきた。

「君の言うこともわかるけど!」けどいまカガリは泣いているんですね、この記事を書いている時点でガンダム SEED FREEDOM は来週公開です。

エンドの言う事には逆らえないので、ジャーマネから提供されてきたログを正規表現httpd/nginx なりのアクセスログ形式に整形して、ここは大正義 webalizer に食わせましょう!

ちなみにこの手の製品は、 Weblog Expert が最強だと思っているんだけど、 AppleSillicon 環境に移行して WindowsVM が使えなくなったので強制的に卒業したんですよね。

brew info

パッケージは存在するようです、やったぜ。

❯ brew info webalizer
==> webalizer: stable 2.23-08 (bottled)
Web server log file analysis
https://web.archive.org/web/20200622121953/www.webalizer.org/
Disabled because it is not maintained upstream!
Not installed
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/w/webalizer.rb
License: GPL-2.0-or-later
==> Dependencies
Required: berkeley-db@5 ✘, gd ✔, libpng ✔
==> Analytics
install: 1 (30 days), 1 (90 days), 17 (365 days)
install-on-request: 1 (30 days), 1 (90 days), 17 (365 days)
build-error: 0 (30 days)

brew install

ファッ!?

❯ brew install webalizer
Error: webalizer has been disabled because it is not maintained upstream!

とりあえずエラーメッセージでググって見た所、以下のように類似の症例を見つけた。 Formula から無効化を指定している行を取り除けばいいらしい。

stackoverflow.com

Formula の編集については以下とのことだった。 んだけど、読んでもよくわからねえな……?

docs.brew.sh

とりあえずやってみる

とりあえず brew edit して disable 指定している行を取り除けばいいらしい、のでやってみよう。

❯ brew edit webalizer
Warning: edit is a developer command, so Homebrew's
developer mode has been automatically turned on.
To turn developer mode off, run:
  brew developer off

Usage: brew edit [options] [formula|cask|tap ...]

Open a formula, cask or tap in the editor set by EDITOR or
HOMEBREW_EDITOR, or open the Homebrew repository for editing if no argument is
provided.

      --formula, --formulae        Treat all named arguments as formulae.
      --cask, --casks              Treat all named arguments as casks.
      --print-path                 Print the file path to be edited, without
                                   opening an editor.
  -d, --debug                      Display any debugging information.
  -q, --quiet                      Make some output more quiet.
  -v, --verbose                    Make some output more verbose.
  -h, --help                       Show this message.

Error: Invalid usage: webalizer doesn't exist on disk.
Run brew create --set-name webalizer $URL to create a new formula!

おファッ!?

全然知らねえ、という風情だったのだけど、どうも edit は developer 向けコマンドになったよとのことなので、 brew edit を実行すると自動で developer mode が on となるとのことだった。

まあそれはどうでもいいんだけど、結局実行すると Error: Invalid usage: webalizer doesn't exist on disk. とのことで、 webalizer の formula が見つからないと言われる。 ナンデ?

戻したければ

以下を叩けばいいらしいけど、特に実行しなくても大丈夫。

❯ brew developer off

brew create

とりあえず create をしろ、と指示されたしやってみましょう! formula の定義あるし homebrew-core の URL を指定したらなんとかならんか?

EDITOR=vi brew create --set-name webalizer https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/w/webalizer.rb
Error: No available tap homebrew/core.
Run brew tap --force homebrew/core to tap homebrew/core!

あれ、 core を tap してない? もしや。

brew tap

tap したら色々落ちてきましたね。

❯ brew tap --force homebrew/core
==> Tapping homebrew/core
Cloning into '/opt/homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Enumerating objects: 1831696, done.
remote: Counting objects: 100% (81800/81800), done.
remote: Compressing objects: 100% (360/360), done.
remote: Total 1831696 (delta 81523), reused 81621 (delta 81440), pack-reused 1749896
Receiving objects: 100% (1831696/1831696), 470.97 MiB | 26.09 MiB/s, done.
Resolving deltas: 100% (1306135/1306135), done.
Tapped 3 commands and 7004 formulae (7,378 files, 545.5MB).

brew edit

で、あれもしかして、という感じで edit。

❯ brew edit webalizer

ヴァー動いた

まーじ。

ということで、以下の disable 行を削除します。

github.com

削除後はこんな感じにする
  bottle do
    sha256 arm64_ventura:  "f26eca3adbd5012374dcf7fba0940ba0fad5522292a5add43ce5e8ae9cfd1bb1"
    sha256 arm64_monterey: "0eec79580ef41a980a2c3fd9161bee665d87eee2d0bed14a89eee1e285b91313"
    sha256 arm64_big_sur:  "e6cc3224691d03aa7a7c2c90b53372ba3bcd4a50d15ce849a4403457690bdbc7"
    sha256 ventura:        "91e8871f5afbd71654822b90b3202062a74604c89653a00b76e769ce3e9b20c8"
    sha256 monterey:       "d74f9239455491a88840a46ca4a58395186467530de79e41bfde176d8e9171ec"
    sha256 big_sur:        "e58bbbdad2e72611dd20dd334178066182298531041f0d48c5d31f9ff8583812"
    sha256 catalina:       "19cff82d601ab1b2ae54f16706dd0e81f1c85c4facc752afe8afa9a9a20b86ae"
    sha256 x86_64_linux:   "575d679a701bc2255e511318c0bec1c7099ca836d9b89b31f49a2c90e886b2d9"
  end

  depends_on "berkeley-db@5"
  depends_on "gd"
  depends_on "libpng"

brew install

保存してエディタを抜けると HOMEBREW_NO_INSTALL_FROM_API がセットされていない、と警告が出る。

EDITOR=vi brew edit webalizer
Warning: `brew install` ignores locally edited casks and formulae if
HOMEBREW_NO_INSTALL_FROM_API is not set.
Editing /opt/homebrew/Library/Taps/homebrew/homebrew-core/Formula/w/webalizer.rb

システムワイドで環境変数を追加せずとも、 brew isntall 時にこれを付与してやればよいので、以下のようにする。

HOMEBREW_NO_INSTALL_FROM_API=1 brew install webalizer
==> Downloading https://ghcr.io/v2/homebrew/core/webalizer/manifests/2.23-08_3
############################################################################################################################################################## 100.0%
==> Fetching dependencies for webalizer: berkeley-db@5
==> Downloading https://ghcr.io/v2/homebrew/core/berkeley-db/5/manifests/5.3.28_1
############################################################################################################################################################## 100.0%
==> Fetching berkeley-db@5
==> Downloading https://ghcr.io/v2/homebrew/core/berkeley-db/5/blobs/sha256:65a70e28dcf089e0ec6d247c32df257c8bc2532ece6f4c447200a48e7ad17a8d
############################################################################################################################################################## 100.0%
==> Fetching webalizer
==> Downloading https://ghcr.io/v2/homebrew/core/webalizer/blobs/sha256:f26eca3adbd5012374dcf7fba0940ba0fad5522292a5add43ce5e8ae9cfd1bb1
############################################################################################################################################################## 100.0%
==> Installing dependencies for webalizer: berkeley-db@5
==> Installing webalizer dependency: berkeley-db@5
==> Downloading https://ghcr.io/v2/homebrew/core/berkeley-db/5/manifests/5.3.28_1
Already downloaded: /Users/donbulinux/Library/Caches/Homebrew/downloads/17e4e0def00184b561c8a490b5c0813a7c4f5e1365eb2e927570786eb4e05e09--berkeley-db@5-5.3.28_1.bottle_manifest.json
==> Pouring berkeley-db@5--5.3.28_1.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/berkeley-db@5/5.3.28_1: 5,271 files, 86.3MB
==> Installing webalizer
==> Pouring webalizer--2.23-08_3.arm64_ventura.bottle.tar.gz
🍺  /opt/homebrew/Cellar/webalizer/2.23-08_3: 13 files, 512.9KB
==> Running `brew cleanup webalizer`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).

はいった。 あとは以下のように usage に従って整えて実行しましょう。

www.robata.org

❯ webalizer -n example.com -o ~/Workspace/tmp/nginx_log-events-viewer-result_20240119/ /Users/donbulinux/Downloads/nginx_log-events-viewer-result_20240119.csv

ちなみに webalizer はホスト名を uname -a とかで実行した環境から取ってくるはずなので、ログ生成元と出力先が異なる場合は、 -n でホスト名を指定しておかないとなんか、なんか……!となります。

お気をつけください。

備考 (正直よくわからん

You don’t have to submit modifications back to homebrew/core, just edit the formula to what you personally need and brew install . As a bonus, brew update will merge your changes with upstream so you can still keep the formula up-to-date with your personal modifications! 変更を homebrew/core に送信する必要はありません。式を個人的に必要なものに編集して、brew install を実行するだけです。おまけに、brew update は変更をアップストリームにマージするので、個人的な変更を加えても式を最新の状態に保つことができます。

Note that if you are editing a core formula or cask you must set HOMEBREW_NO_INSTALL_FROM_API=1 before using brew install or brew update otherwise they will ignore your local changes and default to the API. コアフォーミュラまたはカスクを編集している場合は、brew install または brew update を使用する前に HOMEBREW_NO_INSTALL_FROM_API=1 に設定する必要があることに注意してください。そうしないと、ローカルの変更が無視され、デフォルトの API が使用されます。

To undo all changes you have made to any of Homebrew’s repositories, run brew update-reset. It will revert to the upstream state on all Homebrew’s repositories. Homebrew のリポジトリに加えたすべての変更を元に戻すには、brew update-reset を実行します。すべての Homebrew リポジトリで上流の状態に戻ります。

上記で書いてあるとおりなんだけど、 you must set HOMEBREW_NO_INSTALL_FROM_API=1 before using brew install or brew update とのことで、 edit した formula が存在する環境はそれ以降、何をするにしても HOMEBREW_NO_INSTALL_FROM_API=1 が有効じゃないと、編集した formula になにか影響出るのかな、と思っていたのだけど、その後試した感じ一度インストールしたら他の formula や brew update しても影響はないようだった。

おそらく edit した対象の formula (今回は webalizer) になにか変更があったら、 HOMEBREW_NO_INSTALL_FROM_API=1 してないと影響が出る? みたいな事なんじゃないかと思うんだけど、個人的には「とりあえず利用できればいい」という感じなのでこれでいい。 壊れたらまた調べるか、諦めて Docker で環境作るわという気持ち。

まずこれが brew のお作法に則っているのかもわからん。 brew のドキュメント記述あるのはいいんだけど、具体的な usage がわからねえんだよな。

これも DISABLE_FORMULA=1 みたいな感じの環境変数で有効化無効化スイッチする、みたいな感じじゃないので、面倒そうな歴史的経緯ありそうだなあ、などと思ったのでした。