たったの15分でできるGAE/GO入門 標準APIその1

  • このエントリーをはてなブックマークに追加

ご注意

この記事は 2016年2月18日 に書かれたものです。内容が古い可能性がありますのでご注意ください。

知っておけば必ず開発が楽になる!

GAE/Go入門の本連載ですが、前回は第一弾として「PaaS最前線!たったの15分でできるGAE/GO入門!」という記事を書かせていただきました(※1)。第二回となる今回はGAEで標準で用意されているAPIをGOで実装する方法を学んでいきます。メール送信やユーザ認証等、GAEでは開発で役にたつAPIが標準で用意されていますので、これらのサービスを学ぶことで開発がより楽になることは間違いありません。ただ、全てのAPIを説明すると15分以内では収まらなくなってしまうので、今回のテーマ(標準API)については、内容を3回に分けさせていただきます。

それでは、さっそく学んでいきましょう!!

※1 前回の記事はおかげさまで多くの皆様にアクセスしていただき、現在GoogleやYahooの検索エンジンで「GAE GO」と検索すると、公式を押しのけて一番トップに表示されるようになりました(2016/2/4現在)。

本記事で学ぶ内容

本記事の流れは以下の通リです。標準APIの概要を説明後、3つの標準APIを学んでいきます(※2)。

  1. GAEの標準APIの概要
  2. サンプルプログラムからAPIを理解する
    1. ユーザ認証APIを学ぶ
    2. メール送信APIを学ぶ
    3. Memcacheを学ぶ

※2 合計6つのAPIを学ぶ予定ですが、本記事では3つのAPIを取り上げます。残り3つのAPIについては次回学ぶ予定です。

GAE標準APIの概要

GAEにおける標準APIとは、GAEのライブラリに標準的に組み込まれているAPIを指します。標準APIを利用するために、ユーザはわざわざ外部からライブラリをインストールする必要は全くありません。

GAEの標準APIは以下の通リです。ユーザ認証やメール送信等、アプリケーションの基本的となる機能が提供されています。今回はその中から主なAPI(以下1~6)を2回の記事に分けて取り上げていきます。

標準API一覧

  1. ユーザ認証
  2. メール送信
  3. Memcache
  4. タスクキュー
  5. ロギング
  6. BlobStore
  7. XMPP
  8. Namespace
  9. Search API
  10. データストア(※3)

※3 データストアAPIについては内容が盛り沢山のため、一つのテーマとして次回以降に取り上げる予定です。

サンプルプログラムからAPIを理解する

事前準備

本章では実際にサンプルプログラムのデプロイをおこないますので、最初に以下URLの(1)を参考にGCPプロジェクトの作成をおこってください(※4)。
GCPプロジェクトの作成が完了したら、(2)-(4)のURLを参考に「アプリケーションディレクトリの作成」「app.yamlの作成」「AppEngine SDKのインストール」を完了させてください。

※4 既にGCPプロジェクトを作成済みの場合はスキップして構いません。

1.事前準備 (PaaS最前線!たったの15分でできるGAE/GO入門!)
https://apps-gcp-tokyo.appspot.com/gae-go-gettingstart-01/#i-4

2.アプリケーションディレクトリの作成
https://apps-gcp-tokyo.appspot.com/gae-go-gettingstart-01/#1

3.app.yamlの作成
https://apps-gcp-tokyo.appspot.com/gae-go-gettingstart-01/#3_appyaml

4.AppEngine SDKのインストール
https://apps-gcp-tokyo.appspot.com/gae-go-gettingstart-01/#AppEngine_SDK

ここまでやっておけば、後はサンプルのコピペ&デプロイでプログラムの動作確認がおこなえるようになります!それでは実際にサンプルプログラムを動作させることで各サービスを理解していきましょう!

ユーザ認証APIを学ぶ

ユーザ認証APIは、Googleアカウントによるユーザ認証機能を提供します。ログイン中であるか否かだけでなく、ログインしているユーザの情報(Email等)も取得することができます。開発時にはGoogleアカウントを利用したユーザ認証の仕組みをこのAPIを利用して簡易に実装することができるようになります。

