もくじ
環境
- Mac Book Pro
- AWS
- Backlog
AWS Cliのインストール
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip" unzip awscli-bundle.zip sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws
$ aws --version aws-cli/1.16.253 Python/2.7.10 Darwin/17.7.0 botocore/1.12.243
$ aws configure --profile test-kanehiro AWS Access Key ID [None]: <アクセスキーID入力> AWS Secret Access Key [None]: <シークレットキー入力> Default region name [None]: ap-northeast-1 Default output format [None]: json
※利用時
$ aws ~~~ --profile ${profile}
$ cat $HOME/.aws/config [profile test-kanehiro] output = json region = ap-northeast-1
$ cat $HOME/.aws/credentials [] aws_access_key_id = xxxx aws_secret_access_key = xxxxxxxx
pipのインストール
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py $ sudo python get-pip.py
boto3のインストール
$ sudo pip install boto3 --upgrade --ignore-installed six
Serverless Frameworkのインストール
$ brew install nodebrew
$ mkdir -p ~/.nodebrew/src $ nodebrew install-binary latest
Node.jsがインストールされたか確認
$ nodebrew list v12.11.1 current: none develop $ nodebrew list v12.11.1 current: none
$ nodebrew -v nodebrew 1.0.1 Usage: nodebrew help Show this message nodebrew install <version> Download and install <version> (from binary) nodebrew compile <version> Download and install <version> (from source) nodebrew install-binary <version> Alias of `install` (For backword compatibility) nodebrew uninstall <version> Uninstall <version> nodebrew use <version> Use <version> nodebrew list List installed versions nodebrew ls Alias for `list` nodebrew ls-remote List remote versions nodebrew ls-all List remote and installed versions nodebrew alias <key> <value> Set alias nodebrew unalias <key> Remove alias nodebrew clean <version> | all Remove source file nodebrew selfupdate Update nodebrew nodebrew migrate-package <version> Install global NPM packages contained in <version> to current version nodebrew exec <version> -- <command> Execute <command> using specified <version> Example: # install nodebrew install v8.9.4 # use a specific version number nodebrew use v8.9.4
$ nodebrew use v12.11.1 use v12.11.1
$ ls $HOME/.nodebrew/current/bin node nodebrew npm npx
$ echo 'export PATH=$PATH:$HOME/.nodebrew/current/bin' >> ~/.bash_profile
$ cat ~/.bash_profile if [ -f ~/.bashrc ]; then . ~/.bashrc fi export PATH="/usr/local/opt/mysql-client/bin:$PATH" export COMPOSE_HTTP_TIMEOUT=200 export PATH=$PATH:$HOME/.nodebrew/current/bin ←●追記された!!
シェルへの再ログイン
$ exec $SHELL -l
$ npm -v 6.11.3
$ node -v v12.11.1
Serverless Framework
$ npm install -g serverless
$ sls -v Framework Core: 1.53.0 Plugin: 3.1.1 SDK: 2.1.1 Components Core: 1.1.1 Components CLI: 1.2.3
テスト
$ sls create -t aws-python -p slstest Serverless: Generating boilerplate... Serverless: Generating boilerplate in "/Users/kanehiroyuu/Documents/develop/slstest" _______ __ | _ .-----.----.--.--.-----.----| .-----.-----.-----. | |___| -__| _| | | -__| _| | -__|__ --|__ --| |____ |_____|__| \___/|_____|__| |__|_____|_____|_____| | | | The Serverless Application Framework | | serverless.com, v1.53.0 -------' Serverless: Successfully generated boilerplate for template: "aws-python"
$ cd /slstest $ npm install --save serverless-python-requirements
handler.js
関数定義するためのスケルトン
event.json
ServerlessのCLIでファンクションを実行する際に
入力値となるデータを定義するファイルです。
Lambdaファンクション内でevent変数に展開されます。
※GitHubに上がっている既存サービスをインポートする場合
$ serverless install -u [GITHUB URL OF SERVICE]
$ sls config credentials --provider aws --key <キー> --secret <シークレット> --profile test-kanehiro
$ vi $HOME/Documents/develop/slstest/serverless.yml provider: name: aws runtime: python2.7 + region: ap-northeast-1 + profile: test-kanehiro
$ sls deploy --profile test-kanehiro
デプロイされたLambda関数をチェック
$ sls invoke -f hello { "body": "{\"input\": {}, \"message\": \"Go Serverless v1.0! Your function executed successfully!\"}", "statusCode": 200 }
Tips
全体のデプロイ
$ sls deploy -v
関数単位のデプロイ
$ serverless deploy function -f <yourfunction>
プロジェクトの削除
$ sls remove Serverless: Getting all objects in S3 bucket... Serverless: Removing objects in S3 bucket... Serverless: Removing Stack... Serverless: Checking Stack removal progress... Serverless: Stack removal finished...
Backlog Git Webhook + API Gateway + Lambda
Backlog Git WebhookのJSONレスポンスサンプル
{ "before": "5aef35982fb2d34e9d9d4502f6ede1072793222d", "after": "c0b8abaa6df37ea682454c25f2d602dffb5de6ed", "ref": "refs/heads/master", "repository": { "url": "https://demo.backlog.jp/git/DORA/himitsu", "name": "himitsu", "description": "ひみつ道具を格納しているリポジトリ" }, "revisions": [ { "id": "8e82fe274af30adbb378785628db509da1c969d1", "url": "https://demo.backlog.jp/git/DORA/himitsu/commit/8e82fe274af30adbb378785628db509da1c969d1", "author": { "email": "nobi@example.com", "name": "nobi" }, "message": "どこでも行けるドアを作成しました", "timestamp": "2013-04-01T14:57:17+09:00", "added": ["html/anywhere.html", "css/anywhere.css"] }, { "id": "c0b8abaa6df37ea682454c25f2d602dffb5de6ed", "url": "https://demo.backlog.jp/git/DORA/himitsu/commit/c0b8abaa6df37ea682454c25f2d602dffb5de6ed", "author": { "email": "gouda@example.com", "name": "gouda" }, "message": "DORA-1 竹でできているヘリコプターが壊れました #fixed", "timestamp": "2013-04-01T18:22:10+09:00", "removed": ["html/take-copter.html"] } ] }
event.json
$ cat event.json { "before": "5aef35982fb2d34e9d9d4502f6ede1072793222d", "after": "c0b8abaa6df37ea682454c25f2d602dffb5de6ed", "ref": "refs/heads/master", "repository": { "url": "https://yuu-k.backlog.com/git/TEST/TEST-Repo", "name": "TEST-Repo", "description": "ひみつ道具を格納しているリポジトリ" }, "revisions": [ { "id": "052e8855e9cbf2fa41dda08d3184e34631018740", "url": "https://yuu-k.backlog.com/git/TEST/TEST-Repo/commit/052e8855e9cbf2fa41dda08d3184e34631018740", "author": { "email": "nobi@example.com", "name": "nobi" }, "message": "どこでも行けるドアを作成しました", "timestamp": "2013-04-01T14:57:17+09:00", "added": ["html/anywhere.html", "css/anywhere.css"] }, { "id": "052e8855e9cbf2fa41dda08d3184e34631018740", "url": "https://yuu-k.backlog.com/git/TEST/TEST-Repo/commit/052e8855e9cbf2fa41dda08d3184e34631018740", "author": { "email": "gouda@example.com", "name": "gouda" }, "message": "DORA-1 竹でできているヘリコプターが壊れました #fixed", "timestamp": "2013-04-01T18:22:10+09:00", "removed": ["html/take-copter.html"] } ] }
handler.py
$ cat handler.py # -*- coding: utf-8 -*- import json import urllib.parse import os import tempfile import shutil import boto3 from dulwich import porcelain from datetime import datetime BUCKET_NAME = os.environ['BUCKET_NAME'] ZIP_FILE_NAME = os.environ['ZIP_FILE_NAME'] USER = os.environ['USER'] PASS = os.environ['PASS'] REPOSITORY = os.environ['REPOSITORY'] BLANCH = os.environ['BLANCH'] def lambda_handler(event, context): repository = "TEST-Repo" url = "https://yuu-k.backlog.com/git/TEST/TEST-Repo" branch = "master" # gitパスの生成 site = urllib.parse.urlparse(url) userStr = urllib.parse.quote(USER) passStr = urllib.parse.quote(PASS) uri = site.scheme +"://" + userStr + ":" + passStr +"@" + site.netloc + site.path + ".git" # 作業ディレクトリの生成 tmpDir = tempfile.mkdtemp() # clone/zip/upload porcelain.clone(uri, tmpDir) print("git clone success") zipFileName = tmpDir+ '/' + os.path.splitext(ZIP_FILE_NAME)[0] #uploadFileName = datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '_master.zip' uploadFileName = 'master.zip' shutil.make_archive(zipFileName, 'zip', tmpDir ) print("zip success") s3 = boto3.client('s3') s3.upload_file(zipFileName + '.zip', BUCKET_NAME, uploadFileName) print("s3 upload success") # 後始末 shutil.rmtree(tmpDir)
$ cat serverless.yml service: slstest provider: name: aws runtime: python3.6 region: ap-northeast-1 profile: test-kanehiro iamRoleStatements: - Effect: "Allow" Action: - "s3:PutObject" Resource: "arn:aws:s3:::yuu-test-repo/*" plugins: - serverless-python-requirements functions: hello: handler: handler.lambda_handler memorySize: 128 timeout: 60 events: - http: path: git/push method: post integration: lambda request: parameters: querystrings: payload: true environment: USER: hoge@example.net PASS: hogePassWord ZIP_FILE_NAME: TEST REPOSITORY: https://yuu-k.backlog.com/git/TEST/TEST-Repo BUCKET_NAME: yuu-test-repo BLANCH: master
デプロイする
$ sls deploy --profile test-kanehiro
- BacklogのGitのWEBフックにAPIゲートウェアイのAPIのURLを指定
- Backlogにpushすると、API Gatewayを通じてLambdaからS3にzip圧縮されてアップロードされる
さらにCodepipelineに繋げると、EC2までデプロイできる。