読者です 読者をやめる 読者になる 読者になる

AWS re:Invent 2016感想

AWS re:Invent

セクションナイン吉田真吾@yoshidashingo)です。

メモ程度に感想を記載しておきます。

トレンド

  1. 新サービスによりミッシングピースが埋まることで、クラウドのサービスはカバー範囲から、機能のディテールや質の時代になりはじめている
  2. サーバーレスは ストリームプロセッシングエッジコンピューティング なども含めたさまざまなアーキテクチャのコンポーネントに変化し始めている

個人的な体験の感想

  • 楽しむならワークショップ系に限る。とくにLDAPを使ったSAML認証のハンズオンは面白かった。
  • コミュニティパネルで話しきれないたくさんのことがあったが、なにより「次世代のヒーローを見つけて育てる」という自分の原動力について話せてよかった。
  • スピーカー懇親会では他のスピーカーの熱量の多さを非常に感じた。好きなことはどんどん掘っていこう。
  • イビサさんの部屋で話していた「恋に落ちるマーケティング論」について深掘りしていこうと思った。
  • 最近Tシャツやステッカーは厳選してもらうようにしているのでスーツケースは手荷物で持ち込める程度のサイズで十分。
  • 全体的にとてもタイトなので、お酒はこういう機会でしか会えない人とに限るよう心がけたが結果的にかなり時間に余裕を持ててよかった。
  • PollyやLex(Amazon Echoも含めて)もっと遊びたい。
  • MXNetはさっぱり分からなかった。Deep Learningについて基礎から学ぶ必要あり。
  • LINQはもうイヤなので来年は早いうちにVenetianか裏のコンドミニアムを手配しよう。
  • Beta試験を受け忘れた。日本語化されたらすぐ受けよう。
  • Cirque Du Soleil行き忘れた。来年は行く前に計画しておこう。特にKAとMystere。

AWS Serverless Application Model (SAM) と CircleCI を使ったサーバーレスアプリケーションのデプロイフロー

AWS Serverless

セクションナイン吉田真吾@yoshidashingo)です。

Serverless Advent Calendar 2016の5日目です。

今日はCircleCIを使って簡単にSAMの自動デプロイフローを作ってみましょう。

f:id:yoshidashingo:20161205131449p:plain

準備

準備の流れは以下のとおり

  1. GitHubリポジトリを作成してCircleCIのプロジェクトとひもづけておく
  2. ソースコード(index.js)を用意する
  3. IAM Userのクレデンシャルを用意する
  4. リリースステージ用のS3バケットを作成する
  5. app-spec.ymlを用意する
  6. circle.ymlを用意する
  7. CircleCIのプロジェクトにAWSのクレデンシャルと環境変数を設定する

1. GitHubリポジトリを作成してCircleCIのプロジェクトとひもづけておく

適当にGitHubリポジトリを作ってください。今回のサンプルは最終的に以下のような構成になります。

├── README.md
├── app-spec.yml
├── circle.yml
└── index.js

サンプルはここに置いておきます。

github.com

できたらCircleCI側でもこのリポジトリに紐づくプロジェクトを作っておきます。

※template.yaml = app-spec.yml

2. ソースコード(index.js)を用意する

今回作るのは以下のSAMのサンプルのAPI Backendを参考にします。

github.com

'use strict';
console.log('Loading function');

let doc = require('dynamodb-doc');
let dynamo = new doc.DynamoDB();

const tableName = process.env.TABLE_NAME;

const createResponse = (statusCode, body) => {
    return {
        "statusCode": statusCode,
        "body": body
    }
};

exports.get = (event, context, callback) => {
    var params = {
        "TableName": tableName,
        "Key": {
            id: event.pathParameters.resourceId
        }
    };
    dynamo.getItem(params, (err, data) => {
        var response;
        if (err)
            response = createResponse(500, err);
        else
            response = createResponse(200, data.Item.doc);
        callback(null, response);
    });
};

