はやさがたりない。

へっぽこぷろぐらまのメモログ

勉強会を1年運用してみて。

 

いろいろ一人振り返りを書いていたけど消した。

下のブログは今後の参考になりました。

i2key.hateblo.jp

 

うまく巻き込めない言い訳なんか考えてないで
その原因と対策を考えろっつー話ですわ。

とにかくアウトプットをコミットメントして巻き込む作戦

これは一人にはうまくいった(?)がそれ以外にはうまくいっていない。
この人も別の活動を通じて仲良くなれたからコミットメントしてくれている気がする。

俺の各資料は結構聞いている人を置いてきぼりにする自分よがりな資料が多い。
なのでそこの意識を変えてみようと思う。

聞いている人に意識を傾けよう。
自分がこの資料の発表を聞いてどう思うか。
相手が共感してくれるというか、「面白いな」「勉強してかないとやべーな」って
思うような形で伝えられるように心がける。

賛同者というか仲間を増やす

有志で、というのをあまり崩したくなかったがやはり賛同者が必要。
個人の力には限界がある。

なのでしゃべってくれそうな人にお願いをしてみることにしようと思う。
ただ、これは自分が基本的にはみんながいる場所と別の場所にいるので
メールやチャットベースになってしまうことが嫌なところ。

本当は会って直接お願いすべきことだし、こちらの思いも伝わりにくいし
次々回の勉強会(3週間〜1ヶ月後)くらいのものを直接お願いする。

ちゃんと情報をまとめる

情報の不透明性があると思うので
いつ誰がどんなことをしゃべる予定なのか見えるようにする。
あと発表後に直接お礼を言いにいく。

 

勉強会のネタを考える

serverlessについて

サーバレスアーキテクチャ

  • 既存の課題(何が)
  • それらの解決(どうなるか)
  • サーバレスアーキテクチャ概要
  • lambda について
  • api gateway について

serverless

  • 概要
  • シズオカアプリコンテストでの実例
  • 使い方(ディレクトリ構成)
  • テスト
  • デプロイ
  • プラグイン

まとめ

  • serverlessを使った開発の妄想
  • できないこと
  • できること(悩ましいこと)
  • 今後のアプリ開発の妄想

おまけ

  • aws elasticsearch service のデータがいつの間にか消えた件しゃべっときたい

awsまとめ

コンピューティング

EC2 - クラウド内の仮想サーバー

言わずもがなの仮想マシン
お手軽に環境を作れるから時間がなかったら使うのもアリ。

EC2 Container Service - Docker コンテナの実行と管理

Docker コンテナ管理サービス。
Dockerイメージを簡単にデプロイできたり、クラスタ管理できたりする。
ELBやEBSとの連携はEC2インスタンスの代わりにDockerContainerを使うようなイメージでいいと思う。

Elastic Beanstalk - ウェブアプリの実行と管理

コードをアップロードするだけで、キャパシティのプロビジョニング、ロードバランシング、Auto Scaling からアプリケーションの状態モニタリングまで全部の面倒を見てくれる。
(内部的にはEC2インスタンスが起動していて、そのあたりのプロビジョニングをしているだけっぽい)
ウェブリクエストを処理するウェブサーバー枠と、
SQS キューをウォッチしてバックグラウンドでジョブを実行するワーカー枠が選択できる。
対応している言語は下記の通り、一見わからないが内部的にnginxなどのwebサーバも構築しているものもある。

Lambda - イベント発生時にコードを実行

コードをアップロードするだけで実行できる環境が作れる。
Beanstalkと似ているがより簡単に扱える、そして何より他AWSとの連携っぷりがはんばない。
例えば、下記のようなイベントを検知してコードを実行することができる。

  • S3のファイルが変更された時
  • DynamoDBでデータ更新があった時
  • Kinesisのストリームデータに対して定期的に
  • SNSの通知を受けた時
  • CloudWatch でアラートが発生した時

API Gatewayを使えば、そのままコードをAPIとして公開することもできる。ぜひ使いたい。

 

ストレージ & コンテンツ配信

S3 - スケーラブルなクラウドストレージ

画像や動画、HTMLなどを置く場所。
静的サイトやサーバレスな動的サイトであればこれだけでホスティングできる。
作ったアプリはサービスとして公開すべきなので、基本的には使うことになると思う。

CloudFront - グローバルなコンテンツ配信ネットワーク

