Terraformのjsonencode関数が特殊文字をエスケーする問題と回避策

Terraformのjsonencode関数でjson文字列を生成するとき、 < > & U+2028 U+2029 はエスケープされる。 developer.hashicorp.com このため、例えば aws_cloudwatch_event_target の input_transformerを用いて送信メッセージをカスタマイズしたい場合に < > を…

SourceOrgIDとPrincipalOrgIDでOrganiations環境下のアクセス制御を実現する

AWS

導入: リソースベースポリシーとプリンシパル AWSにおいてアクセス元を識別するための仕組みとしてプリンシパルがある。 IAMポリシーにおいてリソースベースのポリシーを定義するとき、さまざまな種類のプリンシパルから指定することができる。 docs.aws.ama…

Principalsに指定したIAMユーザを削除するとS3バケットポリシーが変化する

AWS

まさにこれに遭遇した。 dev.classmethod.jp S3バケットポリシーにIAMユーザのアクセス許可を付与していた。 IAMユーザを削除したが、S3バケットポリシーの修正もれが生じていた。 S3バケットポリシーはterraformで管理していたが、IAMユーザの指定ではIAMユ…

GitHub Composite Actionsではboolean inputsがstringとして扱われる

Composite Actions概要 GitHub Actionsにて複数のworkflowから利用できるactionsとしてComposite Actions (日本語では複合アクション)を作成できる。 Composite Actionsを作成すれば、複数のworkflowから参照することもできるし、複数リポジトリで共有するこ…

論理属性をVueでバインディングする

<button type="button" disabled>送信</button> のように、disabled属性をVueで制御したい。 これを実現するには以下のようにv-bindを利用する <script setup lang="ts"> import {ref} from "vue"; const isButtonDisabled = ref(true); </script> <template> <button v-bind:disabled="isButtonDisabled">Button</button> </template> これにより、isButtonDisabled がt…

Nuxtにおけるルーティング設定とCatch-all Route

Nuxtのpagesやserverではfile-system routingを採用しており、URLの構造のソースコードのディレクトリ構造を一致させることができる。 nuxt.com nuxt.com serverのディレクトリなどにおいて、リクエストパスがいずれのルーティング設定とも一致しない場合の…

Nuxt/TypeScriptにおけるパスエイリアス

TypeScriptにおいて import { NuxtAuthHandler } from "#auth"; のようなインポート文を見かけることがある。この#authのような例をパスエイリアスと呼ぶ。 パスエイリアスを利用することで、相対パスでコンポーネントを指定する場合に比べてディレクトリ構…

GitHub Actionsでmatrixの実行結果(outputs)を取得する

GitHub ActionsにおいてMatrix Jobを実行した結果(outputs)を参照したい。 2024年1月の仕様では、最後に実行したジョブの結果で上書きされるので、ジョブによって結果が異なる場合にそれぞれの値を取得することができない。 これは以下のコミュニティディス…

GitHubでOrganization Environmentsが欲しい

GitHub Organization下の複数リポジトリにてクレデンシャルを共有したいケースがよくある。 このような場合にはOrganization SecretsやOrganization Variableが便利。 docs.github.com これはこれで良いのだけれど、GitHub Environmentsを利用するようになる…

AWS lambdaのNode.jsを18にアップデートする

AWS LambdaのNode.js 16ランタイムは 2024年6月に廃止がアナウンスされている。 (Node.js 16 LTS自体は公式には2023年11月にEOLを迎えている)。 できるだけ早めに Node.js 18 or 20にアプデートしたい。 docs.aws.amazon.com AWS Lambda固有の事情として、No…

エクスポートを利用するためにJavaScriptモジュールとして宣言する

JavaScriptには他のファイルで定義されたリソースを利用するための仕組みとして import/exportがある。 exportを利用するためには、ソースファイルがモジュールである必要がある。 ソースファイルで export 宣言を使用するためには、そのファイルはランタイ…

GitHub Environmentsで設定した変数を参照する。