exports.put = (event, context, callback) => {
    var item = {
        "id": event.pathParameters.resourceId,
        "doc": event.body
    };

    var params = {
        "TableName": tableName,
        "Item": item
    };
    dynamo.putItem(params, (err, data) => {
        var response;
        if (err)
            response = createResponse(500, err);
        else
            response = createResponse(200, null);
        callback(null, response);
    });
};

exports.delete = (event, context, callback) => {
    var params = {
        "TableName": tableName,
        "Key": {
            "id": event.pathParameters.resourceId
        }
    };
    dynamo.deleteItem(params, (err, data) => {
        var response;
        if (err)
            response = createResponse(500, err);
        else
            response = createResponse(200, null);
        callback(null, response);
    });
};

3. IAM Userのクレデンシャルを用意する

7でCircleCIのプロジェクト設定に追加するCloudFormation用のIAM Userのクレデンシャル(Access Key ID と Secret Access Key)を用意します。 権限は今回省略しますが適宜つけておいてください。

4. リリースステージ用のS3バケットを作成する

作成するAPIバックエンドと同一のリージョンにソースコードリリースステージ用のバケットを作成してください。

5. app-spec.ymlを用意する

SAMの定義ファイルを作成します。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Simple CRUD webservice. State is stored in a SimpleTable (DynamoDB) resource.
Resources:
  GetFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.get
      Runtime: nodejs4.3
      Policies: AmazonDynamoDBReadOnlyAccess
      Environment:
        Variables:
          TABLE_NAME: !Ref Table
      Events:
        GetResource:
          Type: Api
          Properties:
            Path: /resource/{resourceId}
            Method: get

  PutFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.put
      Runtime: nodejs4.3
      Policies: AmazonDynamoDBFullAccess
      Environment:
        Variables:
          TABLE_NAME: !Ref Table
      Events:
        PutResource:
          Type: Api
          Properties:
            Path: /resource/{resourceId}
            Method: put

  DeleteFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: index.delete
      Runtime: nodejs4.3
      Policies: AmazonDynamoDBFullAccess
      Environment:
        Variables:
          TABLE_NAME: !Ref Table
      Events:
        DeleteResource:
          Type: Api
          Properties:
            Path: /resource/{resourceId}
            Method: delete

  Table:
    Type: AWS::Serverless::SimpleTable

6. circle.ymlを用意する

machine:
  timezone: Asia/Tokyo

dependencies:
  override:
    - sudo pip install awscli
  post:
    - aws configure set region $REGION

test:
  override:
    - echo "Nothing to do here"

deployment:
  production:
    branch: master
    commands:
      - zip app.zip index.js
      - aws cloudformation package --template-file app-spec.yml --output-template-file app-spec.deploy --s3-bucket $S3_BUCKET_NAME
      - aws cloudformation deploy --template-file app-spec.deploy --stack-name $STACK_NAME --capabilities CAPABILITY_IAM

7. CircleCIのプロジェクトにAWSのクレデンシャルと環境変数を設定する

  • Project > AWS Permissions に Access Key ID と Secret Access Key を設定します。
  • Project > Environment Variables に以下の環境変数を設定します
    • REGION : スタックを作成するリージョン、ap-northeast-1 とか
    • S3_BUCKET_NAME : 4で作ったコードをステージするS3バケット名
    • STACK_NAME : CloudFormationのスタック名、適当につけて大丈夫です。

実行

GitHubにPushすれば

CircleCIが回って f:id:yoshidashingo:20161205022824p:plain

CloudFormationが動いて f:id:yoshidashingo:20161205022942p:plain

APIバックエンドができました。 f:id:yoshidashingo:20161205022756p:plain

最後に

SAMに限らずサーバーレスアプリケーションを構築するフレームワークの多くが手元から簡単に使えますが、PR駆動なチーム開発をしようとした場合にはこういったCIのサービスと連携する必要が出てきます。当初このフローも先日リリースされたばかりのCodeBuildを利用してみようと思いましたが、7で設定したような環境変数が設定できなさそうだったので、使い慣れたCircleCIをベースにやってみましたが、日々ツールは進化するので、定期的に見直すことで開発フローをよりよくしていきたいですね。

