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

先週のAWS関連ブログ〜7/17(日)-AmazonにおけるCPUとGPUのハイブリッドクラスタ管理、Lambdaを使ったさまざまなサーバーレスなサンプル実装例など

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

AWSの各種公式ブログで紹介される効果的なアーキテクチャにおいて、LambdaやAPI Gatewayを利用したサーバーレス構成が非常に多くなってきた印象です。はじめはとっつきにくいのが正直なところかと思いますが、スケーラビリティの管理やホストのメンテナンスなどから解放される効果は絶大です。少しずつ触ってみましょう。

AWS公式

1. ECSタスクのためのIAMロールによってコンテナ利用アプリケーションをより安全にする

  • ECSではコンテナからIAMロールの権限でAWSリソースへのリクエストができるので、環境変数にクレデンシャルを設定する必要がない。
  • 新機能は、ECSタスク単位にIAMロールを指定できるので、ホストのロケーションに関係なく、また1つのクラスタ内に複数のECSタスクを実行し、それぞれが別のリソースへのアクセス権限が必要な場合もホストに依存しないタスク単位のIAMロールの指定が可能になった。その際、クラスタ内のホストにはAmazonEC2ContainerServiceforEC2RoleポリシーがあたったIAMロールがあたっている必要がある。
  • 注意点としては、同一クラスタ内に複数のECSタスクを別IAMロールで同居は可能になったが、セキュリティグループは依然ホスト単位にかけるものなので、どのECSタスクが載っているかによって変更ができない点。

ECSタスクのためのIAMロールによってコンテナ利用アプリケーションをより安全にする | Amazon Web Services ブログ

2. Amazon Inspector でセキュリティ脆弱性テストを拡大

  • Amazon Inspectorでチェックしたセキュリティ脆弱性の診断終了の通知をSNSトピックに発行し、それをトリガにAWS Lambdaを使って「OKじゃなかった場合だけEメールに通知する」サンプル。
  • 簡単な実装だけどエラーハンドリングもそこそこ入ってるのでこのまま使えそうな内容。

Amazon Inspector でセキュリティ脆弱性テストを拡大 | Amazon Web Services ブログ

3. Apache SparkとAmazon DSSTNEを使った、Amazon規模のレコメンデーション生成

  • AmazonがOSSで公開しているGPU上で動作するディープラーニング用エンジンDSSTNE(the Deep Scalable Sparse Tensor Neural Engine)は、実際にAmazonのECサイトやデバイスにおけるパーソナライズに活用されている
  • 学習や予測データの作成に使うSparkはCPUで稼働し、ディープラーニングするDSSTNEはGPU上で稼働するため、CPU用インスタンスとGPU用インスタンスをハイブリッドでクラスタ管理するのは非常に難しい。
  • Spark (CPU)のクラスタはAmazon EMR上で実行し、GPUのインスタンスはAmazon ECSで管理することにし、ECSへのタスクのトリガなどはEMR側で管理することで統合されたクラスタ管理ができるようになった。

aws.typepad.com

4. AWS Marketplace が EU の独立系ソフトウェアベンダー (ISV) のサポートを開始

  • 今までUS国内に住所と銀行口座があるパートナーに限られていたMarketplaceへの出品がEUにも拡大。
  • 営業/回収の手間が不要なソフトウェア販売のプラットフォームとして、すでに日本から世界に(アメリカに会社を設立し)AMIMOTO AMIを販売して急伸しているDigitalCubeのような例もあるので、今後日本にも拡大するようであれば大歓迎したい。

AWS Marketplace が EU の独立系ソフトウェアベンダー (ISV) のサポートを開始 AWS Marketplace Update – Support for ISVs Based in the EU | AWS Blog

5. AWS CodePipeline に手動承認機能を追加

  • AWS CodePipelineの各ステージに手動承認が設定可能になり、レビュー&承認、リリース承認などができるようになった。
  • 多くのAWS上のワークフローが「作業者の権限において実施するのみ」であるのに対し、この機能で「(事後承認ではない)統制管理が可能」になったことは非常に意義深いと感じる。特に統制といったあたりを気にする必要がある組織にとっては。

AWS CodePipeline に手動承認機能を追加

6. CloudiaJSを使いAWS LambdaとAPI Gatewayで5分でFacebook MessengerのチャットBotを作る

  • ホントに簡単にデプロイまでできる

