AWS-SAM-CLIとDynamoDBLocalインストール

前回書いたSAM-CLIの件からだいぶ間が空いてしまいました。

参考:前回分
Lambdaも実はSAM-CLI使わずに開発できるレベルのコードしか書かないのでコンソールの方のエディタで開発していましたが、
ここにきて会社の方から課金云々とかいう細かい話をされだしたので、ならローカルに
環境作らないとなぁとサーバレスの代表的構成例であるAPI-Gateway+Lambda+DynamoDBという
お約束なやつをローカルの環境に構築しました。

※EC2の上に立てるとお金がかかるとか言われてうるさいので、Windows10Proの
 Hyper-V上にUbuntu18.04LTS入れてそこに環境構築しましたよ。WSL使ったほうが
 いいんだろうけど不安な面もあるので安定のUbuntuでやります。会社のしょぼいPC
 では挙動が怪しいですがまぁ16GBメモリあれば動くんじゃなかろうかと思います。
 ちなみに会社PCはcore-i3にメモリ8GBと糞of糞なスペックです。

とりあえず、手順をサラッと書いていきます。というよりdocker-compose.ymlにまとめとけよとかいう突っ込みはなしで(いつかはやりたいなぁ、、、)


#1.日本語化
$ sudo sed -i.bak -e "s%http://us.archive.ubuntu.com/ubuntu/%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list
$ sudo apt-get -y install language-pack-ja-base language-pack-ja ibus-mozc
$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja" 
$ source /etc/default/locale
$ echo $LANG
ja_JP.UTF-8
#タイムロケール変更
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl 
#ソフトウェアアップデート
$ sudo apt-get -y update
$ sudo apt-get -y upgrade
#ディストリビューションアップデート
$ sudo apt-get -y update
$ sudo apt-get dist-upgrade
#treeコマンドインストール
$ sudo apt-get -y install tree
#ssh用証明書作成
#TeraTermでKey作成後にWinSCPでpubファイルアップロード後に以下のコマンド実行
$ mkdir .ssh
$ chmod 700 .ssh
$ mv id_rsa.pub .ssh/authorized_keys
$ reboot
#sshd_config編集
$ sudo sed -i -e "s/#PubkeyAuthentication/PubkeyAuthentication/g" /etc/ssh/sshd_config
$ sudo sed -i -e "s/#PasswordAuthentication yes/PasswordAuthentication no/g" /etc/ssh/sshd_config
$ sudo service sshd restart

#2.Docker周り
#パッケージ更新
$ sudo apt-get -y update
#https経由のaptリポジトリ許可
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
#PGP-KEY取得
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
#DockerCEインストール
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get -y install docker-ce
#sudoなしDockerコマンド実行可能設定
$ docker -v
Docker version 18.09.1, build 4c52b90
$ sudo usermod -aG docker $(whoami)
$ sudo service docker restart
$ docker info

#Docker-composeインストール
$ export compose='1.24.0'
$ sudo curl -L https://github.com/docker/compose/releases/download/${compose}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
$ sudo chmod 0755 /usr/local/bin/docker-compose
$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ sudo systemctl enable docker

#3.pythonインストール
#pyenvインストール
$ sudo apt install python-dev python-pip
$ sudo apt install python3-dev python3-pip
$ sudo apt -y install make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
$ pyenv install 3.7.3
$ pyenv local 3.7.3
$ python --version
Python 3.7.3
$ sudo apt -y install jq

#4.AWS開発環境周り
#AWS-CLIインストール
$ pip install awscli --upgrade --user
$ echo 'export PATH="~/.local/bin:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ aws --version
aws-cli/1.16.152 Python/3.7.3 Linux/4.15.0-48-generic botocore/1.12.142
$ aws configure
AWS Access Key ID [None]:AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: ap-northeast-1
Default output format [None]: json

#DynamoDB local
$ mkdir docker-dynamodb
$ cd docker-dynamodb
$ vi docker-compose.yml

以下yamlファイル
+--------------------------------------------------------------------
version: '3.3'

services:
  dynamodblocal:
    image: amazon/dynamodb-local
    networks:
      - default
    ports:
      - 8000:8000
    command: -jar DynamoDBLocal.jar -sharedDb -dbPath ./data
    volumes:
      - /home/nishimrm/docker-dynamodb/dynamodb_data:/home/dynamodblocal/data
    networks:
      - lambda-local

  dynamodbadmin:
    image: instructure/dynamo-local-admin
    networks:
      - default
    ports:
      - 8001:8001
    environment:
      DYNAMO_ENDPOINT: http://localhost:8000/
  
  sam-api-local:
    networks:
      - default
    ports:
      - 3000:3000
      