AWSが提供するCDN(知らない人はContent Delivery Networkでググるといい)
利用用途としては以下のとおり。

  • コンテンツのキャッシュ
    応答性能の高速化する。
  • 独自のドメイン名、 SSL 証明書での HTTPS配信
    S3だけではHTTPS配信ができないので、HTTPS配信するためのフロントとして立たせる。
    独自ドメインは後述のRoute53と組み合わせればできるはず。
  • プライベートコンテンツの配信
    署名クッキー、署名付きURLによるアクセス制御ができる。
    例えばいつからいつまでのコンテンツにアクセスできるようにする、とか
    このIPからのみアクセスを許可するとか。

Elastic File System - EC2 向け完全マネージド型ファイルシステム

AWSNFS。まだプレビュー機能
S3はデータにアクセスするのにs3fsでの仮想マウントや、SDKを使ったアクセスをしなければいけないが、
EFSではローカルファイルアクセスと同レベルでのアクセスができる。
プレビュー(かつオレゴンのみ提供)機能なので使うかどうか微妙なところ。

Glacier - クラウド内のアーカイブストレージ

S3よりも安価にファイルを保存できるストレージ。
ログファイルとか基本使わないんだけど保持しておかなければいけないようなものを扱うのに適している。
S3と連携して、一定期間が経ったらS3からGlacierにファイルを移行してコスト削減的な使い方。

Import/Export Snowball - 大容量データの転送

これ使うと1週間あたり1ペタバイトのデータ転送ができるらしい。

Storage Gateway - オンプレミス IT 環境とクラウドストレージの統合

オンプレミスのソフトウェアアプライアンスクラウドベースのストレージと接続し、組織のオンプレミスの IT 環境と AWS のストレージインフラストラクチャ間でシームレスでセキュアな統合を実践するサービスです。

 

データベース

RDS - マネージド型リレーショナルデータベースサービス

Aurora、MariaDBMySQLPostgreSQLOracleSQLServerが簡単に使えるサービス。
RDBを使うのであればMySQL互換でナウいAuroraを使うのがいい。

ElastiCache - インメモリキャッシュ

memcached、redisが簡単に使えるサービス。
使うならばredis使いたい。

DynamoDB - 予測可能でスケーラブルな NoSQL データストア

AWSのNoSQLといったらこれ。
検索は主キーでしかできなく、他のフィールドで検索的なことをしたかったらフルスキャンするしかないらしい。
使ってみたい気はするけど、前調べた時に何かの理由でダメだーってなった気がする。
(インデックス再構築ができない件だったかな・・・)

Redshift - マネージド型のペタバイトスケールのデータウェアハウスサービス

データウェアハウス:一般的には大量のデータを主に追記の形で蓄積して、時系列などで分析を行うことでビジネスの状態などを把握し,経営を改善したり、システムの効率化用のデータを取得したりする。

ネットワーキング

VPC - 独立したクラウドリソース

EC2や RDS、ElastiCacheなどをプライベート環境に構築するためのもの。
セキュリティ的にインターネットに直接配備するのはどうか?といったもののために
この仮想的なプライベート空間を利用する。

Route 53 - スケーラブルな DNSドメインネーム登録

独自ドメインを取得したり、DNS登録ができる。
あとHealthCheckによるサービス監視も。
S3でwebホスティングしたとすると xxxx.s3.amazon.comみたいなドメインになる。
それが「ちょっとダサいね」って話になったら使おう。

Direct Connect - AWS への専用線接続

AWS Direct Connect により、お客様の設備から AWS への専用ネットワーク接続を簡単に確立することができます。
AWS Direct Connect を使用すると、AWS とデータセンター、オフィス、またはコロケーション環境間にプライベート接続を確立することができます。
これにより、多くの場合、ネットワークのコスト削減、帯域幅スループットが向上し、インターネットベースの接続よりも均質なネットワーク体験を提供できます。

開発者用ツール

一度この3つを使って開発してみたいっすね。

CodeCommit - プライベート Git リポジトリ内のコードの保存

Git リポジトリをホストする、完全マネージド型のソース管理サービス。
東京リージョンがまだだった。

CodeDeploy - コードデプロイの自動化

EC2 インスタンスやオンプレミスで稼働するインスタンスへのデプロイを自動化するためのもの。
Jenkins、Atlassian、CircleCI、GitHubなどの開発者用ツールとの連携やAnsible、Chef、Puppetなどの設定管理ツールとの連携ができる。
ローリングアップデートなどをしてくれるとのことだが、
サーバがイミュータブルであること前提?

CodePipeline - 継続的な配信を使用したソフトウェアのリリース

