プログラマでありたい

おっさんになっても、プログラマでありつづけたい

AWSのマルチアカウント管理ことはじめ ログインの一元化の設計

 日本のAWSのAPN Ambassadorが集まって作り上げるJapan APN Ambassador Advent Calendar 2020の初日です。佐々木の方からは、最近の関心事項であるマルチアカウント管理の中から、認証(ログイン)の一元化の設計について考えてみましょう。

マルチアカウント管理における認証(ログイン)の一元化の必要性

 AWSを本格的に使い始めるとすぐに直面するのが、利用するAWSアカウントの増大です。AWSのお勧めのプラクティスの一つとして、用途ごとにAWSアカウントを使い分けてリスクを下げるというのがあります。本番環境と開発環境が同居しているより、分離した上で使えるユーザーを役割ごとに限定した方がリスクを下げることができますよね。一方で、プロジェクトごと・環境ごとにAWSアカウントを分離していくとすぐに10や20のアカウントになってしまいます。その時に第一の課題となるのが、IAMユーザーの問題です。

f:id:dkfj:20201201084154p:plain


 AWSアカウントごとにIAMユーザーを作っていくと、ユーザーごとにIAMユーザーのIDとパスワードが10個も20個もできてきます。さらにAWSに携わる人が数十人いたら、数百のオーダーのID管理が必要となります。これを個々のユーザー任せで適切に管理することができるでしょうか?なかなか難しいのが現状で、放っておくと全部同じID・パスワードで運用されるといったことも発生しうるでしょう。そこで、必要になってくるのが認証(ログイン)の一元管理です。

認証の一元化のデザインパターン

認証の一元管理にも、AWSの機能のみで管理するパターンやサードパーティのツールを駆使するパターンなど幾つかあります。代表的なパターンを幾つかみていきましょう。

踏み台AWSアカウントパターン

 一番お手軽なのが踏み台AWSアカウントパターンです。踏み台となるAWSアカウントのみにIAMユーザーを発行し、後はクロスアカウントのスイッチロールでスイッチしていくパターンです。

f:id:dkfj:20201201084212p:plain

 このパターンは、踏み台となる一つのAWSアカウントのみにIAMユーザーを発行し、他のAWSアカウントにはIAMロールのみ発行します。踏み台にログイン後にスイッチロールを利用してそれぞれのAWSアカウントを利用します。スイッチされる側のIAMロールで、スイッチできるIAMユーザーを制限できるので各アカウント側で権限の制御ができるのがポイントです。また、このパターンだとAWS Organizationsで管理外のものでも簡単に利用できるというメリットもあります。ただし、スイッチ先の各アカウントでCLIを利用したい場合は、一工夫が必要となります。
 なお、このパターン名は、私が勝手に名付けているだけです。

サードパーティのIdP(Identity Provider)を利用するパターン

 次に紹介するパターンは、ある意味王道であるサードパーティのIdP(Identity Provider)を利用するパターンです。IdPは認証部分を専用のシステムに委託し、認証した結果を受け取ってAWSアカウントの利用を許可するパターンです。IdPを利用するとAWS側でID/パスワードの管理が不要になります。代表的なIdPとしては、Microsoft Active Directory(AD)やGoogle Workspace(旧G Suite),Okta,OneLoginなどがあります。

f:id:dkfj:20201201085741p:plain

 IdPを利用するパターンも、AWS部分はIAMロールを使います。そのため、踏み台AWSアカウントパターンと構成的には大きく違わないように見えます。しかし、ポイントはAWSアカウント内に一切IDとパスワードを持つ必要がない点にあります。AWSを使うような組織は、AWS以外にも様々なシステムを利用し、ID/パスワードを管理する必要があります。そこにAWSのID管理を統合できるのは大きなメリットです。一方で、踏み台AWSアカウントパターン同様にCLIを利用したい場合は一工夫が必要です。

AWS SSOを利用するパターン

 3つ目のパターンとしては、AWS SSO(AWS Single Sign-On)です。AWS SSOは、その名の通りマルチアカウントでのAWS運用を想定したサービスです。AWS SSO用のログイン画面があり、ログイン後に自身が利用できるAWSアカウントを選択できるようになっています。

f:id:dkfj:20201201091712p:plain

 構成的には、IdPパターンと大きく変わりませんが、メリットは幾つかあります。そのうちの1つが、SSOから利用しているユーザーもCLI(v2)が使えることです。もう一つは、アクセス権限セットという機能を使って、複数アカウントのアクセス権限を一元管理できることです。ただし、SSOの利用はAWS Organizationsが前提となります。それにしても、これいいじゃんってなりますよね。ただ、お勧めの使い方としては別パターンがあるので、SSOのアクセス権限セットを説明の後で紹介したいと思います。

