ラベル AppEngine の投稿を表示しています。 すべての投稿を表示
ラベル AppEngine の投稿を表示しています。 すべての投稿を表示

2021年3月9日火曜日

AppEngine に Ktor アプリをデプロイする

1. Google Cloud SDK をインストールする

https://cloud.google.com/sdk/docs/install

2. 認証 & プロジェクト選択

> gcloud init

3. Ktor アプリを作る

IntelliJ IDEA に Ktor plugin を入れて、New Project wizard から Ktor プロジェクトを作る

4. AppEngine の設定を追加する

build.gradle.kts ... plugins { ... // ↓ 追加 id("com.google.cloud.tools.appengine") version "2.2.0" // ↓ 追加 war } ... dependencies { ... // ↓ 追加 implementation("io.ktor:ktor-server-servlet:$ktor_version") // ↓ 追加 compileOnly("com.google.appengine:appengine:$appengine_version") } // ↓ 追加 appengine { deploy { projectId = "GCLOUD_CONFIG" version = "GCLOUD_CONFIG" } } // ↓ 追加 tasks.named("run") { dependsOn(":appengineRun") } settings.gradle.kts ... // https://stackoverflow.com/questions/48502220/how-to-configure-appengine-gradle-plugin-using-kotlin-dsl/48510049#48510049 // ↓ 追加 pluginManagement { repositories { gradlePluginPortal() google() } resolutionStrategy { eachPlugin { if (requested.id.id == "com.google.cloud.tools.appengine") { useModule("com.google.cloud.tools:appengine-gradle-plugin:${requested.version}") } } } } src/main/webapp/WEB-INF/web.xml <?xml version="1.0" encoding="ISO-8859-1" ?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- path to application.conf file, required --> <!-- note that this file is always loaded as an absolute path from the classpath --> <context-param> <param-name>io.ktor.ktor.config</param-name> <param-value>application.conf</param-value> </context-param> <servlet> <display-name>KtorServlet</display-name> <servlet-name>KtorServlet</servlet-name> <servlet-class>io.ktor.server.servlet.ServletApplicationEngine</servlet-class> <!-- required! --> <async-supported>true</async-supported> <!-- 100mb max file upload, optional --> <multipart-config> <max-file-size>304857600</max-file-size> <max-request-size>304857600</max-request-size> <file-size-threshold>0</file-size-threshold> </multipart-config> </servlet> <servlet-mapping> <servlet-name>KtorServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> src/main/webapp/WEB-INF/appengine-web.xml <?xml version="1.0" encoding="utf-8"?> <appengine-web-app xmlns="http://appengine.google.com/ns/1.0"> <threadsafe>true</threadsafe> <runtime>java8</runtime> </appengine-web-app>

5. ローカルで実行する

> ./gradlew appengineRun // 止めるとき > ./gradlew appengineStop

6. デプロイする

> ./gradlew appengineDeploy


参考

2015年9月9日水曜日

Google App Engine / Go で Google Cloud Storage に画像をアップロードする

How to upload image to Google Cloud Storage with Google App Engine / Go.

この情報は2015年9月9日時点のものです。appengine.Context, context.Context 問題は過渡期のようなので今後インタフェースが変わる可能性があります。

File API が終了になったので調べたけどあんまり情報がなく苦労したのでメモとして残しておく

storage#NewWriter に渡す Context は appengine#Context ではなく context#Context なので次のようにするとエラーになります。

import ( "appengine" "google.golang.org/cloud/storage" ... ) func uploadImage(w http.ResponseWriter, r *http.Request) { ... c := appengine.NewContext(r) wc := storage.NewWriter(c, bucketName, fileName) wc.ContentType = "image/jpg" if _, err := wc.Write(data); err != nil { ... } ... } google.golang.org/appengine の NewContext は context#Context を返すため、こちらを利用します。このワークアラウンドは https://github.com/golang/oauth2/#app-engine を参考にしています。 import ( "appengine" "fmt" "io/ioutil" "net/http" "strings" "golang.org/x/net/context" "golang.org/x/oauth2" "golang.org/x/oauth2/google" newappengine "google.golang.org/appengine" newurlfetch "google.golang.org/appengine/urlfetch" "google.golang.org/cloud" "google.golang.org/cloud/storage" ) func uploadImage(w http.ResponseWriter, r *http.Request) { file, fileHeader, err := r.FormFile("image_file") if err != nil { fmt.Fprint(w, "no image") // no image return } defer file.Close() data, err := ioutil.ReadAll(file) if err != nil { fmt.Fprint(w, "cloud not upload image") return } var mimeType string if strings.HasSuffix(filename, ".png") { mimeType = "image/png" } else if strings.HasSuffix(filename, ".jpeg") { mimeType = "image/jpg" } else { mimeType = "image/jpg" } bucketName := "mybucketname" fileName := fileHeader.Filename c := appengine.NewContext(r) ctx := newappengine.NewContext(r) hc := &http.Client{ Transport: &oauth2.Transport{ Source: google.AppEngineTokenSource(ctx, storage.ScopeFullControl), Base: &newurlfetch.Transport{Context: ctx}, }, } ctx2 := cloud.NewContext(appengine.AppID(c), hc) wc := storage.NewWriter(ctx2, bucketName, fileName) wc.ContentType = mimeType if _, err := wc.Write(data); err != nil { fmt.Fprint(w, "cloud not upload image") return } if err := wc.Close(); err != nil { return }
google.golang.org/cloud/storage などは GOPAH を設定して $ go get -u google.golang.org/cloud/storage でインストールしておきます


参考


2015年2月9日月曜日

GAE/Go の GuestBook チュートリアルの Greeting データをダウンロードする

1. Remote API を有効にする
https://cloud.google.com/appengine/docs/go/tools/remoteapi

2. bulkloader.yaml のひな形を作る
$ appcfg.py create_bulkloader_config --filename=bulkloader.yaml --url=http://localhost:8080/_ah/remote_api --application=dev~APPLICATION_ID .

3. bulkloader.yaml を編集する
  • connector と connector_options を埋める
  • property_map を編集する
    • external_name が CSV のカラムと一致しているか確認する
    • __key__ が適切かチェックする。値は import 時は key name に、export 時は Key オブジェクトになる
    • import 時に Key を自動生成し、export 時に省略したいなら、__key__ property を property map から削除する
  • model クラスのモジュールがあるときは、python_preamble: に追加し、kind property を model: クラス に変更する
python_preamble: - import: base64 - import: re - import: google.appengine.ext.bulkload.transform - import: google.appengine.ext.bulkload.bulkloader_wizard - import: google.appengine.ext.db - import: google.appengine.api.datastore - import: google.appengine.api.users transformers: - kind: Greeting connector: csv connector_options: encoding: utf-8 columns: from_header property_map: - property: Author external_name: Author import_transform: transform.none_if_empty(unicode) - property: Content external_name: Content import_transform: transform.none_if_empty(unicode) - property: Date external_name: Date import_transform: transform.import_date_time('%Y/%m/%d %H:%M:%S') export_transform: transform.export_date_time('%Y/%m/%d %H:%M:%S') transform.import_date_time() と transform.export_date_time() の文字列はstrptime用のフォーマット文字列
参考: Where are the reference pages of the Google App Engine bulkloader transform?


4 ダウンロードする
$ appcfg.py download_data --config_file=bulkloader.yaml --url=http://localhost:8080/_ah/remote_api --filename=download.csv --kind=Greeting

$ cat download.csv Content,Date,Author "A,B,C",2015/02/09 03:36:21,test@example.com fuga,2015/02/09 02:07:57,test@example.com はろーわーるど,2015/02/09 03:21:49,test@example.com hoge,2015/02/09 02:07:54,test@example.com Hello World,2015/02/09 03:21:44,test@example.com what's up,2015/02/09 03:36:01,test@example.com スペースや日本語があっても"がつかないが、データにカンマ(,)があると"がつくようだ。

毎回メールアドレスが聞かれるのがめんどいときは --email=EMAIL をつけるとよい


2014年10月26日日曜日

GAE Go で static なサイトをホストする

0. python 2.7 が必要

1. https://cloud.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go から SDK をダウンロードして解凍する

2. PATH に解凍したディレクトリを設定する

export PATH=/path/to/go_appengine:$PATH

3. フォルダ構成

myapp/ app.yaml index.html img/ css/ js/ src/ main.go

4. app.yaml

application: myapp-application-id version: 1 runtime: go api_version: go1 handlers: - url: /(.*\.html)$ static_files: \1 upload: .*\.html$ - url: /img static_dir: img - url: /css static_dir: css - url: /js static_dir: js - url: /.* script: _go_app

5. main.go

static dir / static files 以外の全ての URL を /index.html にリダイレクトする package myapp import ( "net/http" ) func init() { http.HandleFunc("/", handler) } func handler(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "index.html", http.StatusFound) }

