はじめに
- 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パッケージに独自ドメインを使う方
- VCSをセルフホストする
- Bazaar
- Fossil
- Git
- Mercurial
- Subversion
- 所定のmetaタグを含むHTMLファイルをホストする
今回は2の方法を S3 + CloudFront で実現します
S3+CloudFrontでRemote import pathを解決する
https://{ホスト名}/{パッケージ名}?go-get=1
でリクエストされた際に以下のmetaタグが含まれるHTMLファイルを返すようビヘイビアを定義します
オリジンリクエストポリシーを Managed-CORS-S3Origin にしていればクエリパラメータはオリジンに転送されないのでgo-get=1
は特に意識しなくて問題ないです
<meta
name="go-import"
content="①3を置き換えるホスト名 ②( bzr | fossil | git | hg |svn ) ③パッケージが含まれるRepositoryのルート" />
今回の場合はこうなります
<!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/*
に置き換える場合はパスパラメータを考慮する必要があります
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を返しています
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を読み込ませて誤魔化しました
<!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 のが楽だったかも