S3 + CloudFrontで実現する独自ドメインGoパッケージ

#AWS#Go
2025/01/26
ArticleImage:01JJHA5TFHVR4MP9ZWJSDD713A

はじめに

  • go.uber.org/mock
  • google.golang.org/grpc
  • gorm.io/gorm

独自ドメインで配布されているGoパッケージはカッコいい
github.com/{ユーザー名}bitbucket.org/{ユーザー名} のような
{VCSプラットフォームのホスト}/{ユーザー名} のPrefixがない分、importディレクティブがスッキリして見える

今回は当ブログのバックエンド(モノレポ)のパッケージ名を github.com/miyamo2/blogapi.miyamo.today -> blogapi.miyamo.today
に置き換えた話です

Goパッケージに独自ドメインを使う方

  1. VCSをセルフホストする
    • Bazaar
    • Fossil
    • Git
    • Mercurial
    • Subversion
  2. 所定のmetaタグを含むHTMLファイルをホストする

今回は2の方法を S3 + CloudFront で実現します

S3+CloudFrontでRemote import pathを解決する

https://{ホスト名}/{パッケージ名}?go-get=1でリクエストされた際に以下のmetaタグが含まれるHTMLファイルを返すようビヘイビアを定義します
オリジンリクエストポリシーを Managed-CORS-S3Origin にしていればクエリパラメータはオリジンに転送されないのでgo-get=1は特に意識しなくて問題ないです

Copy
<meta 
  name="go-import" 
  content="①3を置き換えるホスト名 ②( bzr | fossil | git | hg |svn ) ③パッケージが含まれるRepositoryのルート" />

今回の場合はこうなります

Copy
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="go-import"
      content="blogapi.miyamo.today git https://github.com/miyamo2/blogapi.miyamo.today.git"
    />
  </head>
  <body></body>
</html>

リポジトリに含まれるすべてのパッケージに対応するために CloudFront Functions で雑にリダイレクト
今回は単一のRepositoryを置き換えるためビュワーリクエストの中身は無視していますが
github.com/miyamo2/* -> example.com/* に置き換える場合はパスパラメータを考慮する必要があります

Copy
function handler(event) {
  var request = event.request
  if (request.uri.includes('index.html')) {
    return request
  }
  var response = {
    statusCode: 301,
    statusDescription: 'Moved Permanently',
    headers: { "location": { "value": `https://blogapi.miyamo.today/index.html` } }
  }
  return response;
}

以下のようなエラーが出た場合、faviconを取得しにいこうとしてオリジン(S3)が404、CloudFront が403を返しています

Copy
go mod tidy
go: downloading blogapi.miyamo.today/core v0.24.0
go: blogapi.miyamo.today/core/echo/middlewares: blogapi.miyamo.today/core@v0.24.0: verifying module: blogapi.miyamo.today/core@v0.24.0: reading https://sum.golang.org/lookup/blogapi.miyamo.today/core@v0.24.0: 404 Not Found
        server response: not found: blogapi.miyamo.today/core@v0.24.0: unrecognized import path "blogapi.miyamo.today/core": reading https://blogapi.miyamo.today/core?go-get=1: 403 Forbidden
go: blogapi.miyamo.today/core/echo/s11n: blogapi.miyamo.today/core@v0.24.0: verifying module: blogapi.miyamo.today/core@v0.24.0: reading https://sum.golang.org/lookup/blogapi.miyamo.today/core@v0.24.0: 404 Not Found
        server response: not found: blogapi.miyamo.today/core@v0.24.0: unrecognized import path "blogapi.miyamo.today/core": reading https://blogapi.miyamo.today/core?go-get=1: 403 Forbidden

実際にfaviconを用意してもよいのですが虚無Data URLを読み込ませて誤魔化しました

Copy
<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="go-import"
      content="blogapi.miyamo.today git https://github.com/miyamo2/blogapi.miyamo.today.git"
    />
+   <link rel="icon" href="data:," />
  </head>
  <body></body>
</html>

おわりに

API Gateway + Lambda のが楽だったかも

参考


Recommend Articles

Gatsby.jsとgqlgenでブログを作った

はじめに 最初は単にGraphQL、gRPC、ECS、New Relic etc 自分が興味のある技術トピックでHello World Enterprise Editionをやるだけのつもりだったものの GraphQL -> ヘッドレスCMS -> ブログ という連想ゲームの結…

2024/12/23

ArticleImage:01JFT54WPPZ0ET3XTKZ0JTCMRE

GitHub Packages: 公開用コマンドをnpm publishからbun publishに置き換える

v1.2でS3のサポートなどが話題になっていたbunですが 1.2.x初のパッチリリース v1.2.1がリリースされました Release Bun v1.2.1 · oven-sh/bunTo install Bun v1.2.1 curl -fsSL https://bun.…

2025/01/30

ArticleImage:01JJWCWVFJMRREP29R9DA73MNP

Copyright © miyamo2 All rights reserved.