windows2020のブログ

AWSはじめました

サーバレスユーザ管理

https://github.com/awslabs/aws-serverless-workshops/tree/master/WebApplication/2_UserManagement
上記URLをベースにユーザ管理のサービスをセットアップします。

こちらも前回と同様に、CloudFormationで自動的にセットアップしてくれるようです。
Asia Pacific (Tokyo)横のLaunch Stackを選択し、
まずは次へを押します。

詳細の指定画面で
Website Bucket Name
には、Webページ構築で入力した値と同じものを入力します。
次へ次へと進んでいきます。

最後の確認ページで
「WS CloudFormation によって IAM リソースが作成される場合があることを承認します。」
にチェックを入れて、作成を押します。

5分程度で作成完了。

前回作成したWebページにて、ユーザ登録ができるようになっています。
f:id:windows2020:20170629060215p:plain

作成したユーザはCognitoというサービスで管理されます。
ユーザ管理機能を1から作ろうとすると、データベースやディレクトリサービスなどを準備する必要がありますが、Cognitoを使うとその辺の準備が省略できます。

サーバレスWeb Hosting

https://github.com/awslabs/aws-serverless-workshops/tree/master/WebApplication/1_StaticWebHosting
上記URLをベースにS3上にWebページの静的コンテンツを配置します。

CloudFormationでS3を自動的にセットアップしてくれるようです。
Asia Pacific (Tokyo)横のLaunch Stackを選択し、
まずは次へを押します。

詳細の指定画面で
Website Bucket Name
に入力し、次へ次へと進んでいきます。

最後の確認ページで
「WS CloudFormation によって IAM リソースが作成される場合があることを承認します。」
にチェックを入れて、作成を押します。

5分程度で作成完了。

CloudFormationの管理画面で先ほど作成したスタック名を選択。
デフォルトのまま進んだ人は「wildrydes-webapp-1」になっています。
さらに出力のタブを開くと、ウェブサイトのURLが記載されており、
クリックするとWebページが表示されます。

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

これまで、仕事ではハードウェアやネットワーク、OSからミドルウェア、データベースまでを担当してきて、UIのところだけまだ手付かずの状態でした。
フルスタックエンジニアという言葉にあこがれて、UI(Webアプリケーション)のところにも手を出してみようと思います。

AWS上のサービスの中でlambdaをさわる機会が多くて、なかなかサーバレスのアーキテクチャというのは、
バックアップやOSのパッチ運用、EC2のような起動しているだけで課金されるといったことを考慮する必要がなく、便利だなと感じていました。

サーバレスアーキテクチャをキーワードにWebアプリケーションもサーバレスで構築できるのではと調べてみて、
こちらのURLを発見しました。
https://github.com/awslabs/aws-serverless-workshops/tree/master/WebApplication

どうやら、下記のような構成になるようです。

サービス 役割
S3 HTMLやjavascriptやなどのUI部分
cognito ユーザ認証
API gateway,lambda,dynamo バックエンド

まだ試していないですが、サーバレスアーキテクチャのサンプルCloudFormationもあるようです。
https://github.com/awslabs/lambda-refarch-webapp/

describe_instancesの結果をJSON形式で

PythonのAWSCLIでインスタンスの情報をJSON形式で取得するため、以下のように実行しましたが、

import boto3
import collections
import json
ec2 = boto3.client('ec2')
r = ec2.describe_instances(Filters=[{'Name':'tag-key','Values':['Name']}])['Reservations']
json.dumps(r,indent=2)

とすると、以下のようなエラーがでました。

TypeError: datetime.datetime(2017, 6, 2, 22, 11, 31, tzinfo=tzutc()) is not JSON serializable

どうも、出力の中にdatetime(2017・・・といった関数が含まれることで、JSON形式として認識できないようです。

回避策としてはpymongoというモジュールをインストールして、出力形式を調整してやればよいようです。

まずは

sudo pip install pymongo

でインストールし、
pythonでは以下のようにしてやると
JSON形式で出力できるようになりました。

AWS上のインスタンスのバックアップ

AWS上のインスタンスをどのようにバックアップしようか調査していたら、下記のホワイトペーパーを見つけました。

https://d0.awsstatic.com/whitepapers/jp/Backup%20and%20recovery%20approaches%20using%20AWS.pdf

基本的にはEBSスナップショットかAMIイメージ作成をバックアップとして利用しましょうということですが、注意点としては

  • キャッシュデータをディスクへフラッシュした後にバックアップをとる。
  • ディスク書き込みが発生していないタイミングでバックアップをとる。

というのがありました。

最近のバックアップ製品であれば、オンライン状態のまま、バックアップを取ることも可能なので、注意が必要です。
WindowsであればOS標準のWindowsBackupを取得して、できあがったbkfファイルをスナップショットすればよいかなと思いましたが、bkfファイルだと毎回新規作成になるので、スナップショットの2世代目以降は差分データのみ保存されるの機能が有効になるのか怪しいところです。
バックアップ製品のライセンス費用とAWSのストレージ費用ではどちらが高いか比較が必要そうです。

ちなみに、上記のホワイトペーパーはAWS上のインスタンスのバックアップだけでなく、オンプレミス環境のサーバのバックアップをAWS上のS3やGlacierを使って格納する方法についても記載がありました。

boto3 not defined

前回のブログにて、boto3が見つかりませんのエラーが出ると書きましたが、ソースをよく見ると、boto3がimportされていませんでした。
コピペミスをしていただけのようです。

調べていく中で、AWS CLIの初期設定の方法などもありましたので、書いておきたいと思います。

AWS CLIをインストールした後、まず最初に実行しないといけないのは

aws configure

これを実行すると、AWSAccess Key IDやSecret Access Keyを入力せよと出てきます。
これはIAMでアカウントを設定するとゲットできます。
コンソールへのログインはメールアドレスとパスワードを使っていたのですが、
これとは別にアカウントを作成しておいた方が不慮の事故の際に対応しやすいとのことです。

あとaws configureの中で、デフォルトRegionも設定しておく必要があるようです。

lambdaでSnapshot

EC2のスナップショットバックアップを定期的に取得しようと考えて、
lambdaからSnapshotを取得できないか調べてみました。

下記のURLにすごく詳しく書いていただいているので、
参考にさせていただきました。

http://qiita.com/eiroh/items/66bb68d12bd8fdbbd076

実行してみようとすると、

NameError: name 'boto3' is not defined

となり、エラーが発生しました。
boto3のインストールができていないのかと思い、
sudo pip install boto3
としてみたのですが、結果は変わらず。

もう少し調べてみようと思います。