ソフトウェアの継続的デリバリーサービス。つまりはJenkinsみたいなもの。
ソフトウェアをリリースするために必要なステップをモデル化し可視化し自動化する。
コードがの変更を検知してビルド、テスト、デプロイまでの流れを定義する。
GitHub など、他サービス向けに事前に構築されたプラグインがあるらしい。

管理ツール

CloudWatch - リソースとアプリケーションのモニタリング

EC2インスタンスCPU使用率、SQSのキューの数、ログに特定字列が出た
などの様々なイベントをモニタリングするためのサービス。
特段監視用ってわけではなく、イベントが起こったらSQSやSNSに通知、
オートスケールなどを走らせることができる。

CloudFormation - テンプレートによるリソースの作成と管理

AWSのサービスをJSON形式で記述するとその記述に沿った環境を構築してくれるもの。

CloudTrail - ユーザーアクティビティと API の使用状況のトラッキング

アカウントの AWS API の呼び出しを記録し、ログファイルを送信するウェブサービス
証跡ログ的なものなので、真面目なサービスをやるときには必要。

Config - リソースのインベントリーと変更のトラッキング

AWSのリソースに対する変更を記録する。こちらも証跡ログと同じ感じで監査対応できる。
ただ、AWS Config は設定の変更を SNS に通知することができて他サービスと連携ができる。

OpsWorks - Chef を用いたオペレーションの自動化

Chef レシピや Bash/PowerShell でアプリケーションのデプロイおよび操作ができるサービス。
CodeDeployはあくまでデプロイに特化しているが、こちらは
自動インスタンススケーリングや自動復旧など、
アプリケーションの使用期間を通して効率的に管理できる動的な設定や調整ができる。

Service Catalog - 標準化された製品の作成と使用

CloudFormationのテンプレートをカタログとして作成、管理ができる。
このカタログを使って、環境を構築する権限がなくてもプロダクトを起動できる。

Trusted Advisor - パフォーマンスとセキュリティの最適化

俺専用のカスタマイズされたクラウドの専門家。
コスト削減、システムの性能と信頼性の向上、セキュリティなどの具合を調べてくれる。
EC2インスタンスあんまりCPU使ってないからもっと下げたらこんぐらい安くなるぜって教えてくれる。

セキュリティ & アイデンティティ

Identity & Access Management - ユーザーアクセスと暗号化キーの管理

AWSコンソールへのログインや、各リソースへのアクセス許可するためのトークンを払い出したりする。
くれぐれもトークンの情報は漏らさないように。

Directory Service - アクティブディレクトリのホストと管理

AWS リソースを既存のオンプレミス Microsoft Active Directory で接続したり、
AWS クラウド上に新しいスタンドアロンなディレクトリをセットアップしたりできる管理型サービスです。

Inspector - アプリケーションのセキュリティの分析

アプリケーションのセキュリティ脆弱性やネットワーク、OSの脆弱性定期的・継続的に診断するためのサービス。
検出された問題は重要度別にグルーピングされて、レポーティングもしてくれる。

WAF - 悪意あるウェブトラフィックのフィルター

web application firewallでググるべし。
ルールを作成するとそれの沿ってアクセスを遮断してアタックから保護するためのサービス。
例えば、 IP アドレスで制限かけたり、HTTP ヘッダーや URI 文字列の特定文字列でフィルタする、みたいな。
もちろんCloudWatchでのアラート連携もできる。

分析

Elasticsearch Service - Elasticsearch クラスターの実行とスケーリング

サービス自体は利用したことがないが、Elasticsearchは利用経験あり。
全文検索、位置情報検索、データの集計など幅広いことができるので使うかもしれない。
kibana4がデフォルトでくっついてくる。

EMR - マネージド型 Hadoop フレームワーク

ビッグデータの管理と分析に利用できる。
EMR => Elastic MapReduceHadoopのサービスだと思って大丈夫そう。
HiveとかPigとかHBase、Sparkとかがサポートされている。
Kinesisと連携してストリームで処理できるらしいが、そもそもHadoopさんをちゃんとわかってない。

Data Pipeline - データ駆動型ワークフローに対するオーケストレーションサービス

データの移動と変換を自動化するためのサービス。
データ移動はAWS サービスだけじゃなくて、オンプレミスのデータソース間の移動もできる。
保存場所にあるデータに定期的にアクセスして変換や処理を行い、
結果を S3、RDS、DynamoDB、EMRのような AWS サービスに転送できる。

 

Kinesis - リアルタイムストリーミングデータとの連携

