わたねこコーリング

野良プログラマ発、日々のアウトプット

【EventBridge スケジューラ】ラムダ関数のペイロードに呼び出し日時を含める


AWS EventBridge スケジューラからラムダ関数を実行する際に、ペイロード(ラムダ関数へのパラメータ)に呼び出し時の日時を混ぜるにはどうしたら良いか、という小ネタでつ。

EventBridge スケジューラ設定で、ペイロードを設定しない場合はラムダ関数の event パラメータに以下のような内容が渡されるようです。

{
    "version": "0",
    "id": "d7668f47-e0a0-4cc5-bc56-45942a2a12bc",
    "detail-type": "Scheduled Event",
    "source": "aws.scheduler",
    "account": "999999999999",
    "time": "2024-07-11T02:48:00Z",
    "region": "ap-northeast-1",
    "resources": [
        "arn:aws:scheduler:ap-northeast-1:999999999999:schedule/default/my-schedule"
    ],
    "detail": "{}"
}

これが、自分で

{
    "my-parameter": "foo"
}

のようにペイロードを指定するとキレイさっぱり無くなってしまうのですな。ラムダ関数で現在日時に応じた処理をしたい場合に不便です。プログラム内でシステム時計から取得するのはテストや運用で不便なのでイヤだし。EventBridge ルールのほうでは入力変換という動的パラメータを生成する機能があるのですが、スケジューラではこれが使えない模様。

さてどうしたら良いのかと悩んでたらここに答えがありました。

docs.aws.amazon.com

つまり、スケジューラ ARN・呼び出し日時・呼び出し ID・試行回数に限ってはペイロードに動的に含めることができる訳ですな。呼び出し日時が欲しければ、

{
    "my-parameter": "foo",
    "time": "<aws.scheduler.scheduled-time>"
}

のようにすれば良いと。何だか統一性の無いソリューションかなーという印象ですが、とりあえず問題は解決しますた。

2024年第2四半期 プライムビデオで観た音楽系コンテンツ

連休以降、仕事がめっちゃ忙しくて気づいたら今年も既に折り返しに。そんな訳で今回は3作品だけど、ネタバレ御免な音楽系コンテンツの寸評まとめです。

マルクス兄弟オペラの夜(字幕版)

クイーン中期の名盤「A Night at the Opera(邦題:オペラ座の夜)」「A Day at the Races(邦題:華麗なるレース)」は、それぞれタイトルを喜劇役者であるマルクス・ブラザースの作品から拝借していることは、ファンには良く知られている話です。かれこれ50年くらいファンをやってる自分ですが、両作品を未だ観てなかったのでアマプラで鑑賞してみたら、これがなかなか素晴らしい「音楽系コンテンツ」でした。調べてみると、3人とも楽器演奏に長けていて当初は音楽を主軸にした作品を作っていたとのこと。本作も中盤の船上パーティーで、チコとハーポが曲芸的に素晴らしいピアノやハープの演奏を披露するシーンが圧巻という他ありません。

マルクス一番乗り(字幕版)

前者「オペラ」は1936年の作品でしたが、本作もその流れを汲んだような翌年のヒット作。若いヒロインとその恋人とパトロン的なマダム達、彼らに悪事を企む一味を、口八丁な詐欺師な役割のグルーチョ・ドジでマヌケで陽気な唖者のハーポと彼の手綱を引いて上手く立ち回ろうとするチコの3人がドタバタ引っ掻き回すという構成は、前作そのままです。音楽シーンも前作同様、チコとハーポがピアノとハープを自在に操る超絶技巧シーンに加え、大勢の黒人エキストラをパーポがホイッスルを吹きながら扇動してブギを歌い踊るシーンが追加され、さらに観(聴き)ごたえがパワーアップ。いやー、この2本はもっと早く観ておくんだった…

響け!ユーフォニアム シーズン1 [全13話]

そこそこ技術も熱意もあるけど今ひとつ音楽に打ち込めないユーフォニアム吹き少女が、進学した高校でガチな顧問にアテられて全国大会を目指すお話。部員がやたら女子だらけでキャピキャピな雰囲気とか、そこで波立つ煩雑な人間関係あたりで疲れてしまい、おっさんにはつらぽよな時間ですた。ユーフォニアムというマイナーな楽器に興味を持たせ、掘り下げてみようという気にさせるエピソードがもっとあるとイイのになぁ。

【Vue.js】Bootstrap Collapse をアクセシビリティ属性を使わずに開閉する

