前回の記事はこちらです
前回の記事でWindows環境にDockerを入れられたので、Dockerで作られた環境をAWS ECRにアップロードし、Lambdaに入れる作業を学びたいと思います。Docker+pythonを使うのは、TensorFlowを動かしたいからです。
また、S3に「言語を超える力」で読み込ませたい画像をアップロードするのはPythonを使う必要は無いので、JavaScriptで構築したいと思います。その方がメンテナンスしやすいので。
参考記事
やった練習
ecr-tutorial を使ってECRをテストする
Windows環境でのテスト
以下からソースを落とし
github.com
まずはWindows環境でビルド
docker-compose.exe up -d --build
スクリプトをテストしたときに、curlでのエスケープ処理に困ったのでググりながら以下をPOST
curl -d '{\"sentence\":\"I am Taro Yamada.\"}' -H "Content-Type: application/json" http://localhost:9000/2015-03-31/functions/function/invocations
正しくは自然言語処理をされているテストとしてはおかしいのですが、私はあくまでAWS ECR・Lambdaのテストをしたいので一応のこのコマンドで。WIndows版のDockerでは確かにecr-tutorialが動いていることがわかります。
ECRへpush
そもそもECRってAmazon Elastic Container Registryの略だと知る
ググったりしていると略称で紹介されていることが多いので、いきなりのつまづき。どれのことだと悩んだりしました。
PowerShell 向けの AWS Toolsが必要らしい
インストールしてみる
docs.aws.amazon.com
インストーラーをインストール
> Install-Module -Name AWS.Tools.Installer
ECR関連をインストール
> Install-AWSToolsModule AWS.Tools.ECR
テスト
> (Get-ECRLoginCommand).Password Get-ECRLoginCommand: No credentials specified or obtained from persisted/shell defaults.
No credentials specified or obtained from persisted/shell defaults.と怒られたので対応。
AWS Tools for PowerShellの設定と認証の記事に従い対応。
このときPowerShellは管理者で起動させなきゃいけないことに注意。
起動時に認証ファイルを読み込めるようにするには次の記事を参考に
yoshinorin.net
> Import-Module AWSPowerShell Import-Module : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Program Files\WindowsPowerShell\Mod ules\AWSPowerShell\4.1.89\ImportGuard.ps1 を読み込むことができません。
PowerShellでこのシステムではスクリプトの実行が無効になっているため、ファイル hoge.ps1 を読み込むことができません。となったときの対応方法
こちらを参考に対応
qiita.com
諸々再設定してテスト
> (Get-ECRLoginCommand).Password Get-ECRLoginCommand : No region specified or obtained from persisted/shell defaults.
デフォルトのリージョンを設定する必要がある様子。
Get-SSMInstanceInformation : No region specified or obtained from persisted/shell defaults.
こちらの記事を参考に対応
awsjp.com
対応 done
> Set-DefaultAWSRegion ap-northeast-1 > (Get-ECRLoginCommand).Password eyJwYXlsb2FkIjoiTVQw・・・・
うん動いた。
push done
なんとかpush できました。
AWS Lambdaでテスト
aws-cli で削除
> aws.exe ecr list-images --repository-name ecr-tutorial { "imageIds": [ { "imageDigest": "sha256:***", "imageTag": "latest" } ] } > aws.exe ecr batch-delete-image --repository-name ecr-tutorial --image-ids imageDigest=sha256:*** { "imageIds": [ { "imageDigest": "sha256:***", "imageTag": "latest" } ], "failures": [] }
次の目標
JavaScriptでAmazon S3にファイルをアップロード
このあたりが参考になりそうです
qiita.com
S3に画像ファイルを置けば、Lambdaから読み込んで加工できるという寸法です。
Lambdaで画像を加工し、S3に書き込む
このあたりの記事が参考になりそうです。
business.ntt-east.co.jp
S3に処理された画像が書き込まれたら、画像を表示するWeb UIを作る
S3の特定のURLにファイルが書き込まれるはずです、Web UI側でファイルの存在をJavaScriptで(1秒ごとにチェックしにいくとかで)検知し、表示させます。
LambdaでTensorFlowを動かす
ファイル加工部分をTensorFlowにし、TensorFlowさえ動けば「言語を超える力」の処理が行なえます。書き込みはS3にそのまま書き込みます。
進捗
言語を超える力の学習が大分進みました
入力
こちらを入力して
出力
こちらを出力できるぐらいにはなりました。
早くWeb公開したいですね。
終わりに
少しずつ「言語を超える力」のWeb版の形が見えてきました。日々勉強ですね。