AWS SSOのアクセス権限セット

 先程紹介したどのパターンでも、IAMロールが肝になっているのが解るでしょうか?認証の一元化はできても、どの機能が使えるかという認可の部分については各アカウントに設定されたIAMロールに依存することになります。そのため、個々のアカウントにIAMロールを設定していくという作業が必要になります。AWS OrganizationsとCloudFormation StackSetsを使えばこの辺りの作業もだいぶ楽にはなりますが、一元管理とは少し遠い世界です。
 そこで登場するのがAWS SSOのアクセス権限セットです。アクセス権限セットはユーザーごとのアクセス権限を一元管理する仕組みです。SSOを設定するOrganizationsの管理アカウント(旧マスターアカウント)で定義します。アクセス権限セットと呼ばれるポリシーを作成し、ユーザーがどの権限を利用できるかを紐付けます。管理者の操作としてはこれだけなのですが、アクセス権限セットの良いところは、裏で対象のAWSアカウントの方に、アクセス権限セットと対応するIAMロールを作っているということです。まさしく一元管理!!

お勧めのデザインパターン IdP + AWS SSO

 アクセス権限セットとCLI対応の2点でAWS SSOがお勧めです。一方で、いろいろな現場でSSOを紹介しても、やっぱり既存のIdPを使いたいというケースが多いです。やっぱりIDの二重管理は嫌ですもんね。そんな時にお勧めがIdP + AWS SSOというパターンです

f:id:dkfj:20201201093752p:plain

 構成としては、ユーザーはIdPでまず認証します。認証後にAWS SSOのポータル画面に移動します。そして、任意のAWSアカウントに移動するというパターンです。画面遷移が一つ増えるという手間が増えますが、このパターンには大きなメリットがあります

  • ID管理をAWS以外も含めて一元化できる
  • 認証(IdP)と認可(アクセス権限)を明示的に分離できる
  • AWS SSOの機能が100%利用できる
  • 今後AWS SSOの機能が増えてもグヌヌとならない

まとめ

 AWSのマルチアカウント管理については、踏み台AWSアカウントあたりから始める人が多いのではと思います。コストも掛からないので、それで充分な場合も多いです。一方で大規模になると辛くなるということもあります。そんな際の参考になれればなと思います。
 じつはこの辺の話をAWSの薄い本Ⅲとしてまとめようと思いつつ、はや半年が過ぎました。1行もかけていません。年内に執筆在庫を一層して、年初あたりから取りかかれればと思っておりますので、生暖かい目で見守ってください。また、AWS SSOを使う上では、Organizationsが必須となります。請求代行使っててOrganizations使えないよという方は、Organizations対応の支払い代行とかしているところを検討するといいんじゃないかなと思います。(ステマ)
 今回は論理設計の話が中心だったので、もう少し具体的な話を今後紹介していきます。乞うご期待!!

www.nri-net.com


booth.pm

booth.pm

コンテナ化とサーバーレス、2つのトレンドに対する雑感

 日本からre:Inventを眺めていた雑感です。速報で2つほど新サービスに対しての感想をまとめていますが、今回は全体的なトレンドに対して今考えている事です。今回は1行じゃないですよ。

サービス展開の方向は、全方位的


 サービスの展開方向としては、去年と変わらないような気がします。他のクラウド(Google, Azure)に対して弱かった部分をきっちりキャッチアップし、伸びている分野(AI・機械学習)のラインナップを増やしていく。そして、サードパーティが提供している機能に対して、一定以上の規模が出てくると(買収 or 自社開発で)サービス化する。いわゆるサードパーティ殺し。
 そんな中で提供されているサービスの作り方/インフラ的な部分を見てみると、コンテナとサーバレス(lambda)を使った物が多いです。AWS自身がコンテナとサーバレスを活用することで、開発を加速しサービスをスケールしやすくしていることが見て取れます。

2015年のWerner VogelsのKeynoteを振り返る


 そんな光景をみていると思い出すのが、2015年のWerner VogelsのKeynoteです。『自由』をテーマにビジネス/エンジニアが何から開放されるのかを語っていました。注目は、その中の一枚のスライドです。

f:id:dkfj:20171203062754p:plain

AWS re:Invent 2015 Keynote | Werner Vogels - YouTube
www.youtube.com

 AWSの中心的な存在である仮想マシン(ec2)に対して、コンテナとfunctions(≒Lambda,サーバレス)を並べています。当時のトレンドとしては、コンテナに対する理解はだいぶ進んでいたものの、functionsに対しては何じゃそれというのが大半でした。そんな情勢なのに、コンテナだけでなくfunctionsについても同列に置くのかと驚いていました。
 次の2枚の写真は、Google Trendsでみる検索数の推移です。検索語については変えていますが、コンテナの方が当時でも優勢です。

