Shogo's Blog

Dec 11, 2021 - 4 minute read - aws go golang time

AWS ClockBound で遊んでみた

この記事は、フラー株式会社 Advent Calendar 2021 の11日目の記事です。 10日目は @nobux42 で「再読:リファクタリング・ウェットウェア」でした。 もう一ヶ月前になりますが、AWS から ClockBound という時間を扱うとても 地味な 有益なソフトウェアがリリースされました。 Amazon Time Sync Service now makes it easier to generate and compare timestamps 地味過ぎてネタかぶりしなさそうなので 時間は現代の情報通信の基盤なので、しっかりと検証していきましょう! 日本ではNICTの 時空標準研究室 が標準時を定めています。 名前からしてかっこいい。 ClockBound とは 一言でいうとGoogleの TrueTime のAWS版です。 TrueTime は Google が自社のサーバーセンターに設置している非常に正確な時計です。 Google が提供しているリレーショナルデータベースである Cloud Spanner は、 リージョンをまたいだ一貫性を保証するために TrueTime から生成されたタイムスタンプを利用しています。 ようするに ClockBound を使えば、 AWSのインフラ上に Google Cloud Spanner Clone を構築できる!(?)、というわけですね。 すごい! ClockBoundD のインストール なんかすごそうなことがわかったので、とりあえず動かしてみましょう。 ClockBound はタイムスタンプを提供するデーモン「ClockBoundD」と、ClockBoundD からタイムスタンプを取得するためのライブラリ「ClockBoundC」に分かれています。 タイムスタンプの提供元がないと始まらないので、まずは ClockBoundD をインストールしていきましょう。 現時点(2021-12-11現在)ではビルド済みのバイナリは提供されていないようなので、ソースコードからビルドします。 READMEの手順にしたがってやっていきます。

Dec 10, 2021 - 3 minute read - perl

Perl 5.35.4 の defer を先取り

この記事は、Perl Advent Calendar 2021 の10日目の記事です。 9日目は @shogo82148 で「Perl 5.34.0 の try-catch を触ってみる」でした。 アドベントカレンダー25日もあると疲れてくるので、今日もかる~く行きましょう。 Perl 5.35.4 から利用可能になった defer 構文を触ってみたというお話です。 defer 構文は安定版にはまだ取り込まれていません。 特に断りのない限り 2021-12-10 現在の最新開発版 Perl 5.35.6 で動作確認をしています。 まずは Perl 5.35.6 をビルドする Perl 5.35.6 は開発版なのでビルド済みのバイナリは配布されていません。 しかし plenv を使っていれば特に難しいことはありません。 注意点は開発版の警告を抑制するために -Dusedevel オプションをしていることくらいです。 plenv install 5.35.6 -Dusedevel plenv local 5.35.6 defer を使ってみる 使い方はいつものように use feature プラグマで有効化し、 defer BLOCK とするだけ。 use strict; use warnings; use feature 'say'; use feature 'defer'; { say "This happens first"; defer { say "This happens last"; } say "And this happens inbetween"; } 1; 出力:

Dec 9, 2021 - 4 minute read - perl

Perl 5.34.0 の try-catch を触ってみる

この記事は、Perl Advent Calendar 2021 の9日目の記事です。 8日目は @doikoji で「Getopt::Longのスペルが覚えられない俺はとうとう覚える努力を放棄してラッパーを作った」でした。 アドベントカレンダー25日もあると疲れてくるので、今日はかる~く行きましょう。 Perl 5.34.0 から利用可能になった try-catch 構文を触ってみたというお話です。 特に断りのない限り 2021-12-09 現在の最新安定版 Perl 5.34.0 で動作確認をしています。 とりあえず使ってみる 使い方は簡単です。 use feature プラグマで有効化し、 try BLOCK catch (VAR) BLOCK とするだけ。 最初の try ブロックの中で die すると catch ブロックが実行されます。 use strict; use warnings; use feature qw(try); try { die "dead"; } catch($e) { print "catch: $e"; } # no more ";" here !!! 1; 出力: try/catch is experimental at try-catch.pl line 5.

Nov 29, 2021 - 2 minute read - github

GitHub GraphQL のノードIDフォーマットが変わるらしい