Bootstrap5 を使った既存サイトページをデザインおよびルック&フィールはそのまま Vue.js 化する案件で、Collapse (ブロック要素をアニメーション付きで表示・非表示させるコンポーネント)を Vue 側に引き寄せて使った話です。

Bootstrap (以下 BS)の動的機能をもったコンポーネントは、動作の制御に関連する HTML タグに data-bs-xxx というようなアクセシビリティ属性を付与しておけば JavaScript コードを書かなくても(あるいは最小限のコードで)動作させることができます。それに ver.5 からは jQuery 非依存になったので、従来の JS コードを Vue.js のそれと共存させても問題は無さそうだったのですが、やっぱり制御機構がブラックボックス状態なのは気持ち悪いし小回りも効かないので、アクセシビリティ属性は一切使わずに Vue.js コード内から表示・非表示を行うように書き換えました。

コードサンプルはこちらです。


See the Pen
Bootstrap.Collapse on Vue3
by まりゆどぅ (@Mariyudu)
on CodePen.

と言っても、ドキュメントにも明記されている純正の API を使っただけで、特別なことはしていません。ポイントがあるとしたら、bootstrap.Collapse オブジェクトの生成は Vue のライフサイクルフック onMounted() で行うことくらいでしょうか。例1では toggle メソッドで、例2では show / hide メソッドでそれぞれ開閉を行っています。

【AWS】ラムダ関数削除で取り残された IAM ロールとポリシーを整理する

ラムダ関数をコンソールから生成すると、特に明示しない限り、勝手に実行ロールおよびポリシーが生成されます。この関数をまたコンソールから削除すると、ロールとポリシーは残ったまま取り残されるので、ちょっとした実験やプロトタイピングでコンソールからラムダ関数の生成・削除を繰り返していると、どんどん由来不明なロール・ポリシーが溜まってつらぽよ… てのは AWS あるあるでは? その辺を AWS CLI で何とかしようという小ネタです。

まず、ラムダ関数削除から取り残された IAM ロールのリストアップ。aws iam list-roles でロール一覧を出力してみると、ラムダ関数に伴って生成されたロールは Roles[].AssumeRolePolicyDocument.Statement[].Principal.Service の値が "lambda.amazonaws.com" になっているようです。なので、

aws iam list-roles --query 'Roles[?AssumeRolePolicyDocument.Statement[0].Principal.Service==`lambda.amazonaws.com`].Arn'

とフィルタリングすればラムダ関数生成由来のロール ARN 一覧がゲットできそう。あとは、それぞれについて、ラムダ関数が未だ存在しているか調べて、孤児状態ならアタッチされたポリシーも添えて出力するようにしたのが、下記スクリプト(bash)です。

IAM_ROLE_ARNS=$(aws iam list-roles --query 'Roles[?AssumeRolePolicyDocument.Statement[0].Principal.Service==`lambda.amazonaws.com`].Arn' --output text)

for ROLE_ARN in ${IAM_ROLE_ARNS}; do
  LAMBDA_NAME=$(aws lambda list-functions --query 'Functions[?Role==`'${ROLE_ARN}'`].FunctionName' --output text)
  if [ -n "${LAMBDA_NAME}" ]; then
    continue
  fi
  ROLE_NAME=$(basename ${ROLE_ARN})
  ROLE_DATE=$(aws iam get-role --role-name ${ROLE_NAME} --query 'Role.CreateDate' --output text)
  echo -e "${ROLE_NAME}\t${ROLE_DATE}"
  POLICIE_ARNS=$(aws iam list-attached-role-policies --role-name ${ROLE_NAME} --query 'AttachedPolicies[].PolicyArn' --output text)
  for POLICIE_ARN in ${POLICIE_ARNS}; do
    echo -e "\t$(aws iam get-policy --policy-arn ${POLICIE_ARN} --query 'Policy.[PolicyName,CreateDate]' --output text)"
  done
done

この出力書式は、タブ区切りテキストで

<ロール1の名前> <生成日時>
 <ロール1にアタッチされたポリシー1の名前> <生成日時>
 <ロール1にアタッチされたポリシー2の名前> <生成日時>
<ロール2の名前> <生成日時>
 <ロール2にアタッチされたポリシー1の名前> <生成日時>
 <ロール2にアタッチされたポリシー2の名前> <生成日時>
...