サンプルプログラムの説明

以下のコード(サンプルコード1)は、ユーザ認証APIのサンプルプログラムとなります。動作仕様は下記の通リです。サンプルコード1のコメント[1]-[5]については「コードの詳細説明」をご確認ください。

【動作仕様】

  1. ユーザが非ログイン状態の場合はログインリンクを表示し、ログイン状態の場合はユーザのEmailアドレスとログアウトリンクを表示する。
  2. 1でログインリンクをクリックした場合Google認証画面に遷移し、ログインが成功すると、1の画面にリダイレクトされる。画面にはログインユーザのEmailアドレスとログアウトリンクが表示される。
  3. 1のログイン状態、または2のログイン状態からログアウトリンクをクリックした場合は、Google認証によるログイン状態が無効化され、非ログイン状態で1の画面にリダイレクトされる。
package auth

import (
  "net/http"
  "fmt"
  // [1]
  "appengine"
  "appengine/user"
)

func init() {
  http.HandleFunc("/welcome", welcome)
}

func welcome(w http.ResponseWriter, r *http.Request) {
  w.Header().Set("Content-type", "text/html; charset=utf-8")
  // Contextの生成
  ctx := appengine.NewContext(r)
  // [2]
  u := user.Current(ctx)
  // [3]
  if u == nil {
     // [4]
     loginUrl, _ := user.LoginURL(ctx, "/welcome")
     fmt.Fprintf(w, `Sign in`, loginUrl)
     return
  }
  // [5]
  logoutUrl, _ := user.LogoutURL(ctx, "/welcome")
  fmt.Fprintf(w, `Welcome, %s! (Sign out)`, u, logoutUrl)
}

サンプルプログラム1. ユーザ認証

コードの詳細説明

サンプルプログラム1でコメントされている[1]-[5]の詳細は以下の通リです。

[1] ユーザ認証をおこなう上で必須となるモジュールです。

[2] userモジュールを利用して現在ログイン中のユーザを取得します。

[3] nil(=NULL)の場合は非ログイン状態となります。

[4] ログインURLを生成します。LoginURLの2つ目の引数は「ログイン後のリダイレクト先URI」となります。

[5] ログアウトURLを生成します。LogoutURLの2つ目の引数は「ログアウト後のリダイレクト先URI」となります。

動作確認

以下の手順に従って動作を確認してください。

1.アプリケーションディレクトリ(※5)直下にauth.goというファイルを作成し、サンプルコードをコピー・保存します。

※5 本章の最初に作成したアプリケーション用ディレクトリです。

2.以下のコマンドを実行しアプリをデプロイします。

$ goapp deploy アプリケーションディレクトリ名

3.以下URLにアクセスします。

http://[作成したプロジェクトのIDを指定].appspot.com/welcome

4.画面を開くと、非ログイン状態の場合ログインリンクが表示されますので、「Sign in」リンクをクリックしてください。

image02

画像1. ログインリンクの表示

5.Googleのログイン画面が表示されますので、お手持ちのGoogleアカウントでログインしてください。

image03

画像2. Googleアカウント認証

6.認証が成功するとログインユーザのEmailアドレスとログアウトリンクが表示されますので、今度は「Sign out」リンクからログアウトをおこなってください。

image05

画像3. ログアウトリンクの表示

7.ログアウトが成功すると、4の画面に戻ってきます。

image02

画像4. ログアウト成功

以上が「ユーザ認証」のサンプルコードの動作となります。実際に動作させることでサンプルコードの流れも理解できたのではないでしょうか。次は「メール送信」を学びます。

メール送信APIを学ぶ

メール送信APIは、1件以上の宛先に対してメールを送信するためのAPIです。メール送信は本格的なWebアプリケーションを開発する場合基本となる機能と言えます。開発者はメール送信APIを利用して簡易にメール送信機能を実装することができます。

サンプルプログラムの説明

以下のコード(サンプルコード2)は、2件の宛先に対してメール送信をおこなうサンプルプログラムとなります(※6)。サンプルコード2のコメント[1]-[7]については「コードの詳細説明」をご確認ください。

