サーバーレスWebAPI開発に入門できました

前回の記事の続きです。
go-swaggerを使うのをやめて、Ginというフレームワークを使う事で無事入門できました。

nns7.hatenablog.jp

Ginフレームワークの使い方はこちらの記事を参考にさせて頂きました。

selfnote.work

ソースコードを公開してます。参考になれば幸いです。

GitHub - nns7/serverless-api-go-tutorial

  • 開発環境
  • DynamoDB Localをローカルにデプロイする
    • docker-compose.yml
  • APIサーバーをローカルに立てる
    • main.go
    • db.go
  • APIサーバーにリクエストを投げてみる
    • ユーザーの登録
    • ユーザーの一覧
    • ユーザーの更新
    • ユーザーの削除
  • 参考
続きを読む

サーバーレスWebAPI開発に入門しようとしたけどうまくいかなかった話

AWS DAVの勉強をしていたら、Lambdaを使えばとても簡単にWebAPIが作れてしまうのでは?と感じたので、 ググって最初にヒットしたこちらの記事を参考に、サーバーレスWebAPIを作ろうとしたらうまくいかなかった話です。

なお、Terraformを使ったインフラ構築は特に詰まることも無かったので本記事では触れません。

future-architect.github.io

そもそもWindowsの開発環境で無理やりやっている事が原因だと考えていますが、 Dockerfileの書き方とか色々調べてて勉強になったので書き残しておきます。
記事の内容が間違っているぞということが主旨ではないです。

  • 開発環境
  • Dockerコンテナ上にGolang開発環境を作る
    • フォルダ構成
    • Dockerfile
    • docker-compose.yml
  • curlコマンドを叩くと502が返ってきてお手上げに
  • WSL2がホストのメモリを浪費する現象の対策
  • 参考
    • 開発環境系
    • Alpine Linux
    • メモリ浪費の暫定対処系
続きを読む

AWSソリューションアーキテクトアソシエイト(SAA-C02)体験記

はじめに

経験ゼロの状態から始めて、AWSソリューションアーキテクトアソシエイトに合格しました。
記念に、なんで受験することにしたかとか、どのように勉強していったかとか残しておこうと思います。

f:id:lockedgirl:20211107220232p:plain

続きを読む

PlayFrameworkのチュートリアル(挫折版)

前回の記事の続きです。

HelloWorldを表示したので、次はチュートリアルに沿ってサンプルアプリケーションを組んでみたいところですが、 公式のPlay 2.4のドキュメントには英語のチュートリアルしか無いようなので、 Play 2.2の時の日本語チュートリアルを参考にTODO管理アプリケーションを組んでいきたいと思います。
…って思ってたけど、Taskモデルの準備のところでJavaの書き方がわからず挫折しました!
誰かの参考になるかもなので途中まで書いたものは残しておきます。。。

概要

conf/rotesファイルを開きますが、書き方がチュートリアルとちょっと変わっています。

GET     /                           controllers.HomeController.index

が、意味は一緒です。app/contorollers/HomeController.javaを開いてみます。

package controllers;

import play.mvc.*;

public class HomeController extends Controller {

    public Result index() {
        return ok(views.html.index.render());
    }

}

どうやらindex()メソッドが動いて、HTMLコンテンツを含む200 OKレスポンスを返しているようです。
HTMLコンテンツとのマッピングviews.html.(HTMLのファイル名).render()という書き方になるようです。
次はapp/views/index.scala.htmlを開いてみます。

@()

@main("Welcome to Play") {
  <h1>Welcome to Play!</h1>
}

ここはチュートリアルと違ってべた書きしてあります。

開発フロー

チュートリアルのようにcontrollersからviewsに値を渡したい場合、どのように書けばよいでしょうか。
まずapp/views/index.scala.htmlを開いて次のように書き換えます。

@(message: String)

@main("Welcome to Play") {
  <h1>@message</h1>
}

次にapp/contorollers/HomeController.javaを開いて次のように書き換えます。

package controllers;

import play.mvc.*;

public class HomeController extends Controller {

    public Result index() {
        return ok(views.html.index.render("Hello World"));
    }

}