f:id:dkfj:20171203063749p:plainf:id:dkfj:20171203064110p:plain

 その後をみていると、特にIoT関連のサービスが顕著なのですが、サービスがLambda連携で作られているモノ/拡張される物が多数出てきています。ユーザーにはfunctionsを使わせるという方向です。で、このコンテナとfunctionsですが、別に対立的な関係になっている訳ではないのです。
 AWSが作ってるLambdaも(Dockerじゃないけど)コンテナをベースに作られています。そして、そのコンテナもEC2などの仮想サーバをベースに提供されています。つまり、個々のトレンドは一足飛びで突然出てきている訳ではなく、連綿と続くサービスの積み重ねの上で提供されているということです。ということで、クラウド・プロバイダという点では、AWS, Google, Azure以外の所の台頭は難しいんでしょうね。例外的には、中国という独自の環境で育ったAlibabaがありますが。

それでは、ユーザーはどうするか?


 じゃぁ今後ユーザーはシステムをどうやって作っていけば良いのでしょうか?何でもサーバーレス・何でもコンテナって考えると、たぶん失敗します。結論的には、月並みな言葉ですが、適材適所で作っていきましょうとなります。
 まずサーバーレスですが、作る上での制約が厳しいです。 API Gateway・Lambdaを始め、AWS側の制約に則って作る必要があります。だってAWSのルールですから。一方で、システム構築/サービス展開する上で、この制約に則って作ることは良いものが出来る可能性は高いです。何故ならば、AWSが今まで作ってきたもののベストプラクティスを元にしているからです。その為、非機能要件のような汎用的に求められるものについては、サーバレスの仕組みにデフォルトで組み込まれています。だからサーバーレスで作れないか検討してみましょう。それが駄目だったら、コンテナか普通の仮想マシンを検討するのが良いです。
 次にコンテナ。これも新規に作るシステムだったら、仮想マシンじゃなくてコンテナから検討した方が良いと思います。一方で、過去のシステムをコンテナ化しようとすると、作った人を恨みたくなるとかいろいろ闇が出てくるので止めた方が良いかもしれないです。逆にこれから作るシステムでコンテナ化できないようなものは、たいていの場合はアーキテクチャなり設計を見直した方がよいです。システムが密結合になり過ぎているということでしょう。
 一方で、システム/サービスの肝となる部分については、サーバーレス・コンテナに縛られずにゼロベースで考えるべきです。プラットフォームの制約のためにサービスの性質を変えるというのは、恐らく間違っている可能性が高いです。

コンテナ化とサーバーレス化が進んだ後の世界


 ついでにコンテナ化とサーバレス化が進んだ後はどうなるのだろうと、ちょっと考えてみましょう。恐らくマルチクラウド化が進むと思います。コンテナ・サーバーレスともシステム/アプリケーションの可搬性を高めます。そうなると、AWSで動かしてたシステムをGoogleやAzureに持っていくことが簡単になります。当然、逆も然りです。
 可搬性が高いのであれば、より有利なクラウドを選ぶようになります。例えば、re:Inventの発表前では、AWSはKubernetesベースのサービスは提供されていませんでした。そこで、コンテナ関係はGoogleのクラウドを利用するという選択肢があり、実際AWSをメインに使っていてコンテナ部分だけGoogleで動かしているという話も結構聞きます。

マルチクラウド化になると複数のクラウドを使えなければいけないのか?


 じゃぁみんなが複数のクラウドを使いこなさないと駄目なのでしょうか。これはNoだと思います。まず、企業としては規模次第です。大規模な会社でシステムも多く多数のエンジニアがいる場合は、適材適所でクラウドを使い分ければよいと思います。一方で少人数のエンジニアチームで複数のクラウドを使いこなすというのは、よっぽどの精鋭チームでしか出来ないと思います。また、個人にフォーカスしてみると全部のクラウドに精通するということは、時間的な制約で恐らく難しいでしょう。複数のクラウドのマスターだよって人は是非手をあげてください。今だと引く手あまたです。
 マルチクラウドの話に戻すと、恐らくデータの集積の基本となるクラウドと、それを元に部分的に複数のクラウドを使っていくという形が増えていくのではないでしょうか。今だとデータをS3に集めて、AI部分のみ別のクラウド使って、またADだけAzure使ってという所は結構あるかもしれません。基本となるクラウドが1つあれば、後は良いとこ取りできるよというのがマルチクラウドだと思います。