6. ローカルでテスト

$ cd myapp $ goapp serve localhost:8080 で実行される

7. Deploy

$ cd myapp $ goapp deploy --oauth


2011年10月31日月曜日

Bootcamp 2011 に行ってきました。

Bootcamp 2011 Japan

今年は去年と違って、土曜日開催(去年は平日) & Google Japan の六本木オフィスで行えたこともあって、たくさんの参加者に来ていただけました。よかった、よかった。

ハッシュタグは #bc2011jp です。

@Fumi さんが Togetter にまとめてくれました。
GTUG Bootcamp 2011 #bc2011jp - Togetter -

Barエリアで松尾さんに App Engine について熱く語ると App Engine Tシャツがもらえましたー。


セッションの資料、後でチェックしなきゃ。

■ セッション:「Fragment を使ってみよう」 (あんざいゆき)
資料

■セッション:「Google SketchUp モデリングの初歩」 = 初めてでも簡単、3次元の世界 =
(田中雅子、株式会社アルファコックス CTO)

■セッション:「はじめての Chrome Extension」 (吉川徹)
資料

■セッション:「App Engine 倹約のすゝめ」 (小川 信一)

■ハンズオン:「新聞風の1ページを作ってみよう!」(一條 美和子)
資料

■ハンズオン:Google Apps Script (中村敦)
資料1 資料2 資料3

