/aws_sam_nodejs_hands-on

AWS サーバーレスアプリケーションモデル (AWS SAM) ハンズオン(Node.js)

Primary LanguageJavaScriptMIT LicenseMIT

AWS SAM Node.js Hands-on

目的

AWS サーバーレスアプリケーションモデル (AWS SAM) ハンズオン(Node.js)

前提

ソフトウェア バージョン 備考
node 8.10.0
sam 0.6.0
docker 17.06.2
docker-compose 1.21.0
vagrant 2.0.3

構成

  1. 構築
  2. 配置
  3. 運用
  4. 開発

構築

開発用仮想マシンの起動・プロビジョニング

  • Dockerのインストール
  • docker-composeのインストール
  • pipのインストール
vagrant up
vagrant ssh

開発パッケージのインストール

  • aws-sam-cliのインストール
  • nvmのインストール
  • Node.jsのインストール
pip install --user aws-sam-cli
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.3/install.sh | bash
source ~/.bashrc 
nvm install v8.10
nvm alias default v8.10

ドキュメント環境構築

cd /vagrant
curl -s api.sdkman.io | bash
source "/home/vagrant/.sdkman/bin/sdkman-init.sh"
sdk list maven
sdk use maven 3.5.4
sdk list java
sdk use java 8.0.181-zulu
sdk list gradle
sdk use gradle 4.9

ドキュメントのセットアップ

cd /vagrant/
touch build.gradle

build.gradleを作成して以下のコマンドを実行

gradle build

ドキュメントの生成

gradle asciidoctor
gradle livereload

http://192.168.33.10:35729/に接続して確認する

パイプラインの構築

cd /vagrant/ops/code_pipline
./create_stack.sh 

buildspec.ymlとビルド用スクリプトをプロジェクト直下に追加する

cd /vagrant/
npm init
npm install npm-run-all mocha chai eslint husky nyc --save-dev
npx install-peerdeps --dev eslint-config-airbnb

以下のnpmスクリプトを追加する

  "scripts": {
    "pre-commit": "npm run lint",
    "pre-push": "npm run coverage",
    "build": "npm-run-all build:*",
    "build:hello_world": "cd sam-app/hello_world ; npm install",
    "lint": "npm-run-all lint:*",
    "lint:hello_world": "eslint sam-app/hello_world/app.js",
    "test": "npm-run-all test:*",
    "test:hello_world": "mocha sam-app/hello_world/tests/*",
    "coverage": "npm-run-all coverage:*",
    "coverage:hello_world": "nyc --reporter=html --reporter=text mocha sam-app/hello_world/tests/*"
   },

⬆ back to top

配置

AWS認証設定

cd /vagrant/sam-app
cat <<EOF > .env
#!/usr/bin/env bash
export AWS_ACCESS_KEY_ID=xxxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxxx
export AWS_DEFAULT_REGION=us-east-1
EOF

アクセスキーを設定したら以下の操作をする

source .env
aws ec2 describe-regions

デプロイ

デプロイ用のS3バケットを用意する

aws s3 mb s3://nodejs-hands-on

デプロイを実行する

cd /vagrant/sam-app
sam validate
sam package --template-file template.yaml --s3-bucket nodejs-hands-on --output-template-file packaged.yaml
sam deploy --template-file packaged.yaml --stack-name nodejs-hands-on-development --capabilities CAPABILITY_IAM

デプロイが成功したら動作を確認する

aws cloudformation describe-stacks --stack-name nodejs-hands-on-development --query 'Stacks[].Outputs[1]'

パッケージで以下のエラーが出たら次のコマンドを実行する

Unable to upload artifact hello_world/ referenced by CodeUri parameter of HelloWorldFunction resource.
ZIP does not support timestamps before 1980
find . -mtime +10950 -print -exec touch {} \;

⬆ back to top

運用

スタックの削除

aws cloudformation delete-stack --stack-name nodejs-hands-on

S3バケットの削除

aws s3 rb s3://nodejs-hands-on --force

git-secretsの設定

インストール

cd /home/vagrant
git clone https://github.com/awslabs/git-secrets.git
cd git-secrets/
make install
cd ..
rm -rf git-secrets/

既存プロジェクトにフックを設定

cd /vagrant
git secrets --install

拒否条件を設定

git secrets --register-aws --global

レポジトリをスキャンする

cd /vagrant
git secrets --scan -r 

許可ルールを追加する

git config --add secrets.allowed sam-app/hello_world/event_file.json

⬆ back to top

開発

アプリケーションの作成

cd /vagrant
sam init --runtime nodejs
cd sam-app

ローカルでテストする

cd hello_world
npm install
npm test
sam local generate-event apigateway aws-proxy > event_file.json
cd ..
sam local invoke HelloWorldFunction --event hello_world/event_file.json
sam local start-api --host 0.0.0.0

http://192.168.33.10:3000/helloに接続して確認する

ESLintのセットアップ

cd /vagrant/sam-app/hello_world/
npm install eslint --save-dev

eslint-config-airbnbのセットアップ

cd /vagrant/sam-app/hello_world/
npx install-peerdeps --dev eslint-config-airbnb
./node_modules/.bin/eslint --init
cat <<EOF > .eslintrc.json
{
  "extends": "airbnb-base",
  "plugins": [],
  "parserOptions": {},
  "env": {"mocha": true},
  "globals": {},
  "rules": {}
}
EOF

package.jsonにnpm-scriptを追加する

"scripts": {
    "test": "mocha tests/unit/",
    "lint": "eslint ./src"
  },

lintコマンドを実行する

npm run lint

huskyのセットアップ

npm install husky@next --save-dev

package.jsonにnpm-scriptを追加する

"scripts": {
    "test": "mocha tests/unit/",
    "lint": "eslint ./",
    "pre-commit": "npm run lint",
    "pre-push": "npm test"
  },

コマンドを確認する

npm run pre-commit
npm run pre-push

コードカバレッジのセットアップ

npm install --save-dev nyc

package.jsonにnpm-scriptを追加する

"scripts": {
    "test": "mocha tests/unit/",
    "lint": "eslint ./",
    "coverage": "nyc --reporter=html --reporter=text mocha tests/unit/",
    "pre-commit": "npm run lint",
    "pre-push": "npm test"
  },

⬆ back to top

参照