弊社では Terraform GitHub Provider を使って GitHub のレポジトリ管理・権限管理などを行っているのですが、 プロバイダーが repository_id を認識してくれない問題に遭遇しました。 原因を探ってみると GitHub GraphQL API に かなり大きな変更が入ること を知ったので、メモとして残しておきます。 グローバルノードID GraphQL API から扱えるすべてのオブジェクト (レポジトリ、ユーザー、etc) にはIDが振ってあります。 Using global node IDs 例えば僕 (@shogo82148) のノードIDは MDQ6VXNlcjExNTczNDQ= です。 $ curl https://api.github.com/users/shogo82148 | jq .node_id "MDQ6VXNlcjExNTczNDQ=" このノードIDを使って GraphQL のクエリを書くことが出来ます。 $ gh api graphql -f query='query { node(id: "MDQ6VXNlcjExNTczNDQ=") { ... on User { name login } } }' { "data": { "node": { "name": "Ichinose Shogo", "login": "shogo82148" } } } ノードIDにはオブジェクトの種類の情報 (MDQ6VXNlcjExNTczNDQ= の例では「ユーザー」) も含まれているので、 GitHub が管理している全オブジェクトの中から一意に目的のノードを特定することが出来ます。

Oct 14, 2021 - 5 minute read - perl

Perl の JSON::PP での数値の扱いが変わっていた件