あまりちゃんとわかっていないが、SQSに近いサービスっぽい。
ただしSQSよりも

  • 大量データに強い
  • シーケンス番号が振られていて、前回実行時以降のデータを取得なんてこともできる
  • SQSはリクエストで送れるデータが256バイトのテキストデータのみ。Kinesisは50キロバイトのBLOB。

なんて感じらしい。

Amazon Kinesis Firehose
大量のストリーミングデータを AWS に簡単にロードできる。

Amazon Kinesis Analytics
標準 SQL でストリーミングデータを簡単に分析できる。近日公開の機能

Amazon Kinesis ストリーム
ストリーミングデータを処理、分析する独自のカスタムアプリケーションを構築できる。

Machine Learning - すばやく簡単にスマートアプリケーションを構築

現時点で利用可能なリージョンは『N.Virginia(US East)』のみ。
S3、Redshift、RDSのデータを使って機械学習することができる。
機械学習を使う上ではとても簡単らしい。あとモデルの評価もしてくれるらしく
例えば10万件のデータがあったとして、7万件のデータを学習した結果と残りの3万件で答え合わせみたいな。

IoT

AWS IoT - デバイスをクラウドに接続

モノ(車とかセンサーとか)から送信されるメッセージを AWS エンドポイントや他のデバイスにルーティングするための仕組み。

  • データ蓄積して可視化するとか
  • 蓄積したデータを分析するとか
  • 機械学習使って未来予測するとか

ってことをAWSのサービス使ってやるために、モノとAWSをつなぐ入り口。

モバイルサービス

SNS - プッシュ通知サービス

モバイルへのプッシュ通知、メールへの通知ができる。
モバイルアプリを作るならば使うかもしれない。

Mobile Hub - モバイルアプリの構築、テスト、モニタリング

モバイルアプリを作成する際のサーバサイドっぽいところをまかなってくれる mBaas 的な製品。

  • ユーザー認証、データストレージ、プッシュ通知、コンテンツ配信、および分析などの機能を GUI のダッシュボードで設定するだけで、クライアントSDK から呼び出して使用することができる。
  • バックエンドのロジックも Lambda で定義すればSDKから簡単に呼び出せる。

通常の mBaas は各機能をまとめて提供するブラックホールなのに対して、Mobile Hub の場合は、AWS のサービスを組み合わせているだけなのが特徴。

なので、

  • この機能はAWS以外のサービス使おうとか
  • 通常の Baas で提供してくれる機能じゃまかなえないからここは自分で実装しようとか
  • データを直接いじって他のサービスで使おうとか

みたいなことができて過度なベンダーロックインにならないとこが魅力的。

Cognito - ユーザー ID およびアプリケーションデータの同期

  • アプリケーションの設定やゲームの状態などのモバイルユーザーデータを 保存
  • デバイスがオフラインの場合でもデータをユーザーのローカルデバイスに保存
  • 複数デバイス間でのユーザデータの同期
  • パブリックログインプロバイダ(AmazonFacebookGoogleOpenID Connect 対応プロバイダなど)、または独自のユーザー ID システムを使って、AWS クラウドサービスにアクセスするための一意のエンドユーザー識別子を作成。この識別子を使って、AWS サービスに対するアクセス制御ができる。
  • 未認証の状態でもゲストとしてユーザーのデータ(アプリケーションの設定など)を保存。
  • 紹介動画
    https://youtu.be/C5JffPLMrUE

Device Farm - Cloud 上の実際のデバイスでの Android、Fire OS および iOS アプリのテスト

iOSAndroid、Fire OS のアプリをAWS クラウドで実際のデバイスを使用してアプリをテストしてくれる。
組み込みのテストスイートを実行すれば、スクリプトの作成は不要。
Appium、Calabash、Espresso といった、一般的なOSSテストフレームワークを使って
テストを細かくカスタマイズすることもできるらしい。

利用フローはこんな感じ。

  1. iOSAndroid、Fire OS のアプリを AWS Device Farm にアップロードします。
  2. AWS Device Farm によって、選択された実デバイスでアプリがテストされます。
  3. 結果は数分で得られ、バグやパフォーマンスの問題点が指摘されます。

Mobile Analytics - アプリケーション分析の収集、表示、エクスポート

アプリケーションの利用に関する情報の収集や可視化、
それに基づくユーザへのエンゲージメントや収益化などを手助けするサービス。
AWS Mobile SDK または REST API を通じてクライアントからデータを収集して、
解析結果を Management Console に表示して確認したり、JSON 形式で書き出すことができる。
Cognitoさんと連携するっぽい。

