ソースコードから理解する技術-UnderSourceCode

手を動かす(プログラムを組む)ことで技術を理解するブログ

AWS SAMによるテンプレートプロジェクト作成~ローカルでの実行

AWS SAMを使い、テンプレートのプロジェクトを作成してローカルで実行するまでの
流れについて纏めてみました。

既に色々なサイトで書かれてはいますが、今後の自分のために書いておきます。
前提として

  • AWS SAMの実行環境が用意されていること
  • 動作確認は(Windows Subsysytem for Linuxの)Ubuntu上で行った

となります。

プロジェクト作成

$  sam init --runtime go1.x --name your-project-name

プロジェクトが作成されるので、以下のようにMakefileを編集しました。

.PHONY: deps clean build

all: deps clean build

deps:
	 go get -u github.com/aws/aws-lambda-go/events
	 go get -u github.com/aws/aws-lambda-go/lambda

clean: 
	rm -rf ./hello-world/hello-world
	
build:
	GOOS=linux GOARCH=amd64 go build -o hello-world/hello-world ./hello-world

ローカルでの実行

AWS SAMのインストールでも必要ですが、実行にはDockerが必要となります。
なのでDockerの起動もコマンドに含んでいます。

$ make
$ sam local generate-event apigateway aws-proxy > event.json # API Gatewayのイベントを記述したjsonを作成
$ sudo service docker start    # docker起動
$ sudo service docker status  # docker起動確認
$ sam local invoke HelloWorldFunction --event event.json

テスト

テストのテンプレートとして作成されるので、その実行コマンドになります。

$ go test -v ./hello-world/

AWS CLI、GolangでS3のPre Signed URLを取得してみる

AWS CLIGolangで、それぞれS3にあるオブジェクトのPre Signed URLを取得してみました。
やってみた背景としては、リクエストがあった時にS3に配置したオブジェクトを安全にリクエスト元へ渡したい、みたいな要件を耳に挟み

  • Pre Singed URLを作ればいいんじゃないのか
  • 取得元IPは固定だろうから、バケットにIP制限を別途つける

みたいなことを思いついたためです。

バケットにIP制限を付けるあたりは、以下が参考になりそうです。
S3でIP制限 - Qiita

AWS CLIでのPre Signed URL取得

事前にバケットを用意し、ファイルを入れておきます。
またAWS CLIのインストールも必要です。

以下のコマンドで取得できました。

# バケットの中身を確認
$ aws s3 ls s3://your-bucket/

# pre signed urlを発行。--expires-inで有効期間の秒を設定
$ aws s3 presign s3://your-bucket/sample.txt --expires-in 120
https://your-bucket.s3.amazonaws.com/sample.txt?AWSAccessKeyID=xxxxx

取得できたPre Signed URLをブラウザに張り付け、ファイルの中身が表示されることを確認します。
有効期間が過ぎたら再度アクセスして、今度はAccess Deniedになることも確認します。

AWS SDKでの取得

次にaws-sdk-goで取得してみます。
公式サイトのサンプルソースを改変し、以下のようなソースで実行してみました。

package main

