Shogo's Blog

Mar 12, 2024 - 1 minute read - Comments - mysql go golang

GoのMySQLドライバーを使うときはmysql.NewConnectorとsql.OpenDBを使おう

これから新規に書くコードでは mysql.NewConnector と sql.OpenDBを使ったほうが良さそう、という話。 昔からある書き方 go-sql-driver/mysql のDSNを文字列結合で実現するのは意外と大変なので、 某所ではDSNの生成を mysql.Config を使って行っています。 // DSNの生成 cfg := mysql.NewConfig() cfg.User = "user" cfg.Passwd = "password" cfg.DBName = "dbname" dsn := cfg.FormatDSN() // 接続 db, err := sql.Open("mysql", dsn) if err != nil { panic(err) } 新しい書き方 実はDSNを生成しなくとも、 mysql.Configから *sql.DB を取得できます。 cfg := mysql.NewConfig() cfg.User = "user" cfg.Passwd = "password" cfg.DBName = "dbname" // *mysql.Config を直接渡す conn, err := mysql.NewConnector(cfg) if err != nil { panic(err) } db := sql.

Mar 11, 2024 - 2 minute read - Comments - aws mysql go golang

GoのMySQLドライバーにBeforeConnectが追加されました

先日 go-sql-driver/mysql v1.8.0 がリリースされ、 いくつかのオプションが追加されました。 その中からひとつ BeforeConnect を紹介したいと思います。 Add BeforeConnect callback to configuration object #1469 何が嬉しいの? パスワード以外の方法で MySQL にログインするのが簡単になります。 BeforeConnect を使わない従来の方法 たとえば、AWS では IAM 認証を使ってログインする方法を提供しています。 IAM の情報を使って短期間だけ有効なトークンを発行し、そのトークンを使ってログインします。 MariaDB、MySQL、および PostgreSQL の IAM データベース認証 トークンの有効期限は短いので、接続を開始する直前にトークンを発行し接続設定を書き換えなければいけません。 しかし、Go はコネクションプールを採用しているため、実際に接続を開始するタイミングを知るのは意外と難しいです。 頑張ってそれを実現するためにわざわざドライバーを書いたこともありました。 IAM 認証で AWS RDS へ接続する MySQL ドライバを作った shogo82148/rdsmysql BeforeConnect を使った方法 BeforeConnect は、接続を開始する直前に接続設定を書き換える機能です。 shogo82148/rdsmysql を使用せずとも、簡単に IAM 認証を実現できます。 package main import ( "context" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/feature/rds/auth" "github.com/go-sql-driver/mysql" ) func main() { mycnf := mysql.NewConfig() mycnf.TLSConfig = "true" mycnf.

Feb 6, 2024 - 2 minute read - Comments - aws aws-lambda go golang

AWS Lambda Function URLsのイベントをnet/httpで扱えるridgenativeとlambtripを書いた