Setup Perl environment の開発中は、 いろんなバージョンのPerlをビルドして、いろんなバージョンのPerlでコードを実行します。 そんな中でPerlのコアモジュールのひとつである JSON::PP の挙動が変わっていることに気が付きました。 なんでだろう?とずっと気になったまま放置してたんですが、ちょっと調べてみました。 JSON::PP の挙動の変化 Perl 5.26 と Perl 5.28 で以下のコードを実行してみます。 use feature say; use JSON::PP qw/encode_json/; my $answer = 42; say encode_json({ answer => $answer }); say "Answer to the Ultimate Question of Life, the Universe, and Everything: $answer"; say encode_json({ answer => $answer }); Perl 5.26 で実行した場合: [Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ https://wandbox.org/permlink/tEJxPrlX8oaMbj6o {"answer":42} Answer to the Ultimate Question of Life, the Universe, and Everything: 42 {"answer":"42"} Perl 5.

Oct 6, 2021 - 1 minute read - aws perl

AWS Lambda Perl Runtime の Arm64 互換レイヤーを公開しました

AWS Lambda の Arm64 対応試してみた の続き。 Achieve up to 34% better price/performance with AWS Lambda Functions powered by AWS Graviton2 processor 前回は クロスコンパイルが簡単な Go で試してみました。 でもやっぱり・・・皆さん Perl を動かしたいですよね? というわけでご用意しました。 ARN 一覧 ランタイム本体 ランタイム本体のビルド済みレイヤーです。使い方は過去記事をどうぞ。 AWS LambdaでCGIを蘇らせる arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:us-east-1:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:us-east-2:445285296882:layer:perl-5-32-runtime-al2-arm64:1 arn:aws:lambda:us-west-2:445285296882:layer:perl-5-32-runtime-al2-arm64:1 Paws AWS SDK for Perl のビルド済みレイヤーです。ランタイム本体と合わせてご使用ください。 AWS SDK for Perl Lambda Layerを公開しました arn:aws:lambda:ap-northeast-1:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:ap-south-1:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:ap-southeast-1:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:ap-southeast-2:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:eu-central-1:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:eu-west-1:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:eu-west-2:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:us-east-1:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:us-east-2:445285296882:layer:perl-5-34-paws-al2-arm64:1 arn:aws:lambda:us-west-2:445285296882:layer:perl-5-34-paws-al2-arm64:1 x86_64 レイヤー レイヤーの名前にCPUアーキテクチャーが入るようになったので、 わかりやすいよう x86_64 のレイヤー名も変更しました。 もちろん今までのレイヤー名でも同じものが利用可能です。

Oct 1, 2021 - 2 minute read - aws

AWS Lambda の Arm64 対応試してみた

AWS Lambda の ARM サポートが発表されましたね。 Achieve up to 34% better price/performance with AWS Lambda Functions powered by AWS Graviton2 processor というわけで早速触ってみました。 祝日 API で試してみる 先日公開した祝日API で試してみました。 https://github.com/shogo82148/holidays-jp/pull/22 変更は実質2行です。簡単ですね! diff --git a/holidays-api/Makefile b/holidays-api/Makefile index a39a3fa..0908902 100644 --- a/holidays-api/Makefile +++ b/holidays-api/Makefile @@ -1,6 +1,6 @@ .PHONY: build-HolidaysFunction build-HolidaysFunction: - GOOS=linux GOARCH=amd64 go build -o $(ARTIFACTS_DIR)/bootstrap -tags lambda.norpc ./cmd/bootstrap + GOOS=linux GOARCH=arm64 go build -o $(ARTIFACTS_DIR)/bootstrap -tags lambda.norpc ./cmd/bootstrap .PHONY: test test: diff --git a/template.

Sep 24, 2021 - 3 minute read - aws github

GitHub Actions + OIDC Token の情報をAWSのセッションタグに設定してみた

GitHub Actions で ID Token が使えるようになったと話題ですね。 うおー!サイコー!!!!! https://t.co/2stS4miUOD — Tori Hara (@toricls) September 15, 2021 Ok I blogged about it. That's how excited I am. 1. Deploy this CFN template 2. Write this GHA workflow 3. Never worry about IAM users again https://t.co/KJrr2Jw4bE pic.twitter.com/9IcocgurxP — Aidan W Steele (@__steele) September 15, 2021 AWS IAM が OpenID Connect (OIDC) を使った認証 (sts:AssumeRoleWithWebIdentity) に対応しているので、認証プロバイダ(IdP)を用意してあげればシークレットの登録が不要になるということらしいです。 これは便利! セッションタグを渡したい これはまさに「AWS_SECRET_ACCESS_KEY を GitHub Actions secrets へ突っ込むのに疲れた俺達は」で実現したかったことですね。 このままだとせっかく作ったアクションが不要になりそうで悔しいので このアクションにずっと追加したかった機能があるのですが、OIDCトークンを使うと簡単に実装できそうだったので、お試しで追加してみました。

Sep 4, 2021 - 2 minute read - aws github

祝日APIを公開しました

プログラマーなら誰しも一度は祝日について頭を悩ませたことがあるでしょう(要出典)。 日付が固定ならまだ楽なんですが、「春分の日」「秋分の日」のように天体の運行によって決まる祝日があったり、 ハッピーマンデー制度によって「成人の日(一月の第二月曜日)」のような曜日固定の祝日があったり、 振替休日という概念があったりと、ちゃんと考えるとかなり面倒です。 更に面倒なのが国の施策によってたまに変更になるという点です。 東京オリンピックの延期で祝日が移動したのは記憶に新しいですね。 前年の 12 月 4 日に法律が公布されるという、カレンダーの印刷会社泣かせなスケジュール変更です。 2021 年の祝日移動について 東京五輪開催で夏の祝日が移動 〜各言語の祝日ライブラリの 2021 年の祝日対応を追ってみる〜 プログラムなら更新可能ですが、ライブラリとして組み込まれているとうっかり更新を忘れてしまうこともありますよね。 そういうわけで API として提供されていると嬉しいな、プログラミング言語に縛られることもないし、ということで作りました。 github.com/shogo82148/holidays-jp holidays-jp.shogo82148.com 使い方 パスに日付を入力して GET リクエストを投げるだけのシンプルな API です。 ある年の祝日一覧を取得する GET /{year} で year の祝日一覧を返します。 以下は 2021 年の祝日一覧を返す例です。 curl https://holidays-jp.shogo82148.com/2021 | jq . { "holidays": [ { "date": "2021-01-01", "name": "元日" }, { "date": "2021-01-11", "name": "成人の日" }, { "date": "2021-02-11", "name": "建国記念の日" }, (snip) { "date": "2021-11-23", "name": "勤労感謝の日" } ] } ある月の祝日一覧を取得する GET /{year}/{month} で月の祝日一覧を返します。 以下は 2021 年 1 月の祝日一覧を返す例です。

Aug 30, 2021 - 2 minute read - aws

EC2 Instance Metadata Service と Amazon Time Sync Service で IPv6 エンドポイントが利用可能になりました

今日はちょっとした小ネタを dependabot が作ったプルリクエストを整理していたら AWS Go SDK のリリースノートに面白そうなリリースを発見。 Release v1.40.0 (2021-07-14) aws/session: Support has been added for EC2 IPv6-enabled Instance Metadata Service Endpoints (#4006) こんなところにも IPv6 の波が! 早速試してみようと思ったんですが、なかなかうまく行かない。 今日ようやくやり方がわかったのでメモしておきます。 インスタンスメタデータ IPv6 エンドポイントを有効化する リリースのアナウンスによるとインスタンスメタデータサービス(IMDS)の IPv6 エンドポイントは明示的に有効化する必要があるそうです。 IPv6 endpoints are now available for the Amazon EC2 Instance Metadata Service, Amazon Time Sync Service, and Amazon VPC DNS Server To get started, you need to enable the IPv6 endpoint for IMDS on your EC2 Instances.