Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Go_Conference_2019_Spring_Go1.9_to_Go1.11.pdf
Search
emahiro
May 18, 2019
Programming
13k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Go_Conference_2019_Spring_Go1.9_to_Go1.11.pdf
Go Conference 2019 Spring で発表した「Go1.9 で作られた App Engine のサービスを Go1.11 に移行した話」の登壇資料になります。
emahiro
May 18, 2019
More Decks by emahiro
See All by emahiro
事業を止めない技術改善の取り組み
emahiro
0
3k
AndAppのフロントエンド事情
emahiro
0
1.1k
Other Decks in Programming
See All in Programming
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
230
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
関数型プログラミングのメリットって何だろう?
wanko_it
0
150
スマートグラスで並列バイブコーディング
hyshu
0
280
Creating Composable Callables in Contemporary C++
rollbear
0
190
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
450
地域 SRE コミュニティ最前線 - ホンマでっかSRE勉強会
tk3fftk
0
160
自作OSでスライド発表する
uyuki234
1
3.7k
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
130
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.9k
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
120
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
830
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
698
190k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The Cost Of JavaScript in 2023
addyosmani
55
10k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Navigating Weather and Climate Data
rabernat
0
280
Technical Leadership for Architectural Decision Making
baasie
3
430
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.4k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
210
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
630
Transcript
Go1.9 で作られた App Engine のサービスを Go1.11 に移行した話 江間啓道 株式会社ディー・エヌ・エー
自己紹介 name: 江間啓道 (Hiromichi Ema) twitter: @ema_hiro github: emahiro ServerSide
Engineer at DeNA Google AppEngine を使って、マイクロサービスアーキテクチャで作られたプラットフォーム の開発と運用のお仕事でご飯を食っています。 好きな言語は Go です。 好きな PaaS は App Engine です。
3 告知
4 https://dena.connpass.com/event/128034/ ※ 抽選は5/22なのでもし興味のある方は申込してみてください!
5 Go1.9 で作られた App Engine のサービスを Go1.11 に移行した話
6 本日お話しすること 1 2 3 まとめ Go1.11 への移行手順 なぜ今から Go1.11
に移行するのか
7 なぜ今から Go1.11に移行するのか
App Engine で今起きてること • gVisor 対応(go1.11/go1.12)のランタイムの登場 ◦ Googleは今後こちらを推していくと思う ◦ go1.9
のランタイムがいつまでサポートされるかわからない • 新しいランタイムだと今までと同様に App Engine を使うことができない ◦ go1.12 以降の App Engine では、appengine パッケージはサポートされないた め、それまで使えていた App Engine 固有機能が使えなくなる 8 App Engine で運用されているサービスには今後影響が出ることが予想される 私たちのチームで運用中のサービスへも影響があることが既に判明している
AndApp とは? 9 スマホゲームをPCでできるプラットフォーム • スマホとPCでアカウントを同期できる。 • AndAppポイントやツールなどの「捗る」をサポートする便利機能多数。 • 興味がある方はぜひ
-> https://www.andapp.jp にアクセスしてPCアプ リをDLしてみてください。
• Microservices on App Engine with Go • 約 30
個のサービス • そのほとんどが AppEngine Standard Environment で運用されている 詳細はDeNA TechCon 2018 にて発表された内容を参照してください AndAppにおけるGCP活用事例: https://www.slideshare.net/dena_tech/andappgcp-88366004 AndApp のシステム概要 10
• マイクロサービスの各コンポーネントが第1世代 App Engine の固有機能に依存している • appcfg.py を使用した独自デプロイスクリプト • 独自のディレクトリ構造をしている
◦ direnvでのGOPATHの書き換え ◦ 環境ごとのyamlの配置 ◦ 独自ディレクトリ構造を前提とした実装 ▪ src 配下から conf や andapp-schema を読み込んでいる AndApp の課題 11
AndApp における Go1.11 移行モチベーション • AndApp はApp Engine の固有機能に依存しているので appengine
パッケージか ら容易に離れられない ◦ Go 1.11 であれば App Engine の固有機能がまだサポートされている • go1.9 のランタイムがいつまでサポートされるかわからない不安感 ◦ 非サポートの期日が決まってから全てを移行する作業はつらい ▪ 開発を止める必要がある可能性 => サービスを安心して運用していくために Go1.11 に先んじて移行しておきたい! 12
13 Go1.11への移行手順
14 1 2 3 AndApp における Go1.11 への移行戦略 Go1.11 へのバージョンアップについて
これまでのバージョンアップついて 4 AndApp における Go1.11 への移行手順
これまでのバージョンアップについて • ランタイムの変更はなく、気にしないといけないことはほとんどなかった ◦ Go のバージョンアップにおける下位互換についてのみ注意 • app.yaml で api_version:
go1 を指定すると最新のgoのバージョンがデプロイされ る 15
Go1.11 へのバージョンアップについて • プロジェクトのディレクトリ構造に変更がある ◦ app.yamlと同階層に main パッケージ の main
関数が必要 ◦ GOPATH配下にプロジェクトを設置 ▪ direnv で GOPATHを書き換える場合は src をそのまま残す必要がある ▪ go.mod 対応する場合は GOPATH/go.mod を配置できないので GOPATH を書き換える設定を外す必要がある 16
Go1.11 へのバージョンアップについて • デプロイコマンドの変更 ◦ appcfg.py が非対応に、gcloud app deploy を使う
▪ appcfg.py を使いデプロイスクリプトやCDを組んでる場合は影響がある ▪ gcloud app deploy に対応した app.yaml の設定項目の変更も必須 • App Engine の固有機能はサポートされる ◦ app.yaml の設定でも go1.9 までは提供していた機能は引き続き利用可能 • アプリケーションのビルドに Cloud Build が使用される ◦ GCP の Cloud Build のコンソールからビルド状況を確認できる ◦ Cloud Build への課金必須 17
AndApp における Go1.11 への移行戦略 Go1.11 移行のタイミングでやると決めたこと • 脱 glide &&
go modules 対応 ◦ glide運用のつらみ • 脱 direnv ◦ AndAppでは go modules 対応時に必須 • gcloud app deploy 対応 ◦ 独自デプロイスクリプトをappcfg.py と gcloud app deploy 両対応に 18
AndApp における Go1.11 への移行戦略 Go1.11 移行のタイミングでやらないと決めたこと • go 1.10 以降の機能は使わない
(ex. strings.Builder など) ◦ ローカルでの起動およびテストには goapp コマンドを使い続けること ▪ goapp を使わないと動かない実装が共通ライブラリに存在した • 脱 appengine package ◦ urlfetch => net/http ◦ memcache => Memorystore? or Redis Labs? ◦ log => standard log or cloud.google.com/logging 19
20 AndApp における Go1.11 への移行手順
AndAppにおける Go1.11 への移行方法 1. プロジェクトをGOPATH配下に移動 && 脱 direnv 2. glide
=> go modules への移行 3. main 関数 をプロジェクトのルートに追加 4. app.yaml を gcloud コマンドに対応させる 21
プロジェクトをGOPATH配下に移動 && 脱 direnv 22
glide => go modules への移行 23
main 関数をプロジェクトのルートに追加 24
app.yaml を gcloud コマンドに対応させる 25 Element appcfg gcloud app deploy
runtime go go111 api_version go1 なし module app なし service なし app handler.script _go_app auto skip_files ex - ^vendor/(.*/)? なし .gcloudignore が必須 main - ex - ./cmd main.go の相対pathを指定で きます。 ex - ./cmd/app - MODULE_NAME/cmd/ app GO111MODULE=onが必須
26 Go1.11移行こぼれ話 ~ 移行でハマったところ ~
appengine.Main() の内部で呼ばれる関数が異なる 27 • ビルドタグで internal.Main() を切り替えていた ◦ go 1.9
▪ X-AppEngine から始まるリクエストヘッダーを詰め直している ◦ go 1.11 ▪ リクエストヘッダーの詰め直していない => リクエストヘッダーを取得できるように修正
Cloud Build からGitHub Enterpriseにアクセスできない • DeNA では社内ライブラリを GitHub Enterpriseで管理 •
Cloud Build は go modules 有効なときに、自動で依存関係を解決しようとする => Github Enterprise にアクセスできずデプロイが失敗 28
対応 • GO111MODULE=off && go mod vendor && go.mod をアップロードしない
• Cloud Build でアプリケーションをビルドするときは この vendor を使用 ◦ vendor ディレクトリは単体テストを回す時にも参照 29
デプロイできないディレクトリ構成がある • GO111MODULE の on/off • vendor ディレクトリを設置しての依存関係の解決 をうまく組み合わせないとビルドに失敗してデプロイできない 30
デプロイ可 • GO111MODULE = on 31 • GO111MODULE = off
• go mod vendor
デプロイ可 ~社内ホスティングサーバーを突破する~ • GO111MODULE = on • vendor ディレクトリを pkg
配下に追加する • go modules の replace を使って依存関係を力ずくで解決する (ライブラリのgo.mod対応もセット) 32
33
34 ↓もしくはこれ↓ postedAt: 05/18/11:53:51 !!! https://daisuzu.hatenablog.com/entry/2019/05/18/115351
35 まとめ
Go1.12に向けて 36 TODO urlfetch metadataAPIから取得した access_token を使って内部通信判定を行うことで対応可能 memache goon (https://github.com/mjibson/goon)
離脱の検討を進めている。 これ!という代替手段が今のところ見つかっていないことが悩ましい。 log 監視設定の見直しと structured logging を自前で実装する予定 datastore cloud.google.com/go/datastore を使用 トランザクション実装時のシグネチャが 変更になるので対応予定。 taskQueue cloud.google.com/go/cloudtask を使用 CloudTaskではトランザクショナルタスクが非サポート。代替案を検討中。
まとめ • AndApp では先んじで go1.11 に移行し、来たるgo1.12 への移行に備えている • go1.11 への移行は
appengine パッケージからはこのタイミングでは離れない、とい う意思決定をしたので移行は順調に進行中 (実はまだ全て移行できておりません...) • go1.12 に向けては解決しないといけない課題がある 37
38 ご静聴ありがとうございました