package mail

import (
  "net/http"

  // [1]
  "appengine"
  "appengine/mail"
)

// [2]
const subject = "Test Send"

// [3]
const mailBody = `
Thank you!

This is demo of Sending Email.
`

func init() {
  http.HandleFunc("/sendEmail", sendEmail)
}

func sendEmail(w http.ResponseWriter, r *http.Request) {
  // Context生成
  ctx := appengine.NewContext(r)
  // [4]
  sender := "送信先Emailアドレス"
  // [5]
  toAddress := []string{"送信先Emailアドレス(1)", “送信先Emailアドレス(2)"}

  // [6]
  msg := &mail.Message{
     Sender:  sender,
     To:      toAddress,
     Subject: subject,
     Body:    mailBody,
  }
  // [7]
  if err := mail.Send(ctx, msg); err != nil {
     // エラーハンドリング
  }
}

サンプルコード2. メール送信

コードの詳細説明

サンプルプログラム1でコメントされている[1]-[7]の詳細は以下の通リです。

[1] メール送信をおこなう上で必須となるモジュールです。

[2] メールのSubjectです。

[3] メールの本文です。

[4] 送信元のEmailアドレスです。前述した通リ指定できるのはGCPプロジェクトの権限を保持しているユーザのEmailアドレスとなります。

[5] 送信先のアドレスを配列で定義します。

[6] 送信メッセージの作成をおこないます。各パラメータについては[2]-[5]をご確認ください。

[7] メール送信を実行します。エラーが発生した場合はif文内のコードが実行されます。エラーハンドリングは適宜おこなってください。

※6 送信元のアドレス(Sender)には、GCPのDeveoperコンソールのAppEngine設定で管理されているEmailアドレスを指定します(画像5参照)。GCPプロジェクトを作成した際のEmailアドレスは、その管理アカウント一覧に自動的に追加されますので、SenderにはGCPプロジェクト作成時のEmailアドレスを指定すれば問題ありません。ただ、もしその他のアドレスを利用したい場合は、以下のURL(画像5の画面)にアクセスし、送信に利用したいEmailアドレス(GmailまたはGoogle Appsアカウント)を追加してください。

https://console.cloud.google.com/appengine/settings?project=[プロジェクトIDを指定]

image08

画像5. AppEngine設定

動作確認

以下の手順に従って動作を確認してください。

1.アプリケーションディレクトリ(※7)直下にmail.goというファイルを作成し、サンプルコード2をコピー・保存します。送信元[4]と送信先[5]については適宜変更をおこなってください。

2.以下のコマンドを実行しアプリをデプロイします。

$ goapp deploy アプリケーションディレクトリ名

3.以下URLにアクセスし、メール送信を実行します。

http://[作成したプロジェクトのIDを指定].appspot.com/sendEmail

4.送信が成功すると、以下のようにメールの受信が確認できます。

image06

画像6. 受信メール

以上が「メール送信」のサンプルコードの動作となります。最後は「Memcache」を学びましょう。

Memcacheを学ぶ

Memcacheは、最大1MBのデータをメモリ上にキャッシュするためのAPIです。開発者は、Google Cloud Datastoreのような永続ストレージ上に保存されているデータをMemcacheに保存することで、アプリケーションの性能(高速なデータ読み出し)を向上させることができます(※7)。

※7 性能向上に加えて、永続ストレージへのread数を減らせることにもなるのでGAEの課金料金も抑えることができます。

サンプルプログラムの説明

以下のコード(サンプルコード3)は、Memcache APIのサンプルプログラムとなります。Key-Value形式のデータをMemcacheに保存後、保存データのKeyからキャッシュデータを参照するサンプルとなります。サンプルコード3のコメント[1]-[4]については「コードの詳細説明」をご確認ください。

package mem

import (
  "net/http"
  "fmt"

   // [1]
  "appengine"
  "appengine/memcache"
)

func init() {
  http.HandleFunc("/mem", mem)
}

func mem(w http.ResponseWriter, r *http.Request) {
  // Context生成
  ctx := appengine.NewContext(r)
  // [2]
  item := &memcache.Item{
     Key:   "myKey",
     Value: []byte("FirstMemcache"),
  }
  // [3] 
  if err := memcache.Add(ctx, item); err == memcache.ErrNotStored {
     // 既に存在するKeyの場合の処理
     fmt.Fprint(w,  "Key already exist. key is ", item.Key)
     return

  } else if err != nil {
     // エラーが発生した場合の処理

  }

  // [4]
  if item, err := memcache.Get(ctx, "myKey"); err == memcache.ErrCacheMiss {
     // キャッシュデータが見つからない場合の処理
  } else if err != nil {
     // エラーが発生した場合の処理
  } else {
     fmt.Fprint(w,  "Value of myKey is ", string(item.Value))
  }
}

サンプルプログラム3. Memcache API

コードの詳細説明

サンプルプログラム1でコメントされている[1]-[4]の詳細は以下の通リです。

[1] Memcacheをおこなう上で必須となるモジュールです。

[2] キャッシュデータを作成します。Keyには文字列、データ本体(Value)にはbyte形式のデータを指定してください。

[3] キャッシュデータの追加をおこないます。エラーハンドリングは適宜おこなってください。

[4] キャッシュデータの参照をおこないます。エラーハンドリングは適宜おこなってください。

動作確認

以下の手順に従って動作を確認してください。

1.アプリケーションディレクトリ直下にmem.goというファイルを作成し、サンプルコード3をコピー・保存します。

2.以下のコマンドを実行しアプリをデプロイします。

$ goapp deploy アプリケーションディレクトリ名

3.以下URLにアクセスし、キャッシュデータの保存・参照プログラムを実行します。

http://[作成したプロジェクトのIDを指定].appspot.com/mem

4.実行すると以下のようにキャッシュされたデータが表示されます。

image04

画像7. サンプルプログラム3の実行

5.次はGCPのDeveloperコンソールからMemcacheに保存されているデータを確認します。
以下のURLにアクセスし、Memcacheの管理画面にアクセスしてください。

https://console.cloud.google.com/appengine/memcache?project=[プロジェクトIDを指定]

6.Memcache管理画面の表示後「Find a key」リンクをクリックしてください。

image07

画像8. Memcache管理画面

7.「Key type」には”Go String”を選択し、「Key」にはプログラム上で指定したキー文字列を入力してください。ただし、Namespaceは空のままにしておいてください(※8)。「Find」ボタンを押下すると、検索でヒットしたKeyが表示されるのでキー名をクリックしてください(画像10参照)。

※8 Namespace(ネームスペース)は空のままにしておいてください。Memcacheはネームスペース毎にデータを保持することができますが、今回のサンプルではネームスペースは指定していません。ネームスペースを未指定でMemcacheにデータを保存した場合、空のネームスペースにデータは保存されます。

image00

画像9. キャッシュデータの検索

8.キー名をクリックすると、キャッシュデータの詳細画面に遷移します。以下(画像10)のように保存されているキャッシュデータが確認できます。キャッシュデータを編集したい場合は「Value」の値を書き換えて「Update Value」ボタンを押下してください。

image01

画像10. キャッシュデータの閲覧

以上で「Memcache」の説明は完了です。

まとめ

以上で「たったの15分でできるGAE/GO入門」の”標準APIその1”は終了です。
サンプルコードとプログラムの動作を通して各APIの理解は深まったでしょうか。疑問点や修正点がある場合はtwitter等で直接ご指摘いただければ幸いです。次回記事は”標準APIその2”となります。apps-gcpではGAE/GO以外にも様々なGCP関連の記事を投稿していますので、ぜひ定期的にチェックしてください!

  • このエントリーをはてなブックマークに追加

Google のクラウドサービスについてもっと詳しく知りたい、直接話が聞いてみたいという方のために、クラウドエースでは無料相談会を実施しております。お申し込みは下記ボタンより承っておりますので、この機会にぜひ弊社をご利用いただければと思います。

無料相談会のお申込みはこちら