networks:
  sam-api-local:
    external: true
+--------------------------------------------------------------------
#Docker-compose起動
$ docker network create sam-api-local
$ docker-compose up -d

#SAM-CLIインストール
$ cd
$ pip install aws-sam-cli
$ pip install boto3
$ sam --version
SAM CLI, version 0.11.0

#サンプルアプリケーション作成
$ sam init --runtime python3.7 --name testpj
$ cd testpj
$ cd hello_world
#$ pip install -r requirements.txt -t hello_world/build/
$ vi app.py

importのセクションに以下を追記
+--------------------------------------------------------------------
from botocore.vendored import requests
+--------------------------------------------------------------------

$ cd ../
$ sam local generate-event apigateway aws-proxy > ./event.json
$ sam local invoke "HelloWorldFunction" -e event.json
2019-02-12 14:41:31 Invoking app.lambda_handler (python3.7)
Fetching lambci/lambda:python3.7 Docker container image.....
~中略~
Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 25 MB
{"statusCode":200,"body":"{\"message\": \"hello world\"}"}

#SAM-CLIのAPIGateway起動
$ sam local start-api --docker-network sam-api-local --host 0.0.0.0


■参考サイト
https://qiita.com/fkshom/items/53de3a9b9278cd524099
https://webkaru.net/linux/tera-term-ssh-login-public-key/
https://qiita.com/mochizukikotaro/items/ae7ae1461ea4bf495bd0
https://qiita.com/ksh-fthr/items/2b899e3e4c918707afb0
https://qiita.com/iganari/items/fe4889943f22fd63692a
https://qiita.com/homines22/items/00eebe3c36a9591c3803
https://qiita.com/KuwabataK/items/a33c625d1472b0ab2e16
https://knowledge.sakura.ad.jp/13795/
http://docs.docker.jp/compose/toc.html
https://qiita.com/FJKei/items/5589ad89eed14e486d27
https://qiita.com/okyk/items/a374ddb3f853d1688820
https://qiita.com/zembutsu/items/9e9d80e05e36e882caaa
http://docs.docker.jp/compose/faq.html#up-run-start
https://qiita.com/take4s5i/items/db018ef6d8e4bbd10639
https://www.yoheim.net/blog.php?q=20170204
https://www.komee.org/entry/2018/10/25/120000
https://qiita.com/ysdyt/items/5008e607343b940b3480
https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b
https://www.shigemk2.com/entry/aws_cli_without_credentials
https://gokigenmaru.hatenablog.com/entry/2018/12/07/142347
https://www.techscore.com/blog/2018/09/15/dynamodb-local-docker/
https://www.m3tech.blog/entry/advent-calendar-2018-6
https://qiita.com/tamo_breaker/items/f86c9b5fc6991813e3ca
https://qiita.com/gzock/items/e0225fd71917c234acce
https://www.scriptlife.jp/contents/programming/2018/10/21/aws-docker-dynamodb-local/
https://qiita.com/jacoyutorius/items/72984ff07b3b30576d43
https://www.ketancho.net/entry/2017/12/25/030849
https://techte.co/2018/08/31/aws-sam-cli/
https://githubja.com/awslabs/aws-sam-cli
https://shinodogg.com/?p=7750
https://toris.io/2017/12/aws-sam-as-a-good-development-toolchain-for-serverless-apps/
https://qiita.com/gnk263/items/7f8796c26b9b61d33d96
https://dev.classmethod.jp/server-side/serverless/sam-try-and-error/
https://dev.classmethod.jp/server-side/serverless/python-remote-debug/
https://qiita.com/gzock/items/157c8904f415a636a6ed
https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-quick-start.html
https://qiita.com/Yuki10/items/7a445a108b63b9298071
https://infraya.work/pip-saved-error/
http://icchy.hatenablog.jp/entry/2018/04/17/064443
https://githubja.com/awslabs/aws-sam-cli
https://dev.classmethod.jp/etc/sam-local-with-localstack/
https://qiita.com/selmertsx/items/89966d2ad81227d0b250
https://kou.bz/blog/docker-network-constitution.html
http://ritei91.blog.fc2.com/blog-entry-143.html
http://mussyu1204.myhome.cx/wordpress/it/?p=115

モダンな開発手法もこれからやってかないといけないし、テスト駆動開発とか
もマスターできていないと世間的に置いて行かれてしまうから頑張らないと。
というより、、、このローカル開発環境果たして使いこなせるのかオレ?

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)