■ハンズオン:「Spike WebView & Tough ICS」 (江川 崇)
資料

■ハンズオン:Google+ API の体験と Hangouts の紹介 (田中洋一郎、伊藤 千光、中嶋 信博)
資料 参考ブログ

2011年5月23日月曜日

Android + App Engine: A Developer's Dream Combination を試してみた。

Google IO 2011 の Session ビデオはこちら

最初にスピーカーが、なぜこのプロジェクトを始めたのかを語っているのですが、
「約1年まえ、Google に入ったくらいの頃、すごく Android が好きだったんだよね。(省略)ただ、1つだけがっかりしたことがあって、Android のアプリのゲームであるレベルまでいっても、ほかの端末でそのレベルの続きから始められないんだよね。だから、この良くないユーザー体験を良くするために、何かできることがないかって何人かで話てたんだよね。」

なるほど、家では大きな画面のタブレットで、通勤・通学中はスマホで続きを、というスタイルは自然ですよね。もちろんゲームだけじゃなくて、普通のアプリでも十分データを共有/シンクすることの利点があります。セッションでは、例として ToDo 管理アプリ(CloudTask という名前)を作っていくデモがあります。
# ログイン名に LarryPage を使ってるのがシャレてるねw

でも、「Android 開発者にとって、Google App Engine と組み合わせるのって簡単じゃないよね?」