import (
	"log"
	"os"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func main() {
	region := os.Args[1]
	bucket := os.Args[2]
	key := os.Args[3]

	log.Printf("your region = %s, bucket = %s, key = %s\n", region, bucket, key)

	sess, err := session.NewSession(&aws.Config{
		Region: aws.String(region)},
	)

	svc := s3.New(sess)

	req, _ := svc.GetObjectRequest(&s3.GetObjectInput{
		Bucket: aws.String(bucket),
		Key:    aws.String(key),
	})
	urlStr, err := req.Presign(2 * time.Minute)

	if err != nil {
		log.Println("Failed to sign request", err)
	}

	log.Println("Pre signed url : ", urlStr)
}

ビルドし、引数にリージョン・バケット・キーを渡して実行してみます。

$ ./s3-pre-signed-url-get-sample region your-bucket your-key
2019/03/xx xx:xx:xx Pre signed url :  https://your-bucket.s3.amazonaws.com/sample.txt?AWSAccessKeyID=xxxxx

「Pre signed url : 」以降に出力されるPre Signed URLをブラウザに張り付け、ファイルの中身が表示されることを確認します。
こちらも無事、表示されるかと思います。

まとめ

AWS CLIaws-sdk-goを使ってPre Signed URLを取得できることが分かりました。
後はこれらをアプリに組み込み、リクエストがあり次第、取得したPre Signed URLをリクエスト元に返せばいいことになります。

今回作成したGolangのソースは以下にも載せてあります。
GitHub - SrcHndWng/s3-pre-signed-url-get-sample

Windows Subsystem for Linux上にAWS SAMの実行環境を構築する + Golangの開発環境を用意する

タイトルにあるように、Windows Subsystem for Linux上でAWS SAMを実行する環境を構築してみました。
単純にLinux上にAWS SAMの実行環境を構築するだけと思いきや、細々と調べながら進めることになったので
その結果をメモ代わりに書いておきます。

Windows Subsystem for Linux

こちらについては特にはまるようなポイントはないです。
今回はUbuntu 18.04で用意しました。

AWS SAM

https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html
こちらの公式のガイドを見ればわかるのですが、AWS SAMのCLIの実行には

が必要となります。

Windows Subsystem for LinuxでDockerを動かすのが結構癖がありました。
結論から書いてしまうと

  • Dockerは17.09.0を使った
  • Windows Subsystem for Linuxを起動するコマンドプロンプト(やパワーシェルのターミナルなど)は管理者権限で起動しておく必要がある
  • 管理者権限で起動したターミナル上でdockerを起動しておいたうえで、AWS SAMのコマンドを実行する必要がある

ということになります。

詳細については既に詳しく書かれている方がいたので、そちらを参考にしてください。
どうしても Docker on Ubuntu 18.04 on WSL したかった - Qiita
Windows10 Home の WSL で Docker を使う - Qiita

Golangの開発環境

Windows Subsystem for LinuxAWS SAMを実行するにあたり、

を実現したいと思いました。

結果

ことになりました。

詳細については既に詳しく書かれている方がいたので、そちらを参考にしてください。
WSLENVでWSLとWindowsの環境変数を共有する(Go開発環境編) | re-imagine

まとめ

こんな感じで、一つ一つは簡単なのですが、結構色々と調べつつ環境の構築ができました。
最後に、今回参考にさせていただいたサイトのURLを載せておきたいと思います。

gbのテストで特定のものを実行する、結果を色付けする

タイトルにあるように、gbのテストで

  • 特定のパッケージ、メソッドを実行する
  • テストの結果の詳細を表示する、結果を色付けして分かりやすくする

方法についてです。
ただgbだけでなく、普通の「go test」でも使えるかと思います。
(go testの場合は「gb」を「go」に変えるだけです。)

パッケージ・メソッドを指定、詳細を表示する方法

まず、パッケージ・メソッドを指定、詳細を表示する方法についてです。
以下のようなコマンドとなります。

gb test パッケージ名 -run テスト対象メソッド -v

それぞれについて説明すると

  • パッケージ名 ・・・ gb test の後にテスト対象のパッケージ名を指定
  • -run ・・・ テスト対象のテストメソッド名を指定
  • -v ・・・ 詳細を出力するためのオプション

です。

結果を色づけする方法

次に結果を色づけする方法についてです。
testing - colorizing golang test run output - Stack Overflow
こちらのstackoverflowの記事を参考にし、今回はsedで特定のキーワードを色付けすることにしました。

先のコマンドの結果をパイプで繋げ、以下のように実行します。

gb test パッケージ名 -run テスト対象メソッド -v \
| sed ''/RUN/s//$(printf "\033[33mRUN\033[0m")/'' \
| sed ''/PASS/s//$(printf "\033[32mPASS\033[0m")/'' \
| sed ''/FAIL/s//$(printf "\033[31mFAIL\033[0m")/'' \
| sed ''/error/s//$(printf "\033[31merror\033[0m")/''
  • RUN ・・・ 黄色
  • PASS ・・・ 緑
  • FAIL ・・・ 赤
  • error ・・・ 赤

にそれぞれ色づけしています。
色の指定については以下のサイトを参考にしました。

http://yonchu.hatenablog.com/entry/2012/10/20/044603

これでGolangのテストについて、ターミナルから実行する場合に少しやり易くなるかと思います。
色を変えるsedコマンドについては、シェルスクリプトなどに書いておいて、パイプでシェルに渡してもいいかもです。

ビルドツールのgbをVisual Studio Codeで使ってみる

Golangのビルドツールのgbを試してみました。
私は普段Visual Studio Codeを使っているので、こちらでエラーとならないよう設定もしました。

gbを使うメリットとしては

  • 自分が作成したpackageをimportする際にGopathからのフルパスを書かなくていい
  • 使用する外部ライブラリを定義ファイルに記述できる

などです。

以下、私が使用したときの手順メモです。

プロジェクトについて

プロジェクト直下のsrcフォルダ内に自分で作成するソース、vendorフォルダ内に外部ライブラリを保存します。
今回はGitHub - fatih/gb-example: Example gb project with dependencies and CI integrationという、gbを使ったサンプルプロジェクトがあったので
こちらが動くかどうかを試してみました。

git cloneでプロジェクトをダウンロードしてきます。

git clone https://github.com/fatih/gb-example.git

Visual Studio Codeの設定

File - Preferences - Settings より設定を行います。
まだgbを使っているのはこのプロジェクトのみなので、今回はローカルプロジェクトのみ設定する
Workspace Settingsの方に以下の設定を行いました。

gbの使用について

  • vendor/manifestに使用するライブラリを記載される。
  • なのでvendor/manifest以外はGithub等に上げる必要はない。

外部ライブラリの取得、更新

$ gb vendor update -all

ビルド、テスト

$ gb build
$ gb test

AWSのロードバランサーについて調べてチラシの裏書きw

AWSロードバランサーについて、今更ながら調べてみました。
とはいっても既に様々なサイトで情報が公開されているので、詳細についてはそれらを参考にした方がいいかと思います。
(公式のドキュメントもかなり充実しているし)

なのでここではチラシの裏書きレベルの纏めと、調べてみた際に参考にしたリンク集という形にしたいと思います。

AWSロードバランサーについて

現時点で以下の3種類がある。

  • ELB(Clasic Load Balancer)
  • ALB(Application Load Balancer)
    • ネットワークのOSI参照モデルの第7層(アプリケーションレイヤー)で機能する。
    • 普通のHTTP関係のロードバランシングに使用する。
  • NLB(Network Load Balancer)

「増補改訂Pythonによるスクレイピング&機械学習開発テクニック」を読んだ

増補改訂Pythonによるスクレイピング&機械学習開発テクニック(クジラ飛行机) | 書籍 本 | ソシム
を読みました。以下、その短い感想になります。

本のタイトル通り、Pythonによるスクレイピング機械学習の本なのですが

  • 開発環境の構築
  • 機械学習とはなんぞや
  • 数学がどのように使われるのか
  • 機械学習や深層学習の基礎的な例とサンプルソース
  • それらを使ったサンプルアプリケーションの例

あたりが網羅されていました。

かなり丁寧にプログラムについて解説されているため、ほぼ本を読み進めながら
実装について読み進めていくことが出来ました。
(自分の場合はローカルで実際に実行しないと理解できないことも多いのですが)

機械学習を始めるところ(つまり開発環境の構築)~機械学習の実例まで書かれているので

  • どのように始めるべきか
  • それを使って何ができるのか
  • 具体的なソースコードレベルでどのように実装しているのか

を知ることができたことが良かったというのが、読んでの感想です。