まとめ


 毎年、re:Inventで発表されるサービスを見るたびに、この先どこで食っていこうかなと思います。ここ2〜3年は、コンテナ・サーバーレスの知見があれば食っていくことには困らないでしょう。一方で、正味のシステム構築部分自体は小さくなってきます。昔から言われていますが、SIer的なピラミッド構造の産業は難しくなってくるでしょうね。また、発注側の情報システム部門も厳しくなると思います。だって、クラウドに着いて行くのが難しいんだもん。

シリーズ
AWSの新サービス群に対する一行所感
(続)AWSの新サービス群に対する一行所感

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/03/25
  • メディア: Kindle版
  • この商品を含むブログを見る

(続)AWSの新サービス群に対する一行所感

 昨日のAWSの新サービス群に対する一行所感に続き、二回目です。タイトル通り一行じゃないのは、書いてる時の気分の問題です。

AWS Serverless Application Repository


Serverlessアプリケーション版のGithub。SAM形式で作ってたら公開可能。限定公開とか一般公開とか出来る 。とりあえず9割の人が利用者側にまわるサービスかな。

aws.amazon.com

AWS Cloud9


2016年にAWSに買収されたオンラインIDEのCloud9。1年の雌伏の時を経てAWSのサービスとして登場。ペアプロとかも出来る。ちなみにCloud nineというのは、至福という意味

aws.amazon.com

Amazon EC2用スプレッドプレイスメントグループ


 従来のプレイスメントグループに、機能拡張。今までは、ネットワーク的に近くという目的だったが、今度は物理的に別の筐体にという指定。耐障害性があがるが、Multi-AZ構成と性能計算をちゃんとやってればいらないのではという気も。一方で、デフォルトで指定されててもいいかも。

aws.amazon.com

インターリージョンVPCピアリング


 リージョンまたいでのVPCピアリングが可能に。先月発表されたDX Gatewayと併せて、どう使うかよーく考えよう。
※ほぼ執筆完了した本で、企業のネットワーク設計をどうすべきかという話をあーだこーだ書いてて前提が変わったので困ってる

aws.amazon.com

AWS WAFのマネージドルール


WAFの設定をTrend Microのような専門の会社から買うことが出来る仕組み。当然、定義の自動アップデート機能付き。セキュリティ会社的には嬉しいだろうが、AWSへの従属性高まるので手放しでは喜べないだろうなぁ

aws.amazon.com

T2 Unlimited


 バースト特性のあるt2インスタンス。問題は、バースト期間を過ぎると極端に性能が落ち、バーストしている時は例外なく負荷高い時なので、切れると死ぬということ。それをお金で解決するのがT2 Unlimited

aws.amazon.com

API GatewayのVPCサポート


ようやく来たAPI GatewayのVPC対応。今まで何度お客さんに、何でVPC内で使えないのと聞かれたことか。

Amazon API Gateway でプライベート VPC とのエンドポイント統合をサポート

まとめ


 EFSやSQSのFIFOキュー、結局東京リージョンに来なかったね。

シリーズ
AWSの新サービス群に対する一行所感
コンテナ化とサーバーレス、2つのトレンドに対する雑感

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る
Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/03/25
  • メディア: Kindle版
  • この商品を含むブログを見る

AWSの新サービス群に対する一行所感

 今年もラスベガスで、AWSの最大のイベントre:Invent開催中です。初回のキーノートが終わった所ですが、怒涛のサービス発表で頭が混乱中です。整理のために、サービスに対する感想をつけてみます。間違っているかもしれないので、悪しからず。

AWS AppSync

 モバイル等での複数端末のデータ同期を見据えたソリューション。必要性はすごく解るが、それってCognito Syncでやりたかったことじゃないのかな?認証認可のサービスにデータ同期を加えた筋の悪さを解消に来たのか?

2017/12/3 追記
中の人曰く、次のような役割分担とのこと

AWSの新サービス群に対する一行所感 - プログラマでありたい

ありがたし / Cognito Syncは「一つのIdentityに(≒一人の人間)が持つ」複数端末間での設定値等の同期のためのものだったので、前提と志向が違うのです > AppSync “それってCognito Syncでやりたかったことじゃないのかな?”

2017/12/03 12:21
b.hatena.ne.jp


aws.amazon.com

Amazon GuardDuty

 初見の印象は、TrendMicroを殺しに来るサービス。一方で、TrendMicroの方もLauch Partnerとして、Amazon GuardDuty and Deep Securityを出してきている。庇を貸して母屋を取らないようにギリギリのところで勝負している印象。

aws.amazon.com

Amazon EC2 Bare Metal

 生のハードウェアを貸しますよという昔のSoftLayerのようなサービス。目的は2つあって、全ての仮想化サーバーをAWSで取り込めるようにするのと、ガチGPU勢とかハードウェアリソースを100%使いたい人に対応だと思う。これ普及したら、なんちゃってプライベートクラウドはなくなるだろうね。

