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

セクションナイン吉田真吾@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を参考にします。

https://github.com/awslabs/serverless-application-model/tree/master/examples/2016-10-31/api_backendgithub.com

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

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

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

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

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

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

6. circle.ymlを用意する

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のみ)

AWS re:Inventのパネルディスカッションに参加してきました #reinvent #jawsug

セクションナイン吉田真吾@yoshidashingo)です。2012年からre:Invent皆勤賞です。

昨日、「Building and Growing a Successful AWS User Group(うまくいくAWSユーザーグループを作り育てる方法)」というパネルディスカッションに、日本の老舗AWSユーザーグループであるJAWS-UGの代表として参加してきました。

https://www.portal.reinvent.awsevents.com/connect/sessionDetail.ww?SESSION_ID=10029

セッションの様子はAWSのSAである荒木さんが公式ブログにも書いてくださいました。荒木さんはわれわれJAWS-UG横浜支部のハンズオンでCloudFormationの壮大で大変なシナリオをわざわざ作ってくれたことがあり(もう4年前ですね)、まぁ他にもいろいろ原稿チェックをお願いしたりなどいつもありがとうございます。

aws.typepad.com

さてさて、どんな様子だったか軽くまとめておくことにします。

セッションは事前登録の700席が満席+100人以上は当日の行列ができていたようでとても盛況でした。

パネルとして集まったのはサンフランシスコから Peter Sankauskas、ミュンヘンから Markus Ostertag、上海から Yu Zhang、横浜(および日本のコミュニティ)から私というそれぞれユーザーグループをリードしている4人でした。

それぞれが数百人規模のユーザーベースのコミュニティを運営しており、日本のJAWS-UGとしては、

  • 全国に支部が50くらいある
  • 地域としては40くらいあり、それ以外に専門支部がIoT、CLI、BigDataなどなど10個くらいあり、初心者支部もいくつかある
  • JAWS-UG主導で作る年次カンファレンスには1500人くらいが参加する

といった紹介をしました。

スポンサーはどうしてるかという話題について、SF、ミュンヘンは会場とフード&ドリンクをスポンサリングし、スポンサーの紹介タイムを設けているという話がありました。彼らは会場も持ち回りでやってるみたいです。日本では多くの場合が会場のスポンサーとして無料で借りられるところをお願いすることが多く、懇親会はミートアップが終わってからやることが多いのでそれよりは楽という話をしました。上海については飲み会的な形式にすることもありカジュアルに開催できていいとのことでした。

会場からセッションの中にセールストークが入っちゃうような場合はどう扱ってるかという質問がありましたが、SFでは前述のとおりスポンサーのセッション枠が宣伝時間になるようにしているとのことでした。日本では、まぁ「ガミガミ言いいたくはないけど当然分かるよね」って伝えてるという感じの笑い話をしました。過去にも宣伝トークの割合が多い方がいたりはしましたが、聴衆に持って帰ってもらうものと宣伝の比率がおかしいとそもそも好意的に受け取ってもらえないですからね。コミュニティの中の社会資本のような感じでその点はだいぶ成熟してるのかな(JAWS-UGに限った話じゃなくて)とは思ってます。

まぁ、それにしてもこの点に関しては誰にお願いするのかってことも関わるんですよね。エンジニア名指しでお願いするとだいたいわざわざ初モノの資料を作って手弁当で来てくれるのに全く宣伝がないのもそれはコミュニティの継続性としては不自然だと思うので。

コミュニティにどのくらい労力かけてる?という質問も千差万別な答えではありましたが、なんとなく数字のようなものを言うほうがみんなイメージしやすいかなと思ったので10%かそれ以下くらいかなって答えたんですが、これは実際に手を動かす時間としてその程度がなんとか捻出できてるって現実なだけで、実は四六時中面白そうなことは家族のために面白そうなこと、会社のために面白そうなこと、自分のキャリアにとって面白そうなこと、技術的に面白そうなこととごちゃまぜになりながら、コミュニティにとって面白そうなことも考えている感じなのでちょっと測定は難しいですね自分の場合は。

絶対に伝えたかったこと=ヒーローを見つけて育てる

AWSのアップデートは非常に早くて多くてキャッチアップが大変だけど、そういった内容のセッションのコンテンツを作って話す人をどうやって選んでるかって話になったときは、日本に関して言えばそういう話を積極的にしたいって言ってくれる人も多いし、初心者支部のような場所であれば、はじめに初心者だった人が次は教える側に立つことで成長しながらつながって行くんだよって話をしました。

また、ちょうど良かったんでその流れでどうしても最後にひとつだけ言わせてもらいたいと割り込んで話したことが、「コミュニティの使命としてひとつあると思ってることは、次の世代のヒーローを見つけて育てることだと思う」ということでした。

自分の中では実はこれが結構な原動力の源泉になっていて、リーチしていなかったコンテンツや人となりが、「場」を通じてたくさんの人に認知してもらえ、それを通じてその人が成長して、少しでも人生に良い影響を与えることができるといいなって感じです。自分がこのコミュニティに関わって受けた大きいものがそれだったし、実際にそれでキャリアチェンジしたり、マーケティングやセールスの取っ掛かりになったり、専門分野を深めるきっかけになった人がたくさんいてくれているので。

謝辞

いろいろ調整してくれたJAWS-UGの立花さん、AWSの石橋さん、アテンドしてくれた西谷さん、SFのPeter、ミュンヘンのMarkus、上海のYuさん、モデレーターのIan、また、頼みもしないのに最前列でプレッシャーをかけてくれた皆さん、ありがとうございました。とてもいい経験になりました。日本のコミュニティのちょっとウェットで誠実で勉強熱心な雰囲気が世界中のAWSユーザーに少しは伝えられたんじゃないでしょうか。

余談:ノリでよろしく

そういえば事前に電話で一度トラックオーナーに主旨説明は受けたなーくらいで当日を迎え、事前リハとかないの?て聞いても「まー、前のトラックが終わったら集まってくれればいいので」くらいのフリースタイル感バリバリだったので実際登壇にあたっては本当に緊張しました。まぁただしそこらへんはモデレーターのIan(Serverlessconf Londonで一緒に呑んで語学力は知ってもらえてたし)が気を使って回答の順番を最後に回してくれたのでこちらとしても毎回「オチ」っぽいことを言えばうまく進行していく感じだったし、ところどころどうしても言いたいことは割り込んで話してIanのほうでまとめてもらうみたいな雰囲気だったので、さほどボロも出ずにまとまったのかな、という感じでした。

みんな英語は普段からやっとかないとおじさんみたいに度胸勝負になっちゃうぞ。

www.youtube.com