ということで、Google IO の当日から

 「Google Plugin for Eclipse (GPE) 2.4 Beta がダウンロードできるようになりました。」

 GPE 2.4 Beta には以下の機能が!すばらしい!
  ・ Android Application のサポート
  ・ RPC Tooling のサポート (Android -> GAE)
  ・シームレスな C2DM のサポート (GAE -> Android)
 

■ さっそくやってみた。

 1. GPE 2.4 Beta についてはここ

  Eclipse plugin で指定する update site URL が通常とは違って beta が含まれます

  Eclipse 3.6 (Helios)
  http://dl.google.com/eclipse/plugin/beta/3.6

  Eclipse 3.5 (Galileo)
  http://dl.google.com/eclipse/plugin/beta/3.5

  Eclipse 3.4 (Ganymede)
  http://dl.google.com/eclipse/plugin/beta/3.4

  Eclipse で [Help] -> [Install New Software...] で上記のリンクを指定



  GWT の SDK は最新のβ版の 2.4.0.beta, GAE は 1.5.0 が入りました。
  Android SDK, ADT は別途入れる必要があります。

 2. プロジェクトを作成

  ・[File] -> [New] -> [Project...] -> [Google] -> [App Engine Connected Android Project]



  ・Project name: と Package name: を追加
  (Android SDK, GAE SDK, GWT SDK が正しく設定されていない場合は、ここから設定できる)

  ・C2DM のアカウントを設定
  (まだ C2DM に sign up してない場合は、ここから sing up page へいける)



  完了したら、Android のプロジェクトと、GAE + GWT のプロジェクトが作られます。



  ざっと中をみると、
   Android のプロジェクトには
    ・RequestFactory のライブラリ(requestFactory-client.jar)
    ・C2DM のライブラリ (c2dm.jar)
    ・認証 (validation) のライブラリ (validation-api-1.0.0.GA.jar)
    ・いくつかの Activity とその他のクラス (src/***/)
    ・shared で GAE + GWT の方の shared package を参照 (share/)

   GAE + GWT のプロジェクトには
    ・JSON のライブラリ (json-1.5.jar)
    ・C2DM のライブラリ(c2dm-server.jar)
    ・認証 (validation) のライブラリ (validation-api-1.0.0.GA.jar, validation-api-1.0.0.GA-sources.jar)
    ・UI Binder を使った入り口ページ用レイアウト(src/***.client/***Widget.ui.xml)
    ・サーバー側実装 (src/***.server/)
    ・Android のプロジェクトから参照される shared package (shared/)

  などが含まれています。



  最初から、RPC や C2DM のロジックが含まれた状態のプロジェクトが作られるので、そのまま動かして、RPC や C2DM がどう動くか確かめることができます。すごいね。

  まず、Android アプリを [Debug As] -> [Local App Engine Connected Android Application] で実行します。
  通常の Android Application 実行ではないので注意!



  そうすると、App Engine 側も立ち上がって、こんな感じに、
  GWTのローカルのアクセス用URLが表示されるので、ダブルクリックしてブラウザで開きます。


  動かすと、Android アプリはこんな画面
  (注意:Android エミュレータでC2DMのテストをするには、Google アカウントの設定が必要なので、AVD の Target Name には Google APIs (Google Inc.) を指定してください)



  まず、C2DMにアカウントを設定します。
  メニューの Accounts をタップすると、端末に設定されているアカウントの一覧がでます。



  C2DMに設定するアカウントを選択して Connect を押すと



  このアプリで Google Account を使うけどいいですか?という画面がでるので、Allow をタップします。



  しばらくして認証が完了すると、Notification Bar に register できましたというメッセージがでます。



  認証に成功したら、Android アプリから SayHello ボタンを押すと、GAE に RPC でリクエストを投げた返事が表示されるようになります。やった!




  同じことが、GWT クライアントからもできます。
  次に、GWTのページを開くと、最初にログイン用のページが表示されるので、Sign Up for Android Cloud to Device Messaging で指定したアカウントでログインします。



  ブラウザに Plugin が入ってない場合は、入れるように表示がでるので、それに従って入れます。


  
  ログインすると、こんなページ
  


  SAY HELLO ボタンを押すと、GAE に RPC でリクエストして、その返事が表示されます。



 
  いよいよ、メインイベントのC2DM!
  フォームにメッセージをいれて SEND MESSAGE をクリック。



  きたー。


  うまく送れないときは、GWT 側で最初にログインしたアカウントがちゃんと
  Sign Up for Android Cloud to Device Messaging
  で登録したアドレスかどうか確認すること。
  別のアカウントで AuthToken がすでにできてしまっている場合は、ログアウトしてから
  http://127.0.0.1:8888/_ah/admin/
  にいって、C2DMConfig の Entities を削除してから正しいアカウントログインしたほうが安全。


  ローカルのエミュレータと、ローカルデバッグモードの GAE でちゃんとC2DM動くんだね。すごーい。



   

2010年9月9日木曜日

Google App Engine はじめました

# やらないとなぁ、と思いつつ、、、ようやく始めました。

Google App Engine

App Engine を使うと、
  ・独自の Web アプリケーションが作れる!
  ・自分でサーバーを維持管理する必要がない!
  ・トラフィックやデータ ストレージの増大に合わせて
   容易にスケーリングが可能
  ・無料で始められる(無料の割り当て(ストレージ 500 MB、
   月間 500 万ページ ビュー)を超えると課金されるけど。。。)
  (無料割り当てを超えた場合の料金体系はこちらこちら

 公式ブログ Google App Engine Blog

言語は
 ・Java
 ・Python


スタート ガイド
 1. App Engine アカウントを登録

  ここから登録


 2. App Engine SDK をダウンロード

  ここからダウンロード

  2.1 SDK をダウンロード

  Python用 と Java用 があります。

   - Google App Engine SDK for Python
   - Google App Engine SDK for Java

  今回は Python にしちゃいます!

  Windows や Mac はインストーラが走るのでその流れで
  インストールすればOK

  のぱそは Ubuntu なので、Linux版 をダウンロードして
  適当な場所に解凍します。
  

 3. スタート ガイド: Python

  Windows だと Google App Engine Launcher からすべての
  コマンドが実行できるので楽です。

  linux版はコンソールから .py をぽちぽちです。
  これがいいんだよね。
  # 解凍したディレクトリにパスを通しておくと楽

  開発用の Web サーバーを稼働するスクリプトが dev_appserver.py
  
  > dev_appserver.py appli_name
  ...
  INFO 2010-09-09 14:03:16,394 dev_appserver_main.py:431] Running application appli_name on port 8080: http://localhost:8080
  ...
  
  とでれば成功。
  http://localhost:8080 でアプリをテストできます。


 4. アプリケーションのアップロード

  注: App Engine にアップロードしたアプリケーションを削除する
    手段は提供されていません。
    #知らなかった。。。

  App Engine Web アプリケーションの作成と管理は、App Engine
  管理コンソールから行います。

   http://appengine.google.com/

  Google アカウントで App Engine にログインします。

  新しいアプリケーションを作成するには、[Create an Application]
  ボタンをクリックします。

  アプリケーションの一意名であるアプリケーション ID 登録します。
  無償で利用できる appspot.com のドメイン名を選択すると、
  アプリケーションの URL は http://application-id.appspot.com/
  になります。

  app.yaml ファイルを編集し、application: 設定の値を、helloworld
  から登録したアプリケーション ID に変更します。

  アプリケーションをアップロードします。

   appcfg.py update helloworld/

  プロンプト画面で、Google のユーザー名とパスワードを入力します。

  これで

   http://application-id.appspot.com

  にアプリケーションがアップロードされました!