aws.amazon.com

Amazon MQ

 Apache Active MQのPaaS版。既存のMQ入れている所に対して、そのまま移行できますよというサービス。IBMとかを殺しにいっているのかな。SQSを既に使っている人は、そのままSQSで良いでしょう。ところで、FIFOキューは日本に来ないの?

aws.amazon.com

AWS Fargate

 仮想サーバじゃなくてコンテナを直接起動するサービス。もう世の中、コンテナだよね。中の人曰く、イベント・ドリブン的なサービスは、Lambda。ロングランなバッチなどにはFargate。

aws.amazon.com

Amazon Aurora Serverless

 もうちょっと名前の付け方考えた方がよいのではというのが、Aurora Serverless。Lambda等のサーバレスアーキテクチャと親和性が高いAuroraという訳ではない。単純に個々のインスタンスを意識せず良い塩梅にコントロールしてくれるというサービス。PaaSのAuroraが、SaaSのAuroraになったようなイメージ。

aws.amazon.com

Amazon Neptune

 フルマネージドなグラフDBサービス。これ、裏でAuroraの技術使っているのではという気もする。いずれにせよ、NoSQLも自前でインストールして使う時代ではなくなったのだろう。

aws.amazon.com

Amazon DynamoDBにGlobal TablesとOn-Demand Backup追加

 Global Tablesは、AzureのCosmoDB、Google Spannerを意識した機能かな。バックアップ/リストアは、ようやく来たのかという感じ

aws.amazon.com

Amazon Elastic Container Service for Kubernetes

 予想通りECSのKubernetes対応が発表。去年のがっかり感が、ようやく解消。略称がEKSというところに、Amazonのプライドと苦悩が垣間見れる。

aws.amazon.com

S3 Select と Glacier Select

 Simple Storage Serviceという名前に関わらず、恐ろしく多機能になっているS3。Select文でオブジェクトの一部のデータが抽出が可能に。Athenaとかの開発の副産物でしょうな。

aws.amazon.com

Amazon Rekognition Video

 映像の認識処理のサービス。ぜったいDMMのAPIとつないでみる奴でてくるで

aws.amazon.com

Amazon SageMaker

 機械学習のライフサイクルをサポートするサービス。これもサードパーティー殺しだな

aws.amazon.com

Amazon Transcribe

 音声⇒テキスト変換。初回Launchは、英語・スペイン語のみ。きっとすぐに、日本語に対応してくれるでしょう。

aws.amazon.com

Amazon Kinesis Video Streams

 大量のセンサーデータをKinesisが扱うように、ビデオ画像もKinesisで扱えるようになった。先述のRekognition Videoのようなものと組み合わせて、防犯カメラからの映像をリアルタイムで異常検知というようなことができるようになるんでしょうね。

aws.amazon.com

Amazon Translate

 リアルタイム翻訳サービス。APIが提供されるだろうからプロダクトに組み込みやすいだろうが、精度の点でGoogleに勝てるのだろうか?

aws.amazon.com

IoTサービス群

 怒涛のIoT関係サービスのリリース。これで、ほぼほぼ出揃った?

 AWS IoT Device Defender IoT版のDeepSecurityみたいな感じ?

aws.amazon.com

 AWS IoT Device Management IoTの個々の機器の管理。やっぱり必要だよね

aws.amazon.com

 AWS IoT Analytics IoTの分析サービス。AWSは分析サービスをいろいろ出してるけど、どれもイマイチ感は拭えない。。。

aws.amazon.com

 Amazon FreeRTOS IoT用のOSまで作っちゃいました。

aws.amazon.com

AWS Systems Manager

 EC2 System Managerを更にラップしたようなサービス。複数のEC2やRDS,S3をグルーピングしてくれる。もうちょっと拡張してIAMの権限管理とかもできれば、本番・開発環境のために複数アカウントとかする必要なくなるのだけどなぁ

aws.amazon.com

Amazon Time Sync Service

 とどのつまりが、NTPサービス。やっと出してくれたのかという反面、なんで今までなかったのか。

aws.amazon.com

Amazon Comprehend

 自然言語処理。Mecab以来目立って進化していないような気がするので、何気に嬉しいし使い所が沢山ありそう。自然言語処理ってなんぞやと言う人は、文章中から特定のキーワードを引っこ抜くとか単語単位に分解するサービス程度に認識してればO.K.

aws.amazon.com

まとめ

 まとめきれません。

続き
(続)AWSの新サービス群に対する一行所感
コンテナ化とサーバーレス、2つのトレンドに対する雑感


Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