書き換えたらブラウザからlocalhost:9000を開いてみます。
Hello Worldと表示されるはずです。
viewsの一行目に変数を宣言すれば、controllersから引数を渡せることがわかりました。

アプリケーションの準備

conf/rotesファイルを編集します。以下の3行を追加します。

# Tasks
GET     /tasks                      controllers.HomeController.tasks
POST    /tasks                      controllers.HomeController.newTask
POST    /tasks/:id/delete           controllers.HomeController.deleteTask(id: Long)

ブラウザをリロードするとチュートリアルのようにコンパイルエラーが発生する事が確認できます。 次にapp/contorollers/HomeController.javaに以下の行を追加します。

public Result tasks() {
    return TODO;
}

public Result newTask() {
    return TODO;
}

public Result deleteTask(Long id) {
    return TODO;
}

ブラウザからlocalhost:9090/tasksを開くとTODOが表示されます。
チュートリアルと同じようにindexアクションが呼び出された時に、tasksアクションにリダイレクトするようにします。

public Result index() {
    return redirect(routes.HomeController.tasks());
}

Taskモデルの準備(ここで挫折)

Javaで書く場合はModelクラスを継承したTaskクラスをmodels/Task.javaとして実装すれば良さそうでしたが、なんのパッケージのModelクラスをimportすればよいかわからず手詰まりになりました。

感想

ググると日本語の情報はわりとすぐ出てくるのですが、Playのバージョンが2.2の時と2.4の時と2.6の時で若干やり方が違うようで、いい感じに読み替えたり英語のドキュメントにあたるスキルが必要そうだと感じました。 作ってみたいWebアプリケーションはあるので、日本語のチュートリアルが充実している(と思われる)Ruby on Railsに挑戦してみたいと思います。

PlayFrameworkをIntelliJ IDEA CommunityにインポートしてHelloWorld

昔ちょっと触ったPlay Frameworkを使ってアプリを作ってみようと思ったけど、 やり方が昔と変わっててググっても最新の情報がいい感じにまとまってるところが無かったので、 備忘録的にメモしつつ始めてみた。

筆者の環境

Windows 10 Home(64bit)

インストールするもの

  • JDK 8(update 192)*1
  • IntelliJ IDEA(version.2018.3.2)
  • sbt(1.2.7)

JDK 8のインストール

  1. OracleのサイトからJava SEのダウンロードページへアクセス。
  2. Java SE 8のJDK Downloadボタンをクリック。
  3. Java SE Development Kit 8u192と書いてある場所のAccept License Agreementにチェックを入れる。
  4. Product / File Descriptionの列にWindows x64と書いてある行のDownloadリンクをクリック。
  5. ダウンロードが完了したらインストーラーを起動。画面の指示に従ってインストール。
  6. 途中、ライセンス条項の変更ウィンドウが表示されたらOKボタンをクリック。
  7. コピー先フォルダウィンドウが表示される。変更ボタンから任意のインストール先を選択し、次ボタンをクリック。
  8. 正常にインストールされましたと表示されたら閉じるボタンをクリック。
  9. システム環境変数JAVA_HOMEを追加。筆者の場合はC:\Program Files\Java\jdk1.8.0_192とした。
  10. システム環境変数からPathを選択して設定を追加。%JAVA_HOME%\binを追加。
  11. インストールが成功しているか確認するためにコマンドプロンプトを起動。以下のコマンドを入力して実行する。
> java -version  

 次のように表示されたら成功です。

java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)

 javaコンパイラにもパスが通っているか確認する。

> javac -version

javac 1.8.0_192