Create and Deploy a Chat Bot to AWS Lambda in Five Minutes | AWS Compute Blog

7. サーバーレスでプライベート用短縮URLサービスをつくる

  • サービスのシングルページをS3(CloudFront)から配信し、S3にホストしたファイルのURLを短縮する時に、API Gateway経由でLambdaファンクションをコールし、HTTPリダイレクトのための短縮文字を生成し、S3のメタデータに設定する。
  • CORS設定を避けるためにすべてのリクエストはCloudFrontで受けて配信するように設定する。
  • 上記の設定ができるCloudFormationテンプレートが公開されている。
  • 1月に1000件短縮して1000ユーザーから利用されても12セント(約12円)

Build a Serverless, Private URL Shortener | AWS Compute Blog

8. RとLambda、API Gatewayを利用したゲノム解析

  • Station XではAmazon LinuxにR環境をセットアップしライブラリなどを整えてLambda用のパッケージを生成しデプロイし、同期リクエスト用にAPI Gatewayをセットアップし、遺伝の影響によるがん患者の生存率の計算に利用している。

Analyzing Genomics Data at Scale using R, AWS Lambda, and Amazon API Gateway | AWS Compute Blog

9. 特定のIAMロールからS3バケットへのアクセスを制限する方法

  • (IAMロールとIAMユーザーにS3フルアクセスのポリシーがアタッチされている状況で)一方のS3バケットポリシーにIAMロールのみアクセス可能と記載すれば、一方のバケットのみIAMユーザーからのみアクセスが遮断できる。
  • スイッチロールでクロスアカウントアクセスするロールユーザーとアカウントのIAMユーザーは混在している場合、バケットポリシーでユーザーIDを指定して拒否するのと同時に他のアカウントからアクセスすることになるロール名を許可指定する必要がある。
  • ここらへん、実際に必要になる場面が結構多いですが大抵の人はハマるとこですので、原理は押さえておきましょう。

How to Restrict Amazon S3 Bucket Access to a Specific IAM Role - AWS Security Blog

10. 地球観測衛星のビッグデータを一般利用(有料)できるSentinel Hub

  • 地球観測衛星Sentinel-2は6ヶ月の試運転期間に200TBものデータ(250兆ピクセル)を生成したが、90%以上のデータが再利用されずにいる。
  • このパブリックデータ・セットはS3上で公開されているが、効果的にアクセスするためにSentinel Hubというサービスを作り、必要な範囲で必要なデータのみをクエリに応じて描画できるようにした。
  • これにより、たとえば特定範囲の最新の航空写真を「雲を取り除く画像処理をLambdaを使って実行して」、閲覧するということが可能

A Minimalistic Way to Tackle Big Data Produced by Earth Observation Satellites | AWS Government, Education, & Nonprofits Blog www.sentinel-hub.com

11. 【開催報告】アドテクノロジー業界セミナー #AWSAdTechJP

  • アドテクは日々進化している。
  • Amazonのミッションは「undifferentiated heavy lifting (差別化につながらない重労働)」の排除
  • デファクトになりつつあるSparkと、Sparkで処理したデータをためてOLTP処理に利用したりできるDruidの紹介
  • その他各社発表があって盛り上がった模様

aws.typepad.com

undifferentiated heavy liftingの排除についてはこちらの記事も参考に

http://archive.oreilly.com/network/2006/12/20/web-20-bezos.html

www.cio.co.nz

www.slideshare.net

AWS関連

12. AmazonがCloud9を買収

  • おそらくこれはサービスに統合してコードを書いたらすぐにデプロイできるようにするでしょうし、re:Inventあたりが楽しみですね。

www.publickey1.jp

13. チームによる継続運用を意識したAWS環境におけるTerraformの活用

  • うちでも同等のTFによるチーム開発実践してたので分かりますがベストプラクティスに近いと思いますね。
  • 書いていないところで言うとplanはうまくいってもapplyで失敗するときにどうするかとか、RDSのプロビジョニング時間の長さでTFがタイムアウトするのどうするとか、実態とtfstateがズレた場合に手書きで直すかどうするか、などでしょうか。

made.livesense.co.jp

JAWS-UGアーキテクチャ専門支部でServerlessConfのレポートをしてきた

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

掲題のとおり、最近のサーバーレス界隈の話やServerlessConfのレポートを話してきました。