Amazon Web Services 業務システム設計・移行ガイド (Informatics&IDEA)

  • 作者: 佐々木拓郎,林晋一郎,瀬戸島敏宏,宮川亮,金澤圭
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2018/01/20
  • メディア: 単行本
  • この商品を含むブログを見る
Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/03/25
  • メディア: Kindle版
  • この商品を含むブログを見る

AWS Device Farmでモバイルアプリのテスト

 すいません。すっかり遅くなりましたが、iOS Second Stage Advent Calendar 2015です。アプリ開発でやっぱり重要なのが、テストです。モバイルアプリの場合は、実機での確認も必要で機種も多いので特に大変です。そういった所で最近注目を集めているのが、インターネット経由で実機を操作するクラウドサービスです。

モバイルアプリ検証のクラウド型プラットフォーム



 スマホアプリのテスト・プラットフォームの話をすると、シミュレータの話と思う人が結構います。シミュレータは、画面サイズのみ再現するのみで内部の動作のテストは出来ません。クラウド型のテスト・プラットフォームは、インターネットの先に実機がつながっているのがポイントです。AWSもAWS Device Farmという同様のサービスを出しています。イメージ的には、下記のような図です。※あくまで想像図です。

f:id:dkfj:20151222115016p:plain

 たぶん物理筐体から、何十、何百というデバイスをニョキニョキと繋いでいるのだと思います。そのケーブルはiPhoneであるならば、きっとAmazonベーシック ハイクオリティーライトニングUSB充電ケーブルでしょう。ちなみにクラウドサービスで、物理筐体&デバイスが出てきて違和感あるかもしれません。クラウド事業者にとって、クラウドは仮想化の話ではなく、物理の問題なんです。きっと

AWS Device Farmの凄いところ



 AWS Device FarmはAndroidを中心に100以上の端末・OSの組み合わせを揃えています。モバイルアプリを運用する所で難しい点は、特定の端末・OSのみ発生するケースがどうしても出る点です。主要な機種は揃えるものの、複数のOSを揃えるのは現実問題厳しいです。そういった時に、スマホのテスト専門会社に依頼するというのも1つの手段ですが、コスト的に難しい場合も多々あります。そういった時に、AWS Device Farmを始めとするクラウド型のテストプラットフォームの活用を検討してみましょう。
 またAWS Device Farmの凄い所としては、iOSのテストが出来るところです。この手のサービスの性格上、実機を直接操作する必要があります。Androidはそういった仕組みが整っているのですが、iOSについてはデバイスをリモートで操作する仕組みは余りありません。無理やり実現しようとすると、JailBreakの必要性もあるかもしれません。それにも関わらずAWSは実現しています。Appleと交渉したのか、その他の方法で実現したのか解りませんが、とにかく正式なサービスとして提供できてるAmazonは凄いです。

AWS Device Farmを試してみる



 AWS Device Farmは製品版となるipaをアップロードしてテストします。ということで手軽に試すには、iTunesストアから落としたアプリをアップロードしてテストしてみましょう。Macだとホーム->ミュージック->iTunes->iTunes Media->Mobile Applicationsにあります。

プロジェクトの作成

 Device Farmは現在、米国西部Oregonリージョンのみ利用できます。ハッキリ言って場所は全然関係ないので、気にせず使いましょう。サービスを選んだらプロジェクトを作成します。
f:id:dkfj:20151222120556p:plain

アプリケーションのアップロード

 次にアプリケーションをアップロードします。iOSの場合はipaで、Androidの場合はapkです。拡張子から勝手に判断してくれるので、特に気にする必要はありません。
f:id:dkfj:20151222120806p:plain 

テストの種類の選択

 次にテストの種類を選択します。AppiumによるJUnit/TestNGのテストやCalabash,UI Automation,XCTestなど自作のテストコードをアップロードするものと、Fuzzテストという起動・実行のテストがあります。ここでは、Fuzzテストを選びます。
f:id:dkfj:20151222121415p:plain

テスト対象のデバイスの選択

 テスト対象のデバイス・OSの組み合わせを選択します。iOSの場合は端末バリエーションというより、OSのバリエーションという側面が強いでしょうね。デフォルトのままでも問題ないと思います。
f:id:dkfj:20151222120932p:plain

デバイス設定

 デバイスを選んだら、次は設定(Config)を行います。ここで他のアプリをアップロードすることにより連係のテストも出来る(はず)です。また、位置情報や言語設定もできます。
f:id:dkfj:20151222121103p:plain
f:id:dkfj:20151222121235p:plain

実行&レポート

 設定終わって実行すると、バックエンドで自動的にテストが始まります。その後に、レポートも自動生成されます。下記の例だと、エラーが発生しています。クリックしていくと、どこでエラーが出たのかも表示されます。
