AWS CLI、GolangでS3のPre Signed URLを取得してみる
AWS CLIとGolangで、それぞれ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 CLI、aws-sdk-goを使ってPre Signed URLを取得できることが分かりました。
後はこれらをアプリに組み込み、リクエストがあり次第、取得したPre Signed URLをリクエスト元に返せばいいことになります。
今回作成したGolangのソースは以下にも載せてあります。
GitHub - SrcHndWng/s3-pre-signed-url-get-sample
参考サイト
以下のサイトを参考にさせていただきました。
ありがとうございました。
【小ネタ】AWS CLIでS3のPre-Signed URLを生成できるようになっていました! | Developers.IO
https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/s3-example-presigned-urls.html
Windows Subsystem for Linux上にAWS SAMの実行環境を構築する + Golangの開発環境を用意する
タイトルにあるように、Windows Subsystem for Linux上でAWS SAMを実行する環境を構築してみました。
単純にLinux上にAWS SAMの実行環境を構築するだけと思いきや、細々と調べながら進めることになったので
その結果をメモ代わりに書いておきます。
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 LinuxでAWS SAMを実行するにあたり、
- Windows上のエディタ(Visual Studio Code) で入力補完を利かせる
- Windows Subsystem for Linux上でビルドを行う
を実現したいと思いました。
結果
- WindowsとWindows Subsystem for Linuxの両方に同じバージョンのGolangをインストールする
- WindowsとWindows Subsystem for LinuxでGOPATHを共有する
ことになりました。
詳細については既に詳しく書かれている方がいたので、そちらを参考にしてください。
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の方に以下の設定を行いました。
- Gocode Package Lookup Mode : gb に変更。
- go.gopathを「"go.gopath": "${workspaceRoot};${workspaceRoot}/vendor"」に設定。
- Windowsだとカンマ区切りか?
- 参考 https://github.com/Microsoft/vscode-go/issues/249
- buildOnSave : offに変更。
gbの使用について
- vendor/manifestに使用するライブラリを記載される。
- なのでvendor/manifest以外はGithub等に上げる必要はない。
外部ライブラリの取得、更新
$ gb vendor update -all
ビルド、テスト
$ gb build $ gb test
「増補改訂Pythonによるスクレイピング&機械学習開発テクニック」を読んだ
増補改訂Pythonによるスクレイピング&機械学習開発テクニック(クジラ飛行机) | 書籍 本 | ソシム
を読みました。以下、その短い感想になります。
本のタイトル通り、Pythonによるスクレイピングや機械学習の本なのですが
あたりが網羅されていました。
かなり丁寧にプログラムについて解説されているため、ほぼ本を読み進めながら
実装について読み進めていくことが出来ました。
(自分の場合はローカルで実際に実行しないと理解できないことも多いのですが)
機械学習を始めるところ(つまり開発環境の構築)~機械学習の実例まで書かれているので
- どのように始めるべきか
- それを使って何ができるのか
- 具体的なソースコードレベルでどのように実装しているのか
を知ることができたことが良かったというのが、読んでの感想です。
DockerにてPythonの開発環境を作成するためのコマンド
タイトルにあるように、DockerにてPythonの開発環境を作成するためのコマンドのメモです。
ホストOSはWindows 10、Docker for Windowsはインストール済という状態からです。
ローカルイメージ確認~イメージダウンロード~起動
Python3.6のイメージをダウンロードして起動するまでです。
$ docker images # イメージ名:バージョン番号でダウンロードするイメージを指定。 # /bin/bashを入れることでコンテナのシェルに入れる $ docker run -it python:3.6 /bin/bash $ python --version
コンテナ内からapt getが出来ない場合
「Temporary failure resolving・・・」というエラーメッセージが出た場合の対応方法です。
Docker Desktopの「Settings」「Network」にて「DNS Server」を「Fixed」を選択します。
vimのインストール
作業をするのに便利なようにvimをインストールしておきます。
コンテナ内で以下のコマンドを実行するか、もしくはDockerfileに記述してコンテナ作成時にインストールしてもいいかと思います。
$ apt-get update $ apt-get install -y vim
Dockerfileによるイメージの作成~アプリのデプロイ
こちらについては以下のサイトの内容を一通りやってみたら理解できました。ありがとうございました。
https://qiita.com/ksh-fthr/items/e914ff213791b7150008
ザックリとした作業内容は以下となります。
- Dockerfileにベースとなるコンテナ、デプロイ処理、アプリ起動処理などを記述し、Dockerfileからコンテナを作成する。
- (Pythonの場合) requirements.txtに必要なモジュールは記述する。
- Webアプリの場合は以下のようにコンテナを起動してコンテナのポートとホストのポートを紐づける
# ホストポート番号:コンテナポート番号 イメージ名 を指定 $ docker run -d -p 4080:80 image_name