AWS re:Invent 2016 Keynote Day1 早見

セクションナイン吉田真吾@yoshidashingo)です。

どれがいますぐ使えるのかわかりにくかったので早見置いておきます、ちょい前日も含みますが。

Service Overview Blog URL Status
AWS Organizations 複数AWSアカウントをグループとして束ねて管理できるサービス AWS Organizationsのプレビューが始まりました | Amazon Web Services ブログ Preview
Amazon Aurora for PostgreSQL PostgreSQL 互換のエンジンを搭載したAurora Amazon Aurora アップデート – PostgreSQL 互換のエンジン | Amazon Web Services ブログ preview(詳細情報なし)
Amazon Athena S3にためたデータに直接クエリできる Big Query ライクなサービス Amazon Athena – Amazon S3上のデータに対話的にSQLクエリを | Amazon Web Services ブログ GA(VirginiaとOregoonのみだがクエリ対象のバケットはどこでも可)
Amazon Rekognition Vision APIのような画像認識サービス Amazon Rekognition – 深層学習による画像検出と認識 | Amazon Web Services ブログ GA(Virginia/Oregon/Ireland)
Amazon Polly 日本語にも対応したText-to-Speech(文字読み上げ)サービス Amazon Polly – 文章から音声へ、47の声と24の言語 | Amazon Web Services ブログ GA(Virginia/Oregon/Ohio/Ireland)
Amazon Lex 音声やテキストを使ったbot基盤のサービス Amazon Lex – 対話的音声&テキストインターフェースを構築 | Amazon Web Services ブログ Limited Preview
AWS Greengrass 組込みLambda=Greengrass Core AWS Greengrass -ユビキタス, 現実世界におけるコンピューティング- | Amazon Web Services ブログ Limited Preview
AWS Snowball Edge 100TBストレージ、クラスタリングしたりLambdaを動かしたりNFSマウントできるSnowball AWS Snowball Edge – より多くのストレージ, ローカルエンドポイント, Lambdaファンクション | Amazon Web Services ブログ GA(東京をのぞく)
AWS Snowmobile 100PBのインポート用データコンテナサービス AWS Snowmobile – エクサバイトのデータを数週間でクラウドに移動 | Amazon Web Services ブログ GA(USのリージョンのみ)
Amazon EC2: T2.Xlarge, T2.2Xlarge バースタブルな汎用インスタンス 新しい T2.Xlarge および T2.2Xlarge インスタンス | Amazon Web Services ブログ GA
Amazon EC2: C5 次世代のコンピュート最適化インスタンス EC2インスタンスタイプのアップデート – T2, R4, F1, Elastic GPUs, I3, C5 | Amazon Web Services ブログ 未定
Amazon EC2: I3 次世代のストレージ最適化インスタンス EC2インスタンスタイプのアップデート – T2, R4, F1, Elastic GPUs, I3, C5 | Amazon Web Services ブログ 未定
Amazon EC2: R4 次世代のメモリ最適化インスタンス(r4.large - r4.16xlarge) 次世代のメモリ最適化EC2インスタンス(R4) | Amazon Web Services ブログ GA(東京をのぞく複数リージョン)
Amazon EC2 Elastic GPUs 1/2/4/8GiBでGPUをM4/C4/X1にアタッチできる 進行中 ー Amazon EC2 Elastic GPUs | Amazon Web Services ブログ 未定
Amazon EC2: F1 FPGAインスタンス 開発者プレビュー ー EC2 Instances (F1) with Programmable Hardware | Amazon Web Services ブログ 開発者プレビュー(バージニアのみ)
Amazon Lightsail ミドルウェアを選択して構築済みで使えるお手軽VPSサーバー Amazon Lightsail – AWSの力、VPSの簡単さ | Amazon Web Services ブログ GA(Virginiaのみ)