f:id:dkfj:20151222122312p:plain

感想



 まだ動かしてみたというレベルですが、可能性を感じます。Androidに較べてiOSはまだまだこれからという部分もあると思いますが、今後はCI等と組み合わせてテストの自動化につなげていきたいと思います。特にSwift化で、クラウド上のサーバサイドのビルドも容易になるはずなので、来年辺りノウハウが一気に広がるかもしれませんね。

プログラマになりたい Advent Calendar 2015 - Qiita
プログラマになりたい Advent Calendar 2015 - Adventar
http://qiita.com/advent-calendar/2015/ios-2

AWS Lambda+PhantomJS/CasperJSでスクレイピング

 AWS Lambdaはサーバ不要のプログラムの実行エンジンです。インフラ側はAWSが管理するのですが、実行原理が解っていると思いの外に自由度が高いです。Shellやコマンドを同梱させれば動くし、依存するライブラリがなければAmazon Linux上でビルドして同梱させれば良いのです。その実例の1つに、Lambda+PhantomJSがあります。PhantomJSは、ブラウザ不要で画面描画ができるツールです。リンクのクリックやボタンの押下・フォームに入力も出来るので、ログインが必要なページの情報を取ってくるということやスクリーンショットを取るといったことも可能です。LambdaとPhantomJSを組み合わせてお手軽スクレイピングをしてみましょう。

プロジェクトの用意



 Github上にビルド済みのライブラリ込のプロジェクト(phantom-lambda-template)があるので、それを使います。生のライブラリ等が配置されているので、こういう感じでやるのだと参考にもなると思います。

github.com

ソースを落としてきたら、まずそのディレクトリに移動して依存関係のモジュールをインストールします。

$ npm install

次に環境設定ファイルを作ります。

$ npm run setup 
$ vi .env
AWS_ENVIRONMENT=development
AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXXXXX
AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXX
AWS_ROLE_ARN=arn:aws:iam::123456789012:role/lambda-phantomjs
AWS_REGION=us-east-1
AWS_FUNCTION_NAME=phantom-lambda-template
AWS_HANDLER=index.handler
AWS_MODE=event
AWS_MEMORY_SIZE=128
AWS_TIMEOUT=300
AWS_DESCRIPTION=
AWS_RUNTIME=nodejs

AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY,AWS_ROLE_ARNの部分を編集しておいてください。AWS_TIMEOUTもデフォルト3秒なので長めに設定しておきます。(この例は、最大値である300秒にしています。)注意点としては、このACCESS_KEYが設定されているユーザは、Lambdaのアップロードする権限とローカルで実行する為の権限です。ROLE_ARNの方が、実際にLambdaで実行される場合の権限になります。それぞれ適切なものを設定しておく必要があります。

ここまで設定したらローカル実行してください。エラーがでなければ、O.K.です。

$ npm run start

次にLambdaにアップロードします。下記のコマンドでアップできるようになっています。素晴らしい

$ npm run deploy

AWSコンソールにログインしてみるとLambdaファンクションが出来ているはずです。
f:id:dkfj:20151201015934p:plain
実行してみてください。デフォルトのサンプルだと、コンソールログに'Hello from phantom'と出るだけです。

このテンプレートがやっていること



 ちなみにこのモジュールをどうやって作っているのかは、同梱のシェルを見ると解ります。Amazon Linuxのインスタンスでビルドしたモジュールを利用しています。PhantomJSに限らず、同じようなやり方で色々なモジュールをLambdaで使えます。

build-phantomjs.sh

# Launch an EC2 instance using the region-appropriate AMI from this document:
# http://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.

# Use a fairly beefy Spot Instance (c4.large is good) unless you want to wait
# for a long time. Don't bother with a t2.micro.

# Once it starts, SSH into the machine:

ssh ec2-user@your-ec2-box.amazonaws.com

# And then run (following the instructions from
# http://phantomjs.org/build.html):

sudo yum -y install gcc gcc-c++ make flex bison gperf ruby \
  openssl-devel freetype-devel fontconfig-devel libicu-devel sqlite-devel \
  libpng-devel libjpeg-devel

wget https://github.com/ariya/phantomjs/archive/1.9.7.zip
unzip 1.9.7.zip
cd phantomjs-1.9.7/
./build.sh --confirm

# Once it's finished, retrieve the build product (run from your local machine):
scp ec2-user@your-ec2-box.amazonaws.com:phantomjs-1.9.7/bin/phantomjs .

# Since this AMI includes a newer version of libicudata than Amazon Lambda,
# we need to include those libraries too.
# This won't be necessary once
# https://github.com/ariya/phantomjs/issues/12948 is fixed.
scp ec2-user@your-ec2-box.amazonaws.com:"/usr/lib64/libicu*50" .