AWS Lambda関数をGoの標準ライブラリのインターフェイスに変換するライブラリを作りました。 http.Handler 実装: shogo82148/ridgenative http.RoundTripper 実装: shogo82148/lambtrip ridgenative Lambda Function URLsではリクエストとレスポンスがJSON形式になって渡ってきます。 これらをGo標準ライブラリの net/http.Request と net/http.ResponseWriter で扱えるように書いたアダプターが shogo82148/ridgenativeです。 同じコードをHTTPサーバーやAWS Lambda上で動かす これのうれしいポイントは net/http.Handler の実装をひとつ用意すれば、 普通のHTTPサーバーとしても、AWS Lambda上でも動かすことができるという点です。 たとえば以下のコードは go run main.go のように実行すると、 8080ポート上で動く普通のHTTPサーバーになります。 package main import ( "fmt" "net/http" "github.com/shogo82148/ridgenative" ) func main() { http.HandleFunc("/hello", handleRoot) // httpの代わりにridgenativeを呼び出す ridgenative.ListenAndServe(":8080", nil) } func handleRoot(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") fmt.Fprintln(w, "Hello World") } bootstrap という名前でコンパイルして、zipで固めてアップロードすれば、 Lambda Function URLsやAPI Gatewayで動くHTTP APIの完成です。 GOOS=linux GOARCH=arm64 CGOENABLED=0 go build -o bootstrap main.

Feb 4, 2024 - 1 minute read - Comments - github github-actions mysql redis

actions-setup-mysqlとactions-setup-redisがApple M1上で動くようになりました

GitHub Actions に Apple Silicon がやってきました! GitHub Actions: Introducing the new M1 macOS runner available to open source! GitHub Actions: macOS 14 (Sonoma) is now available 先日Perlをビルドして遊んでみました。 actions-setup-perlがApple M1上で動くようになりました 今回はMySQLとRedisをビルドしてみたお話です。 shogo82148/actions-setup-mysql shogo82148/actions-setup-redis actions-setup-mysql v1.31.0, actions-setup-redis リリースのお知らせ actions-setup-mysql v1.31.0, actions-setup-redis v1.33.0 から M1 macOS に対応しています。 runs-on: キーに macos-14 を指定すると M1 を利用できます。 jobs: build: runs-on: macos-14 steps: - uses: actions/checkout@v4 - name: Set up MySQL uses: shogo82148/actions-setup-mysql@v1.31.0 M1による高速化 今日現在(2024-02-04)のMySQL最新安定版リリースは 8.0.36 です。 MySQL 8.

Feb 1, 2024 - 1 minute read - Comments - github github-actions perl

actions-setup-perlがApple M1上で動くようになりました

GitHub Actions に Apple Silicon がやってきました! GitHub Actions: Introducing the new M1 macOS runner available to open source! GitHub Actions: macOS 14 (Sonoma) is now available 新しいコンピューティング環境がでてやることといえばアレですよね。 Perlのビルド。 というわけでやっていきましょう。 actions-setup-perl v1.28.0 リリースのお知らせ actions-setup-perl v1.28.0 から M1 macOS に対応しています。 runs-on: キーに macos-14 を指定すると M1 を利用できます。 jobs: build: runs-on: macos-14 steps: - uses: actions/checkout@v4 - name: Set up perl uses: shogo82148/actions-setup-perl@v1.28.0 M1による高速化 今回のリリースにあたり、バージョン違いコンパイルオプション違いの 全148種類 のPerlバイナリを再ビルドしました! Perl 5.38.2 のビルド時間で比較すると、x64では 11m 27s かかっていたビルドが、M1では 4m 6s へと大きく改善しました。 64.

Jan 11, 2024 - 1 minute read - Comments - go golang

GoでForwarded Headerのパーサーを作った

ちょっとした用事で Forwarded ヘッダーの解析をしたくなったので、解析ライブラリを書いてみました。 shogo82148/forwarded-header 背景 Amazon API GatewayのHTTP Proxy Integrationを利用しているプロジェクトで、 クライアントのIPアドレスを知りたい用件がありました。 リバースプロキシの運用に慣れている人なら、「クライアントのIPアドレスを取得したい」と聞いて真っ先に思いつくのは X-Forwarded-For ヘッダーでしょう。 しかし、HTTP Proxy Integrationはこのヘッダーを付与しません。 なんとかIPアドレスを取得できないかと調べてみると、HTTP Proxy IntegrationはForwardedヘッダーを付与することがわかりました。 Amazon API Gateway: Explaining HTTP Proxy in HTTP API Forwardedヘッダーは RFC 7239 で標準化されているヘッダーです。 リバースプロキシによって失われてしまう情報を補完するために利用します。 RFC 7239: Forwarded HTTP Extension RFC 7239: Forwarded HTTP拡張 Forwarded - MDN Forwardedヘッダーを見ればクライアントのIPアドレスもわかります。 たとえば以下の例では 192.0.2.60 がクライアントのIPアドレスです。 Forwarded: for=192.0.2.60; proto=http; by=203.0.113.43 X-Forwarded-Forヘッダーは単純なカンマ区切りのテキストだったので、Split関数で十分でした。 一方Forwardedヘッダーは構造化されているため、パーサーが必要です。 そこまで複雑ではないので、実装してみました。 使い方 解析は Parse関数を呼び出すだけです。 package main import ( "fmt" "net/http" "os" forwardedheader "github.com/shogo82148/forwarded-header" ) func main() { header := make(http.

Jan 11, 2024 - 1 minute read - Comments - go golang aws

AWS SDK for Go v2にnot found ResolveEndpointV2と起こられたときの解決策

AWS SDK for Go v2を使っているプロジェクトで、以下のようなエラーが発生しました。 {"time":"2024-01-09T06:45:00.239872","level":"fatal","message":"not found, ResolveEndpointV2"} 解決策 github.com/aws/aws-sdk-go-v2 名前空間の下にあるモジュールをすべて最新版にアップデートしましょう。 go get -u "github.com/aws/aws-sdk-go-v2/..." 原因 AWS SDK for Go v2 v1.23.0 (2023-11-15) で入った以下の変更が原因です。 Feature: BREAKING CHANGE: V2 endpoint resolution middleware has changed steps from Serialize to Finalize. Middleware that indexes off of this field will need to be updated accordingly. 特徴: 重大な変更: V2エンドポイント解決ミドルウェアは、SerializeからFinalizeへのステップが変更されました。このフィールドをベースにインデックスを付けるミドルウェアは、それに応じて更新する必要があります。(ChatGPTによる和訳) なんでこんなひどいことするの 😭(1年3か月ぶり、2回目) 前回壊れたとき(参考:AWS SDK v2 for Goが壊れた、Googleお前もか)はコンパイルエラーで気がつけたのですが、今回のエラーは実行してみないとわかりません。 マイナーアップデートで入れるのはやめてくれ・・・。 参考 Release (2023-11-15) [SOLUTION IN THREAD] “not found, ResolveEndpointV2” service modules released on or after 11/15/23 are incompatible against previous runtimes (and vice versa) #2370 SOLUTIONが書かれたコメント AWS SDK v2 for Goが壊れた、Googleお前もか

Dec 29, 2023 - 1 minute read - Comments - go golang

go-retry v1.2.0 リリースのお知らせ、ジェネリクスがやってきた

shogo82148/go-retry は指数的バックオフを行ってくれるライブラリです。 Goで指数的バックオフをやってくれるgo-retryを書いた v1.2.0 でジェネリクスを導入した新しいインターフェイスを追加しました。 新インターフェイス Goで指数的バックオフをやってくれるgo-retryを書いたの最後のまとめで、僕らのやりたいことを全部詰め込んだこんなコードを書きました。 func DoSomethingWithRetry(ctx context.Context) (Result, error) { var res Result var err error policy.Do(ctx, func() error { ctx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() res, err = DoSomething(ctx) return err }) return res, err } これが以下のようにちょっとシンプルになります。 func DoSomethingWithRetry(ctx context.Context) (Result, error) { return retry.DoValue(ctx, policy, func() (Result, error) { ctx, cancel := context.WithTimeout(ctx, time.Second) defer cancel() return DoSomething(ctx) }) } math/randの実装変更に合わせた最適化 math/randパッケージ には Int, Intn などトップレベルに関数があります。 Go 1.

Dec 29, 2023 - 1 minute read - Comments - perl

AWS::LambdaがCanada West (Calgary) Regionで利用可能になりました

この記事は、Perl Advent Calendar 2023 25日目の記事(代打)です。 24日目は@shogo842148で「PerlにClass構文がやってきた」でした。 AWSでカナダ(カルガリー)リージョンが利用可能になりました! The AWS Canada West (Calgary) Region is now available それに合わせて p5-aws-lambda のビルド済みレイヤーも公開しました! Perl本体: arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-runtime-al2023-x86_64:3 Paws: arn:aws:lambda:ca-central-1:445285296882:layer:perl-5-38-paws-al2023-x86_64:4 参考 The AWS Canada West (Calgary) Region is now available shogo82148/p5-aws-lambda AWS::Lambda

Dec 29, 2023 - 1 minute read - Comments - perl

PerlにClass構文がやってきた

この記事は、Perl Advent Calendar 2023 24日目の記事(代打)です。 23日目は@doikojiで「【さらばpptxよ】perlとJavaScriptとHTMLで超手軽にスライドを作る」でした。 今年のPerlの重大ニュースといえば 「PerlにClass構文がやってきた」 ことですよね[要出典]。 (※ただしExperimental) Advent Calendar でClassをメインに取り上げることなかったなと思ったので、ちょっと触ってみました。 とりあえず動かしてみる perlclassの例です。 警告が出ないように no warnings 'experimental::class' で抑制だけしました。 use v5.38; use feature 'class'; no warnings 'experimental::class'; class My::Example 1.234 { field $x; ADJUST { $x = "Hello, world"; } method print_message { say $x; } } My::Example->new->print_message; 実行すると Hello, world と出力されます。 Hello, world newの引数を受け取る My::Example->new には引数を渡すことができます。 Perl 5.38時点では :param field属性を使って、フィールドを初期化できるようです。 use v5.38; use feature 'class'; no warnings 'experimental::class'; class My::Example 1.