アプリケーションサービス

Elastic Transcoder - 使いやすいスケーラブルなメディア変換サービス

例えば mp4 から hls 形式するなどの動画ファイル変換ができる。
その際にサムネイル画像を取得するように設定できたり、解像度はどのくらいにするかなども指定できる。
まぁ使わないだろう。

SQS - メッセージキューサービス

キューのサービスで、文字列をキューに登録することができる。
一度取得すると一定時間参照できなくなったりするので複数台マシンでキューを使うにはオススメ。
しかし、FIFOといったポリシーが特になくので参照の順序は保証されていない

 

エンタープライズアプリケーション

WorkSpaces - クラウド内のデスクトップ

そのまんまです。
クラウドにのデスクトップを簡単に作ることができて、
WindowsMac 、Chromebook、iPadKindle Fire タブレットAndroid などのデバイスをサポートしていて
そこから仮想デスクトップにアクセスできるっぽい。

WorkDocs - セキュアなエンタープライズ向けストレージおよび共有サービス

GoogleDocみたいなものっぽい。
監査ログ的なものもあるみたい。

WorkMail - セキュリティ保護された E メールとカレンダーサービス

Gmail + Calendar的な?
Amazon WorkMail を利用すれば、 Microsoft Outlook、ウェブブラウザ、
iOS および Android ネイティブの E メールアプリケーションを使用して、
E メール、連絡先、カレンダーにシームレスにアクセスできる。

 

 

 

 

 

APIGateway の MappingTemplate

CURLでテストすると勝手に「Content-Type: application/x-www-form-urlencoded」がつけられるのでちゃんと自分でヘッダーを指定しましょう。

MappingTemplateが正常に動作するようになったらこんなエラーが返ってくるようになった。

{"message": "Could not parse request body into json: Unexpected character (\',\' (code 44)): expected a valid value (number, String, array, object, \'true\', \'false\' or \'null\')\n at [Source: [B@6812cadd; line: 4, column: 16]"}

指定したMappingTemplateはこんな感じ。

#set($inputRoot = $input.path('$'))
{
  "type": "$inputRoot.type",
  "address": "$inputRoot.address",
  "location": $inputRoot.location,
  "title": "$inputRoot.title",
  "description": "$inputRoot.description"
}

「$inputRoot.location」がnullの時とかにJSONとしてフォーマットがおかしくなるからこんなエラーが返ってくる。

一旦こんな形式にしてみたけども

#set($inputRoot = $input.path('$'))
{
  "type": "$inputRoot.type",
  "address": "$inputRoot.address",
  "location": {
    "lat": $inputRoot.location.lat,
    "lon": $inputRoot.location.lon
  },
  "title": "$inputRoot.title",
  "description": "$inputRoot.description"
}

これでも「$inputRoot.location.lat」がnullの時にNG。
でもここは数値にしたいから""でも囲うこともできない。
そうするとここでわざわざ#ifとかでnullの時は設定しないー的なことをする必要があるってこと?
だったらもうソース側でやればよくね?

いまいちよくわからん。

serverless での エラーマッピングの仕方。

そもそものエラーの返し方はこちら。

return context.done(new Error("invalid type :" + type ));

レスポンスコードを変えたりしたい時は、 s-function.json の responses をいじる 。
こんな感じでコンソール上の「Lambda Error Regex」を「selectionPattern」に 設定する。
デフォルトだとstackTraceがそのまま出てしまうのでテンプレートを設定している。

          "responses": {
            "400": {
              "statusCode": "400",
              "selectionPattern": "invalid type.*",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"errorMessage\": \"$inputRoot.errorMessage\",\n  \"errorType\": \"$inputRoot.errorType\"#if($context.stage == \"development\"),\n  \"stackTrace\": $inputRoot.stackTrace#end\n\n}"
              }
            },

テンプレートを見やすく整形するとこんな感じ。
stageでstackTraceの出力を切り替えている。

#set($inputRoot = $input.path('$'))
{
  "errorMessage": "$inputRoot.errorMessage",
  "errorType": "$inputRoot.errorType"#if($context.stage == "development"),
  "stackTrace": $inputRoot.stackTrace
#end
}

serverlessのmappingtemplateのフォーマットメモ

responseTemplatesのforeachとかは、ここの記述フォーマットに従っている。

Apache Velocity - VTL Reference


jsonのフィールドの先頭に「_」があった時にうまくテンプレートに適用できなかった。

そんな時はここを見るといい感じ。

JSONPath - XPath for JSON