Shogo's Blog

Jan 2, 2022 - 5 minute read - aws

GitHub Actions を使って AWS SAM をデプロイしてみる

dependabot を使って 依存ライブラリの更新に追従しているのですが、 API のようなデプロイが必要なものは当然ながらデプロイしないと意味がありません。 今までは手元でデプロイしてきましたが、いい加減面倒になったので GitHub Actions を使った自動化をしてみました。 とりあえずお試しで shogo82148/holidays-jp にワークフローを設定してみました。 AWS SAM を使った API で、 データーベースや外部サービスとの連携のないシンプルなものです。 API 自体の使い方はこちらをどうぞ。 祝日 API を公開しました 単純にデプロイした場合の問題点 GitHub Actions の環境にはすでに AWS CLI, AWS SAM CLI, Go 等々ビルドに必要なものはすでにインストールされています。 あとは 「適切な権限を設定」 すればデプロイ自体は直ぐにできます。 ただまあ、この「適切な権限を設定」が一番の難所なので今まで二の足を踏んでいたわけです。 AWS SAM で作成した API は AWS Lambda によって実行されるのですが、 Lambda 関数に適切な権限を渡すために IAM Role を作成する必要があります。 つまり SAM アプリケーションのデプロイには「IAM を操作する権限」というかなり強力な権限を GitHub Actions に渡さなければなりません。 例えば GitHub Actions からデプロイ用 IAM ユーザーのアクセスキーが漏れたとしましょう。 IAM ユーザー自体の権限を最小限に絞っていたとしても、アクセスキーを入手した人は「IAM を操作する権限」を使って「AWS アカウントのすべての操作が可能な管理者ユーザー」を作ることができてしまいます。 いわゆる 権限昇格の脆弱性 です。 「管理者ユーザー」さえ作ってしまえば、EC2 のインスタンスを大量にたてて仮想通貨のマイニングをしたり、S3 から情報を抜き取ったりと、デプロイとは無関係のことも何でもできてしまいます。

Jan 2, 2022 - 3 minute read - perl

Perl の fc で遊んでみる

この記事は、Perl Advent Calendar 2021 の穴埋め用の予備記事です。 当日まで担当者が決まらない日が何日もあってドキドキしましたが、いやー、なんとか埋まりましたね。 記事を投稿してくださった皆様ありがとうございました。 さて、今年は万が一枠が埋まらなかった場合に備えて下準備をしておきました。 Perl 5.34.0 の try-catch を触ってみる Perl 5.35.4 の defer を先取り Perl 5.35.5 の iterating over multiple values at a time を先取り Perl の文字列用ビット操作演算子を使ってみる この辺の記事たちですね。 カレンダーが埋まる見込みが立ったので放置していたのですが、実は調査だけしていたネタがひとつ残っています。 2022年のネタにしても良いんですが、どうせその頃には忘れているので今ここで供養してしまいましょう。 というわけで、今回触ってみたのは fc 関数 です。 特に断りのない限り 2021-12-24 現在の最新安定版 Perl 5.34.0 で動作確認をしています。 Case-Folding fc 関数 は Case-Folding を行う関数です。 そもそも Case-Folding って何?って話なんですが、日本語に対応する概念が存在しないので和訳が難しい・・・。 大雑把にいうと 「大文字・小文字の正規化」 をおこなう関数です。 例えばこのブログから “Case-Folding” という文字列を検索したくなったとしましょう。 表記ゆれがあるかもしれないので、大文字と小文字の違いは無視したい、 つまり “case-folding” や “CASE-FOLDING” も対象にしたいということはよくあると思います。 こんなときこそ fc 関数の出番です。 fc 関数を使うには feature プラグマで明示的に有効化が必要です。

Dec 30, 2021 - 3 minute read - polyglot bash powershell

Bash と PowerShell の Polyglot を作る