jawsug-arch.connpass.com

当日のスライドはこちらです。

www.slideshare.net

参考情報のURLは以下の2つです。

martinfowler.com

www.slideshare.net

その他の方たちの発表

Apexで複数環境のLambda関数をデプロイする話

speakerdeck.com

新卒新入社員だけで仮想プロジェクトやってます

www.hands-lab.com

【濃縮版】新時代の幕開け、サーバーレスアーキテクチャの衝撃! 〜開発・運用・セキュリティ・コストがどう変わる?〜

www.slideshare.net

Python Serverless Microframework for AWS(Preview)のchaliceを使ってみる

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

Python Serverless Microframework for AWSという、Serverless Frameworkに似たWeb APIのフレームワークがPreviewリリースされたのでチュートリアルどおり試してみます。

Preview the Python Serverless Microframework for AWS | AWS Developer Blog

※ GitHubはこちら

github.com

1. インストール

$ sudo pip install chalice

2. 新規プロジェクト作成

$ chalice new-project demo
$ cd demo

3. デフォルトの定義のままデプロイして確認する

  • 定義ファイル app.py を確認する
$ vi app.py
  • デフォルトで以下のように定義されている
from chalice import Chalice

app = Chalice(app_name='demo')


@app.route('/')
def index():
    return {'hello': 'world'}

  • デプロイする
$ chalice deploy
Initial creation of lambda function.
Updating IAM policy.
Creating deployment package.
Lambda deploy done.
Initiating first time deployment...
Deploying to: dev
https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/
  • エンドポイントにアクセスしてみる
$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/
{"hello": "world"}
  • 存在しないパスにアクセスしてもエラー
$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/AWS/hello
{"message":"Missing Authentication Token"}

4. 定義ファイルにAPI機能を追加してデプロイする

  • 定義ファイル app.py を編集する
$ vi app.py
  • 以下のように定義にAPI機能を追加する
from chalice import Chalice

app = Chalice(app_name='demo')


@app.route('/')
def index():
    return {'hello': 'world'}

@app.route('/{name}/hello')
def hello(name):
    return {'hello': name}

  • デプロイする
$ chalice deploy
Updating IAM policy.
Updating lambda function...
Regen deployment package...
Sending changes to lambda.
Lambda deploy done.
API Gateway rest API already found.
Deleting root resource id
Done deleting existing resources.
Deploying to: dev
https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/
  • エンドポイントにアクセスして機能追加されたことを確認する
$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/
{"hello": "world"}

$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/AWS/hello
{"hello": "AWS"}

$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/serverless/hello
{"hello": "serverless"}

5. ログ出力して、確認してみる

  • 定義ファイル app.py を編集する
$ vi app.py
  • 以下のようにprint文を追加してログを出力するようにする
from chalice import Chalice

app = Chalice(app_name='demo')


@app.route('/')
def index():
    return {'hello': 'world'}

@app.route('/{name}/hello')
def hello(name):
    print('I want to log {}'.format(name))
    return {'hello': name}

  • デプロイする
$ chalice deploy
Updating IAM policy.
Updating lambda function...
Regen deployment package...
Sending changes to lambda.
Lambda deploy done.
API Gateway rest API already found.
Deleting root resource id
Done deleting existing resources.
Deploying to: dev
https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/
  • ログ出力を追加したAPIにアクセスする
$ curl https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/logme/hello
{"hello": "logme"}
  • ログを確認する
$ chalice logs --num-entries 2
2016-07-12 06:45:12.099000 b929c8 START RequestId: beb5562b-47b0-11e6-97f7-2345ee85dba4 Version: $LATEST
2016-07-12 06:45:12.100000 b929c8 I want to log logme
2016-07-12 06:45:12.101000 b929c8 END RequestId: beb5562b-47b0-11e6-97f7-2345ee85dba4
2016-07-12 06:45:12.101000 b929c8 REPORT RequestId: beb5562b-47b0-11e6-97f7-2345ee85dba4   Duration: 0.40 ms Billed Duration: 100 ms    Memory Size: 128 MB    Max Memory Used: 15 MB

6. まとめ

Serverless Frameworkであればステージの指定やプロファイルの切替、エンドポイントやリソースの削除などもできますが、こちらのPython版はPreview版なので、まだ機能的にはさほど揃ってないようです。