IntelliJ IDEAのインストール

  1. JetbrainsのサイトからIntelliJ IDEAのページへアクセス
  2. 中央のDownloadボタンをクリックするとダウンロードページへ。  Ultimate版かCommunity版かを選ぶページへ移動するので、今回はCommunity版を選択。
  3. Downloadボタンの横からexeかzipか選べる。特に拘りも無いのでexeを選んでDownloadボタンをクリック。
  4. ダウンロードが完了したらインストーラーを起動。画面の指示に従ってインストール。 (パスにブランクが入るのがなんか嫌だったので、インストール先をProgram Filesから変更した)
  5. インストールが完了したら早速起動してみる。
  6. Complete Installationウィンドウが表示されるので、「Do not import settings」を選択してOKボタンをクリック。 (他の開発環境で使ってた設定をインポートできるっぽい?)
  7. Jetbrains Privacy Policyウィンドウが表示されるので、Agreementにチェックを入れてContinueボタンをクリック。
  8. Data Sharingウィンドウが表示される。お好みでSend Usage StattisticsボタンかDon't sendボタンをクリック。
  9. Set UI themeウィンドウが表示されるので好みのUIを選択してNext: Default pluginsボタンをクリック。
  10. Default pluginsウィンドウが表示される。必要なプラグインがあればここで選択。自分の場合はよくわからなかったのでそのままNext: Featured pluginsボタンをクリックした。
  11. Featured pluginsウィンドウが表示される。Play Frameworkの開発にはScalaプラグインが必要みたいなので、このウィンドウでScalaのInstallボタンをクリック。  プログレスバーの表示がInstalledになったらStart using IntelliJ IDEAボタンをクリック。

sbtのインストール

  1. ダウンロードページへアクセス
  2. SBT-1.2.7.MSIボタンをクリック
  3. ダウンロードが完了したらインストーラーを起動。画面の指示に従ってインストール。
  4. インストールが完了したらFinishボタンをクリック。
  5. インストールが成功しているか確認するためにコマンドプロンプトを起動。以下のコマンドを入力して実行する。
> cd <sbtがカレントディレクトリ直下にtargetフォルダを作成してしまうので適当なフォルダを作成しておく>
> mkdir project
> sbt console

 次のように表示されたら成功です。

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0
[info] Updated file d:\develop\sbt\project\build.properties: set sbt.version to 1.2.7
[info] Loading project definition from D:\develop\sbt\project
[info] Updating ProjectRef(uri("file:/D:/develop/sbt/project/"), "sbt-build")...
[info] Done updating.
[info] Set current project to sbt (in build file:/D:/develop/sbt/)
[info] Updating ...
[info] Done updating.
[info] Starting scala interpreter...
Welcome to Scala 2.12.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_192).
Type in expressions for evaluation. Or try :help.
  1. 次のコマンドを入力してsbtコンソールを終了します。
scala> :quit

プロジェクトの作成

  1. コマンドプロンプトを起動し、プロジェクトを作成する適当なディレクトリに移動。
> cd <プロジェクトを配置するディレクトリ>
  1. 新規プロジェクトを作成。Javaで作りたかったのでseedはJavaを選択。
> sbt new playframework/play-java-seed.g8
This template generates a Play Java project
name [play-java-seed]: 

 プロジェクト名を聞かれるので「helloworld」と入力。organizationは何も入力せずデフォルトのままとした。

name [play-java-seed]: helloworld
organization [com.example]:

Template applied in D:\develop\play\.\helloworld

作成したプロジェクトをIntelliJ IDEAにインポート

  1. IntelliJ IDEAを起動。Import Projectを選択。
  2. インポートするプロジェクトのルートディレクトリを選択。(先程作成したhelloworldプロジェクトを選択する)
  3. インポートするプロジェクトの種類を聞かれるので、[Import porject from external model]にチェックを入れsbtを選択してNextボタンをクリック。
  4. Import Projectウィンドウが表示される。Porject JDKのNew...ボタンをクリックしてJDKを選択。
  5. ディレクトリを選択するウィンドウが表示される。最初にインストールしたJDK 8のインストール先を選択してProject JDKが変更されたらFinishボタンをクリック。
  6. Tip of the Dayウィンドウが表示されたら[Show tips on startup]のチェックを外してCloseボタンをクリック。
  7. dump project structure from sbtやらimport to intellij project modelやら表示されるので終わるまで待つ。(結構長い。15分くらい)

Hello worldしてみる

  1. IntelliJのターミナルを開き、sbt runと入力する。
  2. ブラウザから「http://localhost:9000」にアクセスしてみる。
  3. Welcome to Play!と表示されたら成功です。お疲れ様でした。

*1:執筆時点での最新のOracle JDKは11だが有償サポートがどうのOpen JDKがどうのでよくわからないので、とりあえずPlay Frameworkが必須としているJDK 8をインストールすることにした。