# That's it! Don't forget to terminate the EC2 instance.

カスタマイズ



 スクリーンショットを取る例に変えてみます。

var page = require('webpage').create();

page.viewportSize = { width: 1920, height: 1080 };
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36';

page.open('http://github.com/', function() {
  page.render('github.png');
  phantom.exit();
});

ローカルで実行すると、github.pngというファイルが出来ると思います。後は、これをS3等にアップロードするようなものを使うと、Lambdaクローラーとして機能し始めます。この辺りはハマりポイント多いので、また時間作って書き足します。

まとめ



 Lambdaは、今年のアップデートで実行時間がMax5分。更にスケジュール実行の機能が付きました。これでクローラー作る為にサーバを用意する必要がほぼなくなっています。あとは、Pythonで作るか、Node.JSで作るかです。今年はNode.JSの良いクローラー本が出たので、それを参考にどんどんアイデアを実現できればなと思います。Ruby本もよろしくね

See Also:
クローラー/スクレイピング本がざくざく
『Rubyによるクローラー開発技法』を書きました
Rubyによるクローラー開発技法の目次
Lambdaで作るクローラー/スクレイピング


参照:
クローラー/Webスクレイピング Advent Calendar 2015
プログラマになりたい Advent Calendar 2015

クラスメソッドさんの勉強会で、Swaggerの話をしてきました

 縁あってクラスメソッドさん&Amazon Web Servicies Japan主催の「AWSモバイル/IoTサービス徹底攻略!!」に登壇してきました。テーマは、"Swaggerで始めるモデルファーストなAPI開発"ということで、Swaggerの話です。

発表の内容



 ベーシックセッションで、またそもそもSwaggerって何という人が大半を占めているという予想から、そもそもSwaggerとは何かとかREST APIとの関係、何が嬉しいのというのを中心に紹介しました。そして、AWSとの関係性ということから、Swaggerを使ってAPI Gatewayをインポートするというところまでです。

www.slideshare.net

 正直なところ、私の理解が追いついていないので、この内容が精一杯でした。本当は、API Gatewayの部分をもう少し厚くして定義の作り方とか実践的な部分もやりたかったです。それはまた次回ということで、勉強しておきます。

発表の経緯



  1. 2015年7月 @Keisuke69さんのAPI GatewayのBlackbeltで、Swaggerの存在を知る。
  2. 2015年9月 某所で、@Keisuke69さんと話をしていてAPI Gatewayを手で設定する奴なんていない。Swaggerだろと煽られる
  3. 2015年10月 re:Invent中に現地のエンジニアに話を聞いて、Swaggerの普及度を知る 
  4. @Keisuke69さんから、登壇打診される

Swaggerの日本語での情報少ないので、誰か説明してくれんかなぁと思っていたらお鉢が回ってきました。おかげで凄く勉強になりました。本当に有難うございます!!今回は、キツかった。。。

Swaggerの利用事例



 発表後に@c9katayamaさんに、ソラコムのAPIのドキュメントページにSwagger使ってるよと教えて頂けました。www.facebook.com

dev.soracom.io

 Swaggerで生成したドキュメントを埋め込んで、そのまま利用している例です。解りやすいですし、更新の手間も掛からないので凄く良いですね。

感想



 Swaggerについては、まだ調べ始めたところなので、もっと使い込んで利用の仕方等を判断したいと思います。どのみちAPI Gatewayとセットで使うと思うので、ちょうど良いタイミングです。
 あと、主催のクラスメソッドさん。発表内容の質・量、そしてテーマの幅と凄いですね。さらにそれを即日でレポートできる機動力。現地でみていましたが、みなさん楽しんでやっておられました。これは強いですね。お邪魔させて頂き、ありがとうございました。


Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

Amazon Web Services パターン別構築・運用ガイド  一番大切な知識と技術が身につく

  • 作者: NRIネットコム株式会社,佐々木拓郎,林晋一郎,小西秀和,佐藤瞬
  • 出版社/メーカー: SBクリエイティブ
  • 発売日: 2015/03/25
  • メディア: Kindle版
  • この商品を含むブログを見る

See Also:
「JAWS-UG CLI専門支部 #31 - Lambda入門」に参加してきました
サーバレスアーキテクチャとは?
サーバレスアーキテクチャ(ServerLess Architecture)とBaaSの違い
仮想サーバ、コンテナサービス、ファンクション
クラウドファーストとクラウドネイティブ
AWS Mobile HubとAmazon API Gatewayからモバイル開発の今後を考える
JAWSUG千葉で、API Gatewayの話をしてきました。
5分で何となく解るAmazon Cognito