GitHub Environmentsにはシークレットと変数が設定できて、それぞれ secretsおよびvarsコンテキストを用いて参照する。 例えばシークレットとしてTOKENを設定していれば ${{ secrets.TOKEN }} で、変数として RAILS_ENVを設定していれば ${{ vars.RAILS_ENV …

GitHub Actionsで条件に応じて値を設定する

GitHub Actionsで条件に応じて変数に値を設定したい。 例えばmainブランチを対象とする場合はenvironmentにproductionを、それ以外のブランチを対象とする場合はdevelopmentを設定したい。 このようなケースでは三項演算子が利用できる。 docs.github.com こ…

AWS LambdaのCloudTrailイベント名はAPI名と一致しない場合がある

AWS

AWS のCloudTrailログにおいてイベント名は基本的にAPI名と一致する。 例えば、S3に関するCloudTrailログであればイベント名は ListBucketsやGetBucketAclなど。 これはAWSドキュメントのAPI Referenceなどに記載の名前と一致する。 docs.aws.amazon.com 一…

AWS LambdaのGoランタイムを provided.al2023にアップデートする

AWS Lambdaの go1.xランタイムのサポートが切れるのでアップデートする。 aws.amazon.com provided.al2023の選択 ランタイムアップデートについてはAWS LambdaのGo言語向けドキュメントにまとまっている。 以下以外のドキュメントでは Amazon Linux 2023 (pr…

ansibleで繰り返し処理にはloopディレクティブを利用する

ansibleで繰り返し処理を実装する場合は with_XXX系ディレクティブをよく利用していた。 特によく利用するのが with_items で、単純な繰り返し処理には with_itemsで対応することが多かった。 ansible 2.5以降では新しく loopディレクティブが導入された。 l…

github actionsは必須入力を指定しなくてもエラーにならない

github actionsのinputにはrequiredというパラメータがある。 これにより、対象のinuptが必須なのかオプションなのかを区別することができる。 docs.github.com しかし、required: trueに指定したinputが指定されなかったからといってエラーになるわけではな…

fine-grained personal access tokenは単一のユーザor組織のリソースにしかアクセスできない

GitHubの Fine-grained personal access tokenは personal access token(classic)に比べて細かく権限を制御できるだけでなく、対象のResource ownerを1つ指定する必要がある。 所属する組織をResource ownerに指定するには、対象組織がpersonal access token…

Step Functionsでリドライブすると旧リビジョンで動作する

AWS

Step Functionsにはリビジョン・バージョン・エイリアスの概念がある。 単にStep Functionsを更新するとリビジョンが更新されるが、特定のリビジョンにバージョンやエイリアスを発行することもできる。 docs.aws.amazon.com (公式ドキュメントより) Step Fun…

flake8の設定ファイルは .flake8 に記述する

Pythonのビルドまわりの設定はpyproject.tomlに記述することが一般的である。 これはPEP518によって定められている。 一方で、すべてのツールがpyproject.tomlをサポートしているわけではなく、静的解析ツールである flake8 などは pyproject.tomlをサポート…

GitHub Actionsのworkflow_dispatchでさまざまな入力タイプを利用する

GitHub Actionsを手動で実行する workflow_dispatch にはさまざなま入力を指定できる。 input のcontextには string or number or boolean or choice とあり、例としてstring, number, booleanの場合が記載されている。 docs.github.com 実は、 on.workflow_…

mount=type=secretはビルド時にファイルマウントされる

docker build時にクレデンシャルを利用したい場合は --mount=type=secretを利用する。 これによりクレデンシャル情報がdockerイメージ内に保存されることを避けることができる。 docs.docker.com # syntax=docker/dockerfile:1 FROM node:alpine RUN --mount…

pathlibのstemで拡張子を除くファイル名を取得する

ファイルパスが与えられたときに拡張子を除くファイル名を取得したいときがある。 今までは os.path のbasenameおよびsplitextを用いて取得していた。 import os file = os.path.basename("/path/to/file.txt") base = os.path.splitext(file) print(base[0]…

emacsにlsp-pyrightを導入する

emacsのPython LSPとしてlsp-pyrightを導入する。 まず事前にpyrightをインストールする。 ドキュメントにある通り、pyrightはnpmで提供されているので npm insatll -g pyright でインストールする。 elispの設定はuse-packageを利用するのであれば公式READM…

global .gitignore と global .dockerignore

.gitignoreにはグローバル設定があり、各リポジトリの.gitignoreだけでなくアカウント別の共通設定が指定できる。 global .gitignoreは ~/.config/git/ignore に設定する。 git-scm.com zenn.dev 一方で、.dockerignoreにはグローバル設定はなく、プロジェク…

ECS fargateでログドライバにawslogsを利用するときはprefixを指定する

AWS

ECS fargateのログドライバでawslogsを利用するとき、awslogs-groupおよびawslogs-stream-prefixを指定する必要がある。 特にawslogs-stream-prefixはECS on EC2の場合は任意だが、ECS on fargateの場合は必須になるので注意が必要。 docs.aws.amazon.com ま…

keyringの配置場所

apt-keyは廃止となった。 今後は apt-key addの替わりにkeyringを保存してsigned-byで指定する。 gihyo.jp www.clear-code.com このとき、keyringをどこに保存するべきか。 アクセス権限が適切に設定されていれば問題ないが、ソフトウェアによって /etc/apt/…

paths-filter で特定ディレクトリに変更があったときのみGitHub Actions job/stepを実行する

GitHub Actionsにはpathフィルタがあるので特定ディレクトリ以下に変更が生じたときのみworkflowを起動することができる。 ignore条件で変更がなければworkflowを起動しないこともできる。 docs.github.com これらのpathフィルタはworkflowレベルでの条件指…

GitHub Deploymentのイベントをslack通知する

GitHub / Slack連携 SlackのGitHub AppにはDeploymentsの通知機能がある。 これを利用すればGitHub からのデプロイ結果をSlack通知できる。 GitHub 側に通知設定はなく、Slack側で /github subscribe owner/repo コマンドを実行して連携する。deploymentsは…

Go言語で呼び出す関数を変数で管理する

Go

Go言語で呼び出す関数を変数で管理して動的に切り替えたい。 いわゆる関数ポインタのような機能を利用したい。 stackoverflow.com 関数ポインタはないけれど、関数の型を定義すれば変数として扱える。 以下はStackOverflowで例示されていたコード package ma…