以前 Bash と PowerShell の Polyglot を書いたことがあったんですが、 「そういえば、どこにもメモってないな〜」と思い出したので、記録として残しておきます。 背景・目的 GitHub Actions には run というステップがあります。 任意のシェルスクリプトをかける便利なステップなんですが、 マトリックスビルドでマルチプラットフォームなワークフローを書いていると罠があります。 例えば以下のワークフローは 「Hello GitHub Actions!」とログに表示するだけの簡単なものです。 on: push: pull_request: jobs: job: strategy: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - name: Ubuntu, macOS, Windows で実行する # shell: bash # Ubuntu, macOS でのデフォルト # shell: pwsh # Windows でのデフォルト run: | echo "Hello GitHub Actions!" コメントに書いたとおり Ubuntu, macOS では bash、Windows では PowerShell Core と デフォルトのシェルが環境によって異なります。 bash にも PowerShell にも echo コマンドが存在するので、この例はなぜか動いてしまうのですが、 もっと複雑な処理ではこうも行きません。

Dec 24, 2021 - 2 minute read - perl

Perl の文字列用ビット操作演算子を使ってみる

この記事は、Perl Advent Calendar 2021 の24日目の記事です。 23日目は @hitode909 で「リポジトリ内のソースコードを機械的にリファクタリングし続けるスクリプトを作る」でした。 今日はちょっと前から使えるようになってたけど滅多にお世話になることのない、「文字列用ビット操作演算子」を触ってみたというお話です。 特に断りのない限り 2021-12-24 現在の最新安定版 Perl 5.34.0 で動作確認をしています。 旧来のビット演算子 Perl の多くの演算子には「数値用」と「文字列用」があります。 例えば比較演算子であれば ==, != は数値用、 eq, ne は文字列用といった具合です。 しかし、ビット操作用の演算子だけには、なぜかその区別がなかったのです。 以下は perlop Bitwise String Operators から引っ張ってきた例です。 | は論理和を求める演算子ですが、両辺の型に応じて結果が変わります。 use warnings; use strict; use feature qw/say/; say 150 | 105; # = 255 (0x96 | 0x69 = 0xFF) say '150' | 105; # = 255 say 150 | '105'; # = 255 say '150' | '105'; # = 文字列の '155' (ASCII) 結果:

Dec 16, 2021 - 1 minute read - aws perl

AWSジャカルタリージョンでPerlランタイムが利用可能になりました

Perl Advent Calendar 2021 の途中ですが、ここで臨時ニュースです。 AWSジャカルタリージョン(ap-southeast-3) が利用可能になったので、 それに併せて AWS::Lambda Perl support for AWS Lambda Custom Runtime も公開しました。 SHOGO/AWS-Lambda-0.0.34/Changes 以下のランタイムが利用可能です。 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-34-runtime-al2-x86_64:1 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-32-runtime-al2-x86_64:1 Paws はこちら。 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-34-paws-al2-x86_64:1 arn:aws:lambda:ap-southeast-3:445285296882:layer:perl-5-32-paws-al2-x86_64:1 Arm64 アーキテクチャについては未対応のようなので、AWS側の対応が終わり次第追って追加します。 以上、臨時ニュースでした。 引き続き Perl Advent Calendar 2021 をお楽しみください。 まだカレンダーに若干の空きがあります。ブログ記事の投稿も大歓迎です! 参考 Now Open – AWS Asia Pacific (Jakarta) Region AWS::Lambda

Dec 11, 2021 - 2 minute read - perl

Perl 5.35.5 の iterating over multiple values at a time を先取り

この記事は、Perl Advent Calendar 2021 の11日目の記事です。 10日目は @shogo82148 で「Perl 5.35.4 の defer を先取り」でした。 Perl 5.35.5 から利用可能になった iterating over multiple values at a time を試してみたお話です。 この構文は安定版にはまだ取り込まれていません。 特に断りのない限り 2021-12-11 現在の最新開発版 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 ハッシュのキーとバリューのペアの一覧を出力する Perl7関連で色々とゴタゴタがあった 影響で、 Perlの今後の機能拡張は RFC(Requests For Comments) PPC(Proposed Perl Changes) の形式を取っていく事になりました(2024-06-18修正、RFCからPPCへ名前が変更されました) この機能はそのRFCの記念すべき(?)第一号です! Multiple-alias syntax for foreach さて、プログラムを書いているとハッシュ(連想配列)の全要素に対して何か操作をしたいということは頻繁にあると思います。 これまで Perl には専用の構文はなく、以下のように while 文と each を組み合わせて書く必要がありました。

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 が管理している全オブジェクトの中から一意に目的のノードを特定することが出来ます。