という感じです。事前に作っておいたロール・ポリシーをラムダ関数に紐づけた可能性も排除できないので、削除処理までは組み込んでいません。が、ラムダ関数生成由来のロールは <関数名>-role-<8桁くらいのランダム英数字文字列>、アタッチされたポリシーは AWSLambdaBasicExecutionRole-<UUID> という命名がされているようなので、リストから名前と生成日時をチェックすれば、削除して良いかどうかだいたい判断できるんじゃないでしょうか。少なくとも IAM コンソールでロール・ポリシーの一覧とにらめっこして、「これ、何処で使ってるんだっけ?」という状態は解消できるかな、と。

【Python】streamlit 沼ハマり記・序章

連休のB面、いかがお過ごしでしょうか。諸般の事情で外出もままならない故、積ん読消化を決め込んでいる野良プログラマ Mariyudu です。

…の筈だったんですが、一昨日 streamlit という Python 製のウェブアプリ開発支援 F/W を知ってしまい、これが滅法面白そうなので読書も何もかもうっちゃってパソコンに向かっているうちに1日が暮れてしまいましたw その最中、こんなハンズオン記事を発見。

zenn.dev

streamlit は通常、データ分析のフィールドにおいて Jupyter Lab でプロトタイピングした(主にデータ可視化用の)コードを、不特定多数が利用できるウェブアプリとしてサクッと開発・デプロイできちゃうという文脈で紹介されがちで、巷で見られるサンプルもだいたいそんな感じです。しかしながら上記ハンズオンは、B2B サービスっぽいウェブアプリを streamlit で作り上げてしまうという所が毛色が独特で面白い。職業柄、自分にも馴染み深い方向性なので、streamlit の可能性を探る意味もあり、このハンズオンを試してみました。結果的に、ペライチなサンプルでは分からない複数ページの構成やセション管理の手法なんかも良く分かったので、有益な作業だったと思います。

ちょっと残念なのは、記事に併せて Github で提供されているコード一式に README の類が同梱されていないので、Python 開発に明るくない初心者にはどうやって動かしたら良いのか分かりづらいのでは、という点です。実際、自分も poetry を使ったことが無かったりで、少し手間取ってしまいました。という訳で、このリポジトリを手元の環境で動作させるまでを補完情報として提供するのが、本稿の主旨となります。

まずは手元のマシンにて、Github リポジトリを適当な場所に clone します。

git clone https://github.com/krkettle57/web-only-python.git
cd web-only-python

個人的に、開発マシンの環境はシンプルにしておきたいという理由から、何等かのプロダクトを試用する際は極力 Docker コンテナで済ませるようにしています。なので、本件もその流儀で。現時点での Python 最新安定版は 3.12 ですが、使用モジュールの後方互換性が損なわれていないかを警戒して、このハンズオンが書かれた時点のバージョン 3.9 (たぶん)を採用します。DockerHub の公式リポジトリにある python:3.9.19-slim-bookworm を使ってコンテナを起動し、bash でコンテナ内に入ります。

docker run -it --rm -v $(pwd):/app -p 8501:8501 python:3.9.19-slim-bookworm bash

Python モジュールインストール時に gcc 等が必要っぽいので、その環境をインストールしておきます。

apt-get update
apt-get install -y build-essential

アプリに必要なモジュールのインストール用に poetry を使えるようにします。

pip install poetry

アプリケーションディレクトリにて、pyproject.toml に定義されたモジュールをインストールします。

cd /app
poetry install

これで準備ができました。poetry でインストールしたモジュールを使って streamlit でアプリを起動します。

poetry run streamlit run main.py

ここで以下のような出力(IP アドレスはその都度変わる)があればアプリ起動は成功です。

  You can now view your Streamlit app in your browser.

  Network URL: http://172.24.0.2:8501
  External URL: http://14.9.81.64:8501

ブラウザにて http://localhost:8501 にアクセスして、アプリ画面(↓)が表示されるのを確認します。

さてこのハンズオン、アプリの設計がカナーリ「ちゃんとして」いて、その辺が手っ取り早く streamlit をマスターしたい向きにはまどろっこしく感じられるかもしれませんが、読んでおいて損は無いと思いますので頑張ってマスターして頂ければと。現場からは以上です。この後も引き続き streamlit の習得を続けます。

2024年第1四半期 プライムビデオで観た音楽系コンテンツ

2021年から始めたこのシリーズも4年目に。音楽系コンテンツなんてほんの一握りかと思ってたけどなかなかどうして、沢山あるものですな。今回もネタバレ御免でやって参ります。

エッシャー 視覚の魔術師(字幕版)

だまし絵等で有名なオランダの画家、マウリッツ・エッシャーの伝記ドキュメンタリー。それが何で音楽コンテンツかっていうと、'70年頃にポップカルチャー方面から人気・支持を得たということで、グラハム・ナッシュのインタビューから始まっているものでw けど、その後は普通に生い立ちから晩年までを追った構成。最後にポップカルチャーとの接点に戻るけど大した掘り下げも無く、エッシャー自身はポップアートとしての露出をむしろ迷惑がっていたというオチも。理系一家の出自ということで作品にも数学が応用されているのかと思ったけど、それほどでもなかったらしく、むしろ直感と情熱の人だったというのは意外。

BILLIE ビリー(字幕版)

ビリー・ホリデイの近親者や知人へのインタビューで構成された伝記ドキュメント。インタビュアーはリンダ・リプナック・キュールという、'70年代後半に不審死した社会派の女性ジャーナリスト。終始人種差別や公民権という視座から描かれているので、音楽的な側面は二の次という雰囲気でひたすら「差別と苦悩の人生」が強調されているよう。こういうの、少し窮屈かも。ホリディだけでなく、キュールのドキュメントという意味合いもありそう。

ジャズ・ロフト(字幕版)

1950年代後半、マンハッタンの古いビルに入り浸り創作の火を燃やし続けた写真家やジャズミュージシャン達のドキュメンタリー。大きく取り扱われているのは報道カメラマンとして名高いユージーン・スミスと、ズート・シムズ、モンクあたり。NYのトキワ荘というとちょっと違うかもだけど、熱かった時代と人々の様子が伝わってくる。やや焦点が散漫な気もするけど。

BLUE GIANT

現在も連載進行中の人気漫画が劇場版アニメに。第一部での上京以降を描いた立志伝中譚。いちおう原作は読んでたので、雪祈の事故までのストーリー進行には心が痛いっす。ところで楽器演奏シーンはモーションキャプチャーで製作してるらしい(クレジットにあった)けど、それにしてはヌルーっとしたコンピュータ臭さが見えてしまって、少し興醒めなのが残念。全体的には良い作品だと思いますが。

白い暴動(字幕版)

1970年代後半の英国に台頭した国民戦線(NF)による移民排斥へのアンチテーゼとして発生したロック・アゲンスト・レイシズム(RAR)と、その活動の集大成として催された音楽フェス・デモ大会(1978.4.30)を描いたドキュメンタリー。いっぽうの言い分だけを扇情的に切り取りってないか? という疑念はあるけど、ロンドン・パンクの背景としてあまり語られてこなかった部分なので、それを差し引いても興味深い。ボウイやクラプトンが NF 寄りな発言をしてたってのにも「へー」。でも音楽的映像は少なく、最後にスティール・パルスとトム・ロビンソン・バンド、シャム69のステージ演奏が少しあるだけでクラッシュに至ってはほぼ皆無なのが不満ですかね。

白い暴動(字幕版)

白い暴動(字幕版)

  • レッド・ソーンダズ
Amazon

CDN 版 Vue3 で問い合わせフォームのサンプル作った

先月書いた「petite-vue で問い合わせフォームを試作してみた」の外部仕様を流用して、Vue.js 3.4 (CDN 版)でも同じことをやってみたです。

Vue.js って、Options API で書くぶんには Vue CLI ベースでも CDN 版でもプログラムコードに大して違いは無いのですが、Composition API だとビミョーに違う書き方を要求されます。前回も書いたように個人的事情として、Vue CLI でガッツリ SPA を書くというよりは、既存サイト(往々にしてレガシー)の一部だけ U/I リッチなページを追加するというような泥臭い案件が多いので、所謂「ちょい足し」な Vue.js 開発時に「ここどう書くんだっけ?」と調べ直したりしなくて済むように、ボイラープレート的なものを身近を置いといたほうがイイな、と思った次第です。こちらからお試し頂けます。こんな U/I です。

「ちょい足し」と言っても、少し作り込むとコンポーネント分割したくなるので、それを想定したファイル構造になっています。テンプレートをバッククオートリテラルで JS コードと一体化させて SFC っぽくしてますが、CSS はどうにもならないのが「ちょい辛」ですね。何か裏技でも無いもんでしょうか。あと、CDN 版だと defineModel() が使えないらしく、v-model なコンポーネントを書くときにコードが煩雑になってしまうのもちょい辛でした。

コード一式は Github に置いてあります。

github.com