20200324のAWSに関する記事は14件です。

EC2の処理が突然遅くなったときはCPUクレジットを確認しよう

はじめに

EC2のインスタンス上で画像処理をする機能を社内用に提供していました。
ところが、変換するのに通常より時間がかかってくるとの声が上がってきました。
しかも、午前中は大丈夫だが、午後になると遅くなって使い物にならなくなるとのこと。

調査してみると、CPUクレジットが枯渇していることが原因となっているようでした。
CPUクレジットとは何か、なぜ午後に遅くなってしまったのかをまとめます。

まずは調査

まずはともあれEC2のモニタリングを確認です。

CPUクレジット残高を見てみると、遅いと言われている時間に0になっていることがわかりました。
その前にCPUクレジットとは何なのでしょうか。

CPUクレジットとは

ここで一旦インスタンスタイプを確認します。今回使用していたインスタンスタイプはt2.microでした。
12か月間の無料利用枠の対象にもなっているので、とりあえず選択する方も多いのではないでしょうか。
T2, T3, T3aインスタンスはバースト可能パフォーマンスインスタンスに分類されます

バースト可能パフォーマンスインスタンスとは

バースト可能パフォーマンスインスタンスには、ベースラインがインスタンスタイプ毎に設定されています。
例えば、t2.microではvCPUは1で、ベースラインは10%になります。

普段はベースラインでのパフォーマンスを提供するが、必要なときにはベースラインを超えて提供してもらえます。
ここでベースラインを超えて提供してもらえる時間を管理しているのが、CPUクレジットになります。
CPU100%で1分間処理するには、CPUクレジットを1払う必要があります。

CPUクレジットは基本的には時間経過によって貯まります。(T2シリーズのみ起動時にも付与されます)
t2.microの場合、1時間あたりに6貯まり、最大144まで貯めることが出来ます。

つまりCPUクレジットとは名前の通り本当にお金のようなもので、
ベースラインの10%を超えてCPUを使いたいときは、CPUクレジットを払ってCPUのパフォーマンスを高められます。
しかし、CPUクレジットの残高がなくなってしまった場合は、ベースラインでの動作になります。

今回の私のケースでは、ユーザーが使用しない深夜のうちにCPUクレジットが144の最大まで溜まっていたが、
業務時間になると徐々にCPUクレジットを消費し、午後にはCPUクレジットの残高が0になってしまいました。
CPUクレジットの残高が0になったことで、CPUがベースラインの10%でしか動作しなくなってしまったため、
処理が極端に遅くなってしまったということになります。

インスタンスサイズの違い

上記の例はt2.microの例でしたが、1時間あたりに受け取れるCPUクレジットの数などは、インスタンスサイズによって異なります。

インスタンスタイプ 1時間あたりに受け取るCPUクレジット 蓄積可能な最大獲得クレジット ベースライン 料金(東京リージョン)
t2.nano 3 72 5% 0.0076USD/時間
t2.micro 6 144 10% 0.0152USD/時間
t2.small 12 288 20% 0.0304USD/時間

1時間あたりに受け取るCPUクレジットが2倍になると、価格も2倍になるとことがわかります。
サイズが大きくなるとベースラインも上がっているので、その分はお得というイメージでしょうか。

その他詳しくはこちらをご覧ください。
バースト可能パフォーマンスインスタンスの CPU クレジットおよびベースラインパフォーマンス

おわりに

今回はt3.smallにすることで対応をしました。その後は遅いとの報告も上がらず順調です。
T2, T3, T3aの違いも書こうかと思ったのですが、CPUクレジットと話が逸れるのでまた機会があれば。
(無料利用枠を使いたい場合以外は、基本的にはT3 or T3aを使ったほうが良いかと思います)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSで料金アラートの設定

最近UdemyでAWSを学び始めた。AWSは無料期間が一年間あるが、有料サービスを利用してしまったり、無料期間の終了に気づかず使用してると料金が知らない間に発生してしまう。
そうならないためにも、CloudWatchという機能を使ってアラートを設定していく。

料金アラートの設定

AWSにログインすると以下の画面になるので、ユーザー名の書いてある赤枠部分を選択。
image.png
マイ請求ダッシュボードを選択。
image.png
Billingの設定を選択。
image.png
請求設定にチェック、メールアドレスの設定をして、「請求アラートを管理する」を設定。
image.png
左のメニューの請求を選択。
image.png
アラームの作成を選択。
image.png
料金の設定。今回は10ドルを超えたらアラートするように指定して「次へ」を選択。
image.png
メールアドレスを設定して、「次へ」を選択。
image.png
エラーが出てるけどとりあえず次へ。
image.png
プレビュー画面の一番下の「アラームの作成」を選択。
image.png
一応正常に作成された。
image.png

終わりに

とりあえず作成できたから、超えたら通知が来るはず・・・。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon SESコンソールからメールをテスト送信する手順

Amazon SES とは

AWSサービスの一種で、フルマネージドなメール送受信サービス。

メール送信方法

以下の3つがあります。

  • Amazon SESコンソール
      ユースケース:システムセットアップ時のテスト送信

  • Amazon SES API
      ユースケース:アプリから直接メールを送りたいとき

  • SMTPインターフェイス
      ユースケース:既存の送信用SMTPサーバーからリレーしたり、SMTPを前提としてシステムから直接利用する場合

今回はAmazon SESコンソールからの手順をまとめます。
From, To どちらも自分のメールアドレスでテスト送信します。

Amazon SESコンソールからの送信手順

1. AWSコンソールにログイン

2. [SES] と入力し、Enterキーを押す

スクリーンショット 2020-03-24 20.36.45.png

※ 2020年3月時点では東京リージョンに対応していません。
 他のリージョンをお選びください。
スクリーンショット 2020-03-24 20.36.55.png

3. [Email Addresses] をクリック
スクリーンショット 2020-03-24 20.37.41.png

4. [Verify a New Email Address] をクリック
スクリーンショット 2020-03-24 20.37.58.png

5. 自分のメールアドレスを入力し、[Verify This Email Address] をクリック
スクリーンショット 2020-03-24 20.38.30.png

6. 検証メールを送信した旨が表示されるので、[Close] をクリック
スクリーショット 2020-03-24 20.39.29.png
  ※ 検証メールが届くまで1時間ほどかかる場合があるようです

7. 自分のメールアドレス宛に検証メールが届いたか確認する
   こんな感じのメールが届いているはずです。
スクリーンショット 2020-03-24 20.42.18.png

8. メール本文内のURLをクリック (真ん中に書いてある方)
  ※ クリックしないと以降の手順が進められないのでご注意ください

9. 以下が表示されるので「やったぜ」と思いながら閉じる
スクリーンショット 2020-03-24 20.59.52.png

10. Amazon SESコンソールで[Email Addresses] をクリックする
   自分のメールアドレスのステータスが[verified] になったことが確認できます。
スクリーンショット 2020-03-24 21.02.54.png

11. メールアドレス横のチェックを入れ、[Send a Test Email] をクリック
スクリーンショット 2020-03-24 21.02.54.png

12. 以下の内容を入力し、[Send Test Email] をクリック

  • Email Format:Formatted

    • [Raw] はより細かくカスタマイズしたいときに使うようです。添付ファイルをつけたいとか
  • From:自分のメールアドレス

  • To:自分のメールアドレス

  • Subject:適当な内容

  • Body:適当な内容

スクリーンショット 2020-03-24 21.09.17.png

13. 自分のメールアドレス宛に検証メールが届いたか確認する
スクリーンショット 2020-03-24 22.47.30.png

あとがき

ユースケースとしてはシステムセットアップ時のテストぐらいにしか使わないっぽいけど、やってみました。

参考

E メールの送信方法 – アマゾン ウェブ サービス (AWS)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

複数インスタンスからOS情報を一発取得したい

複数セットアップしたインスタンスから欲しい情報を取得する
必殺スクリプトを作成したので公開してみる。

#!/bin/sh

# セットアップしたインスタンスのIP
IP=("10.5.140.4" "10.5.144.4")

# 取得したい情報
command='
echo -e "\n-----------------------\n hostname \n-----------------------";
hostname;
echo -e "\n-----------------------\n system-release \n-----------------------";
cat /etc/system-release;
echo -e "\n-----------------------\n redhat-release \n-----------------------";
cat /etc/redhat-release;
echo  -e "\n----------------------- \n locale \n-----------------------";
locale | grep LANG;
echo -e "\n-----------------------\n date \n-----------------------";
date;
echo -e "\n-----------------------\n chronyc \n-----------------------";
chronyc sources;
echo -e "\n-----------------------\n getforce \n -----------------------";
sudo getenforce;
echo -e "\n-----------------------\n firewalld \n-----------------------";
systemctl list-unit-files | grep firewalld;
echo -e "\n-----------------------\n  swap \n-----------------------";
free | grep Swap;
echo -e "\n-----------------------\n group \n-----------------------":
cat /etc/group;
echo -e "\n-----------------------\n passwd \n-----------------------"
cat /etc/passwd;
echo -e "\n-----------------------\n sudpers \n-----------------------";
sudo cat /etc/sudoers | grep wheel;
echo -e "\n-----------------------\n ssshd_config \n -----------------------";
sudo cat /etc/ssh/sshd_config | grep PasswordAuthentication;
echo -e "\n-----------------------\n hosts \n -----------------------";
cat /etc/hosts;
echo -e "\n-----------------------\n cfg \n-----------------------";
ls -l /etc/cloud/*.cfg;
echo -e "\n-----------------------\n yum \n -----------------------";
sudo yum list installed | grep amazon-ssm-agent;
echo -e "\n-----------------------\n cloudwatch \n-----------------------";
rpm -qa | grep cloudwatch;
echo -e "\n-----------------------\n openssl \n-----------------------";
sudo yum list installed | grep openssl;
echo -e "\n-----------------------\n chronyc tracking \n-----------------------";
chronyc tracking;
echo -e "\n-----------------------\n log \n-----------------------";
cat /var/lib/logrotate/logrotate.status;
echo -e "\n-----------------------\n yum \n-----------------------";
sudo yum list updates;
echo -e "\n-----------------------\n amazonVol \n-----------------------";
lsblk;
echo -e "\n-----------------------\n df \n-----------------------";
df -Th;'

# 指定されたIP分踏み台からsshでつないで取得
for LINE in ${IP[@]}; do
  echo -e "\n#### [$LINE] Server Information ####" >> /tmp/result.txt
  ssh -i ~/keys/test.pem ec2-user@${LINE} ${command} >> /tmp/result.txt
  echo -e "##################################>>>END\n" >> /tmp/result.txt
done

こういったサービスってないのかな?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】Amazon WorkSpacesの作成

はじめに

初回起動時は高速セットアップで作成することも可能です。
以下で説明する方法は、通常のWorkSpaceの起動について説明します。

image.png

起動方法

上記の図のWorkSpacesの起動ボタンを押します。

ディレクトリの選択

WorkSpaces を起動するディレクトリを選択します。ディレクトリには、ユーザーと WorkSpaces の両方が含まれます。]

ディレクトリには、既に作成してあるディレクトリが表示されるので、選択します。

設定項目の下記2点は有効にしておきます。

  • セルフサービスアクセス許可の有効化
  • Amazon WorkDocs の有効化

次のステップをクリックします。

ユーザーの特定

新規ユーザーを作成する場合は必要事項を記載し、ユーザーの作成をクリックします。
image.png

既存のユーザーから選択したい場合は、検索を実行し、追加したいユーザーを選択して、選択項目を追加を押してください。
image.png

ユーザーの特定が完了したら、次のステップを選択してください。

バンドルの選択

起動したいバンドルを選択して、起動します。
目的がテストの場合は、無料利用枠の対象のマシンを選択すると、無料利用枠を利用できます。

WorkSpacesの設定

実行モード

AlwaysOnAuto Stopがありますが、今回はAuto Stopを利用します。

暗号化

今回はテストなので、暗号化は行いません。

タグの管理

適宜タグを設定します。

WorkSpaces のレビューと起動

表示されている内容を確認して、WorkSpacesの起動をクリックします。
起動には20分ほど時間がかかる可能性があります。
届いたメールの手順に沿ってアクセスしてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】Simple AD ディレクトリの作成

初めに

Simple ADを配置するためのVPCを構築します。
2つ以上のAZでサブネットを作成し、それぞれにインターネット接続できるように、Internet GateWayを設定します。

作成方法

サービス画面の表示

AWSのActive Directoryのサービスページに移動します。
その後、ディレクトリのセットアップを選択します。

image.png

ディレクトリタイプの選択

Simple ADを選択し、次へ進みます。

image.png

ディレクトリ情報の入力

  • ディレクトリのサイズ
    スモール
  • ディレクトリのDNS名
    任意の文字列でOK
    例)test.local
  • ディレクトリのNetBIOS名
    今回は指定なし
  • デフォルト管理ユーザー
    Administrator(変更不可)
  • 管理者のパスワード
    任意の文字列
  • 説明
    任意の説明を入力
    例)test

上記の内容の入力が完了したら、次に進みます。

VPCとサブネットの選択

VPCとサブネットは先ほど作成したものを利用してください。

image.png

確認と作成

表示されている内容を確認し、ディレクトリの作成を選択します。

さいごに

ディレクトリの作成には5~10分かかります。
次回は、作成したDirectoryを利用して、WorkSpacesを利用してみようと思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

aws-cliでCognitoのトークン(ID、PW、REFRESH)を発行する

実行

※ユーザプールの設定で --client-id に指定するアプリクライアントの アプリクライアント > 詳細 > "認証用の管理 API のユーザー名パスワード認証を有効にする (ALLOW_ADMIN_USER_PASSWORD_AUTH)" にチェックが必要

aws cognito-idp admin-initiate-auth \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--auth-parameters USERNAME=username,PASSWORD=password \
--user-pool-id ap-northeast-1_xxxxxxxxx \
--client-id xxxxxxxxxxxxxxxxxxxxxxxxxx

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS 資格 データ分析の取得を目指す

まずはビッグデータを勉強して、試験に望む。

ブログ
ブレインパッドの方のブログ

udemy
過去問集があった。(英語)ジェル?16個消費で実施。65問

Whizlabs
フリーの15問と、有料のものがあった。

a cloud guru
テストシミュレーターがビッグデータはない。。

公式サンプル問題集

公式模試

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

S3バケットのオブジェクトを1000個以上取得する

公式リファレンスに記載があるように、list_objects_v2は1000個以上のS3オブジェクトを取得する際には面倒なnext_tokenの処理が必要になります。

そこで、1000個以上のS3オブジェクトを扱う際には、Aws::S3::Bucket#objectsを使うと、このようにシンプルに書けます。

list-objects.rb
require 'aws-sdk'
bucket = Aws::S3::Bucket.new('<バケット名>')
obj_array = bucket.objects.map(&:key)

obj_array.size  # => オブジェクト数
obj_array.first # => プレフィックス/オブジェクト名

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SysOps試験対策

ECインスタンス関連

  • InstanceLimitExceeded ⇒ あなたは地域で起動できるというインスタンスの数の上限に達してる(リージョン単位)
  • InsufficientInstanceCapacity ⇒ AWSにはリクエストを処理するのに十分なオンデマンド容量がない
  • EC2インスタンスがpendingからterminated
    • EBSボリューム制限に達してる
    • EBSスナップショットが破損
    • ルートEBSボリュームは暗号化されており、復号化のためにKMSキーにアクセスする権限がない
    • インスタンスの起動に使用したインスタンスストアにバックアップされたAMIに必要な部分(image.part.xxファイル)がない
  • CacheNodeTypeパラメータ ⇒ EC2インスタンスタイプ指定
  • CreateCacheCluster ⇒ 新しいクラスタ作成

CloudWatch

  • DiskQueueDepthメトリック ⇒ 使用可能なストレージスペースではなく、ディスクへのアクセスを待機している未処理のIO(読み取り/書き込み要求)の数を提供
  • FreeableMemoryメトリック ⇒ 使用可能なストレージスペースではなく、使用可能なランダムアクセスメモリの量を追跡
  • BinLogDiskUsageメトリック ⇒ マスター上のバイナリログが占有するディスク容量を追跡する、MySQLリードレプリカにのみ適用
  • FreeStorageSpaceメトリックス ⇒ RDS DBインスタンスの利用可能なストレージスペースを監視できる
  • CloudWatchアラームアクションを使用すると、インスタンスを自動的に停止、終了、再起動、または回復するアラームを作成できる
  • CloudWatchイベントをEBSと統合し、Lambda関数を設定してスナップショットを別のリージョンにコピーする
  • 単一のCloudWatchダッシュボードを使用して複数のリージョンのAWSリソースを監視できるが、リージョン間でデータを集約することはできない

Amazon EMR

  • 企業、研究者、データアナリスト、開発者が膨大な量のデータを簡単かつコスト効率よく処理できるようにするウェブサービス
  • 数百、または数千のコンピューティングインスタンスをプロビジョニングして、あらゆる規模でデータを処理できる

KMS

  • デフォルト保留期間は30日
  • 削除保留中のCMKは暗号化操作できない
  • 削除保留中のCMKのバッキングキーをローテーションしない
  • キーポリシーは、AWS KMSで顧客マスターキー(CMK)へのアクセスを制御する主要な方法

Amazon Redshiftログ情報

  • 接続ログ:認証の試行、接続および切断を記録
  • ユーザーログ:データベースユーザー定義の変更に関する情報を記録
  • ユーザーアクティビティログ:データベースで実行される前に各クエリを記録
  • クラスターのスナップショット(自動または手動)を別のリージョンに自動的にコピーするようにAmazon Redshiftを構成できる

ELB

  • SpilloverCount ⇒ サージキューがいっぱいであるために拒否された要求の合計数を提供
  • SurgeQueueLength ⇒ 正常なインスタンスへのルーティングを保留しているリクエスト(HTTPリスナー)または接続(TCPリスナー)の総数を提供
  • HealthyHostCount ⇒ ロードバランサーに登録されている正常なインスタンスの数
  • BackendConnectionErrors ⇒ ロードバランサーと登録済みインスタンスの間で正常に確立されなかった接続数
  • 【AWSELB】クッキー作成、セッションをインスタンスマッピングに使用
  • 複数のアベイラビリティーゾーンにわたってEC2インスタンスを起動し、ロードバランサーでクロスゾーンロードバランシングを有効にする

Auto Scaling

  • 実行中のEC2インスタンスの属性を使用して起動設定を作成するオプションがある
  • 必要以上にインスタンスを追加しないように、ウォームアップ期間設定、その間メトリックに含まれない

Route53

  • enableDnsHostnames ⇒ VPCで起動されたインスタンスがパブリックDNSホスト名を取得する
  • enableDnsSupport ⇒ VPCでDNS解決がサポート、IPアドレス関連

RDS

  • デフォルトではSSL接続しない
  • IOPSのプロビジョニングはEBSの設定、スケールアップ⇒インスタンスタイプ変更

CloudFormation

  • StackSetsは、1回の操作で複数のアカウントとリージョンにわたってスタックを作成、更新、削除できる
  • スタックを更新するときに変更セット使用し、変更を表示できる
  • デフォルトではスタックをロールバックする
  • EC2サーバー、Redshift、EMR構成を含むCloudFormation設計が優先事項

CloudFront

  • エッジキャッシュからファイルを削除方法
    • ①エッジキャッシュからファイルを無効にする
    • ②ファイルのバージョン管理を使用して、異なる名前を持つ異なるバージョンのファイルを提供
  • エンドポイントは、リソースが正常であることをRoute 53に通知する2xxおよび3xx応答コードで応答する

SSL証明書をIAMにアップロードされた証明書に置き換える

  • 1. get-server-certificateコマンドを使用して、証明書のARNを取得します。
    • aws iam get-server-certificate --server-certificate-name my-new-certificate
  • set-load-balancer-listener-ssl-certificateコマンドを使用して証明書を設定
    • aws elb set-load-balancer-listener-ssl-certificate --load-balancer-name my-load-balancer --load-balancer-port 443 --ssl-certificate-id arn:aws:iam::123456789012:server-certificate/my-new-certificate

コスト

  • AWSのコストと使用状況レポートを設定して、CSV形式の請求レポートを毎日S3バケットに生成および発行できる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSスナップショット管理の決定版!!Veritas CloudPointを、ガッツリご紹介します!!

はじめに

今回は、Vertias CloudPointの紹介です。

紹介資料のフル版はSlideShareに公開していますので参照ください。
「Vertias CloudPoint(AWS スナップショット管理)マーケットプレイスから導入してみた」もご覧ください。
ダイジェスト版の動画(説明つき)と資料についても、別途公開予定です。

本記事では、下記の内容を抜粋して紹介します。

  1. クラウド上で、バックアップって必要なの?
  2. クラウドのスナップショットって、バックアップ用途に使えるの?
  3. Veritas CloudPointって何?
  4. CloudPointは、AWS Backupと何が違うの?

※スライド画像の下に、説明を記載しています。
※画面右側の目次もご使用ください。

クラウド上で、バックアップって必要なの?

必要です!

↑  こちらは、AWSの責任共有モデルの図になります。AWSは、クラウドのインフラに対する責任を持ちますが、クラウド内の、OS以上の、アプリケーション、データに関しては、お客様であるクラウド利用者の責任になります。


↑ ベリタスが行った調査結果です。84%の企業で、「データ保護はクラウドプロバイダが実施する」と誤解されていることが分かりました。一般的なデータセンターと比較して、クラウドの耐久性は高いです。しかし、それがデータ保護と同義ではありません。クラウド上でも『データ保護(バックアップ)』は必要です。

クラウドのスナップショットって、バックアップ用途に使えるの?

使えます!

↑ AWSのスナップショットは、S3への完全な複製です。オリジナルデータが削除されても、スナップショットからの復元が可能です。スナップショット、レプリケーション共に、永久増分の高速な動作となります。すなわち、AWSのスナップショットは、バックアップにもランサムウェア対策にも使えます。

Veritas CloudPointって何?

この機会に覚えてください!

↑ CloudPointは、クラウドとストレージのスナップショットを管理する製品です。高速なバックアップ、リカバリが可能です。NetBackupとの連携も可能です。今後、CloudPointは、NetBackupに完全に統合される予定です。

CloudPointは、AWS Backupと何が違うの?

ぜんぜん、違います!

↑ CloudPointとAWS Backupの機能比較を表にまとめたものです。赤文字のところが、CloudPointの独自機能です。


↑ CloudPointでは、クラウドスナップショット機能にはない、ファイル単位のリストアや、アプリケーションの整合性確保が可能です。また、RDS、Aurora、レプリケーションにも対応しています。ベリタス独自の、「個人情報のタグ付け」 も可能です。


↑ Verirtasのアプローチは、「あらゆる場所のあらゆるデータの確実な保護とリカバリ」です。仮想環境のみ、クラウドのみ…ではなく、オンプレも含めた、あらゆるデータのデータ保護です。


↑ NetBackupとCloudPointの連携、NetBackupと連携するかもしれない、Veritas SaaS Backup含め、真のマルチクラウド・データ保護に、今後もご期待ください!!

まとめ

いかがでしたでしょうか?ぜひ、AWSのデータ保護(バックアップ)は、Veritas CloudPonitをよろしくお願いします。
「Vertias CloudPoint(AWS スナップショット管理)マーケットプレイスから導入してみた」もご覧ください。

フル版スライド資料ダウンロード

フル版の紹介資料をSlideShareに公開しています。

下記の動作説明、画面キャプチャでの機能説明をしておりますので、ぜひ、ご確認ください。

■バックアップ、リストアの動作
- EC2インスタンス(Host)バックアップ
- EC2インスタンス(Host)リストア
- EC2インスタンス(Disk)バックアップ
- EC2インスタンス(Disk)リストア
- EC2インスタンス ファイル単位のリストア
- RDS、Auroraバックアップ
- RDS、Auroraリストア

■動作画面のキャプチャ
- ダッシュボード
- ポリシー作成&アセットへの適用
- Application on EC2 整合性(MSSQL、MongoDB)
- ファイルリストア
- Veritas Information Classifier
- RBAC(ロールベースアクセス制御)
- NetBackup連携

商談のご相談はこちら

本稿からのお問合せをご記入の際には「お問合せ内容」に#GWCのタグを必ずご記入ください。ご記入いただきました内容はベリタスのプライバシーポリシーに従って管理されます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Amplify 初めてみる編

AWS Apmlifyは、モバイルアプリケーションとウェブアプリケーションを構築するためのAWSがOSSで公開する開発プラットフォームです。
簡単に言えば、AWSでもFirebaseみたいにバックエンドはお任せでフロントだけ開発できるようにしてくれるフレームワークみたいなやつです。
あくまでもプラットフォームなので、AWS Amplify == Firebaseではないです。

↓AWSのページ
https://aws.amazon.com/jp/amplify/

↓公式ドキュメント
https://aws-amplify.github.io/docs/

今回は、Apmlifyの概要とプロジェクトの作成からデプロイまで軽く触ってみます。

AWS Apmlifyとは

AWSのサービスを用いた、Web・モバイルアプリを最速でリリースするための開発プラットフォームです。
React, Vue, AngularなどでのSPAや、Gatsby, Hugoなどの静的サイトジェネレーターを用いたWebアプリケーションを最速で開発するためのプラットフォームと紹介されています。
アプリケーション開発者はフロントエンドの開発に集中でき、バックエンドとインフラはAWSにサーバーレスでお任せできます。
さらに、CI/CD環境の構築も自動で構築してくれます。このあたりはFirebaseとよく似ています。
AWSのサービスを駆使して同等な環境を構築できますが、175個もあるサービスから選定してアーキテクトするのはかなり時間がかかります。
そのコストをAmplifyが解決してくるということです。

AWS Amplifyの以下のような特徴があります。

  • 最速でアプリを開発できる
  • スケールするアプリを開発できる
  • 簡単にアプリを開発できる

サービスの立ち上げからグロースまでを行うことができることが特徴です。

構成

AWS AmplifyはAWSの様々なサービスやツールで構成されています。
そのため、AWS Amplifyで提供されているサービスやツールをまとめてAmplifyファミリーと呼ばれています。
Amplifyファミリーは以下の構成になっています。

  • Framework
  • CLI
  • Developer Tools

Amplify Framework

ライブラリ、UIコンポーネント、CLIを含むOSSのクライアントフレームワーク。SDKとコンポーネントが一緒になったみたいなものです。
Amplify Framreworkは、クライアントがAWSのバックエンドと連携するための処理を数行で実装できるようにするフレームワークです。
以下のようなサービスが提供されています。

  • クライアントライブラリ(JavaScript・iOS・Android)
  • UIコンポーネント
  • Amplify DataStore
  • Amplify CLI
クライアントライブラリ

Amplify for JavaScript / iOS / Andoridとして各クラインとごとにライブラリを提供しています。(iOS/Androidはプレビュー版)
特徴としては、

  • AWSバックエンドと簡単に統合できるクライアントライブラリ
  • React / Vue / AngularといったWebフレームワークやiOS / Androidに対応
  • カテゴリベースで直感的な実装ができるインターフェイス

があげられます。SDKのラッパーのような役割だと思ってもらえれば。

UIコンポーネント

各フレームワーク向けにUIコンポーネントライブラリを提供しています。React, React Native, Angular, Ionic, Vue向けに提供されています。

例えば、ユーザー認証用のUIを追加する場合、UIコンポーネントがあると予め用意された認証UIをさくっと実装できますが、ない場合は全て自らUIとその機能を実装する必要があります。
この後で少し触りますが、一瞬で認証機能を構築することができます。

AWS DataSotre

マルチプラットフォームなクライアント向けのストレージエンジを提供します。
AWS上にバックエンドを用意しなくても、GraphQL経由で自動的にアプリケーション・バックエンドのデータを同期することができます。
Amplifyでのバックエンドの実装は、AWS AppSyncを使用したGraphQL APIがデフォルトの選択肢になっています。
API GateawayとAWS Lambdaを使用したREST APIに変更することもできます。
DataStoreはオフラインに対応しています。

Amplify CLI

AWSでサーバーレスなバックエンドを構築・管理するためのCLIツール。コマンドを実行して対話的に質問に回答するだけで、サーバーレスなバックエンドを構築することができます。
バックエンドとの接続に必要な設定ファイルやソースコードの一部を自動で生成することができます。

Amplify CLIがない場合、

  • AWSのバックエンドをGUIから手動で構築しないといけない
  • AWS CloudFormationやAWS SAMなどで、バックエンドをモデル化し自動で構築する

といった「やりたいこと」の実現手法を知っていれば構築できるやり方です。
しかし、GUIで構築する場合は手順書を用意する必要があり、AWSのGUIが変更されると手順書も更新しなければなりません。また、手順書がなければAWSが初めての方は調べながら構築する必要があり時間がかなりかかります。
また、CloudFormation、AWS SAM、以前紹介したServerless Frameworkなどを使用する場合は、手動で構築する問題を解決できますが、CloudFormationの記法を知らなければ、どのようなバックエンド構成かを理解するのに時間がかかります。

一方のAmplify CLIは「やりたいこと」から実現する手法を構築してくれます。
例えば認証機能を追加した場合は、amplify add authとするだけでAWSの各サービスを組み合わせて認証機能のバックエンドを構築することができます。

Developer Tools

フロントエンドとバックエンドに対してビルド、テスト、デプロイ、ホスティングを容易に実現できるAWSサービス群のことです。

以下のサービスで構成されています。

  • AWS Amplify Console
  • AWS Device Farm

AWS Amplify Consoleは、SPAとSSGによるフルスタックなWebアプリ向けCI/CD環境構築とホスティングを行うことができます。
Gitリポジトリを接続するだけで、WebアプリケーションのためのCI/CDパイプラインを簡単に構築でき、さらにホスティングまでできちゃう、といったところでしょうか。ここはまだあまり理解できていません。

Amplifyの紹介は以上です。
ではAmplifyファミリーのFrameworkを使用して、認証機能とGraphQLでのバックグラウンドを構築していこうと思います。

AWS Amplify実践

AWS Amplifyのインストール

では早速Amplify CLIをインストールしていきます。

$ npm install -g @aws-amplify/cli
$ amplify -v
4.16.1
$ amplify configure

amplify configureを起動すると、AWSのログイン画面がブラウザで表示されます。この辺はFirebaseとほぼ一緒ですね。
ルートユーザーでも、IAMユーザーでもログインできます。
ログインしたらコンソールに戻って、エンターキーを押してください。

ログインすると、Amplifyで使用するリージョンを聞かれます。使用するリージョンを決定してください。

Specify the AWS Region
? region:  ap-northeast-1

次に、ユーザー名を聞かれます。これは、IAMユーザーを聞かれていますので、作成していなければそのまま実行します。

Specify the username of the new IAM user:
? user name:  

すると、AWS IAMのユーザー作成の画面が表示されます。ここからは、普通にIAMユーザーを作成していきます。

  • プログラムによるアクセスのみ許可
  • アクセス権限はとりあえずAdministratorAccess
  • タグはお好みで追加

ユーザーを作成すると、アクセスキーとシークレットアクセスキーを取得することができます。念のためCSVファイルをダウンロードして大切に保管してださい。

ユーザーを作成できたら、先ほど取得したアクセスキーとシークレットアクセスキーを設定します。

Enter the access key of the newly created user:
? accessKeyId:  (<YOUR_ACCESS_KEY_ID>)
? secretAccessKey:  (<YOUR_SECRET_ACCESS_KEY>)

次にプロファイル情報の名前を聞かれますが、任意の名前で大丈夫です。すでにAWS CLIなどがインストールされていて、プロファイル情報がある場合は上書きされます。

This would update/create the AWS Profile in your local machine
? Profile Name:  (default)

以上で初期設定は環境です、

Successfully set up the new user.

Reactアプリケーションの作成

検証用アプリケーションはReactで実装していきます。まずはReactアプリケーションを作成します。

$ npx create-react-app amplify-todo
$ cd amplify-todo

このタイミングで、いらないファイルは消しておきましょう。

Amplifyプロジェクトの構築

Amplifyのプロジェクトを立ち上げて初期化します。プロジェクトを初期化するにはamplify initコマンドを実行します。

$ amplify init
? Enter a name for the project amplify-todo
? Enter a name for the environment dev
? Choose your default editor: Visual Studio Code
? Choose the type of app that you're building javascript
Please tell us about your project
? What javascript framework are you using react
? Source Directory Path:  src
? Distribution Directory Path: build
? Build Command:  npm run build
? Start Command: npm start
Using default provider  awscloudformation

For more information on AWS Profiles, see:
https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html

? Do you want to use an AWS profile? Yes
? Please choose the profile you want to use default

上記のように必要な情報を聞かれるので、プロジェクトに沿った回答をします。
コマンドの実行が完了すると、amplifyディレクトリとsrc/aws-exports.jsファイルが作成されます。

// WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.

const awsmobile = {
    "aws_project_region": "ap-northeast-1"
};


export default awsmobile;

Amplify CLIの初期設定で設定したリージョンが指定されています。プロジェクトの初期化は以上で完了です。

認証機能の追加

Amplifyプロジェクトの初期化ができたので、次は認証機能を追加します。

まずは、Amplifyの認証機能を追加するコマンドを実行します。Apmlifyに機能を追加する場合は、amplify add <機能>コマンドで追加します。
今回はメールアドレスで認証を行うため、ログイン方法にEmailを選択します。

$ amplify add auth
Using service: Cognito, provided by: awscloudformation

 The current configured provider is Amazon Cognito. 

 Do you want to use the default authentication and security configuration? Default configuration
 Warning: you will not be able to edit these selections. 
 How do you want users to be able to sign in? Email
 Do you want to configure advanced settings? No, I am done.

設定が成功したら、amplify pushコマンドで認証機能をクラウドに反映します。

$ amplify push
Current Environment: dev

| Category | Resource name       | Operation | Provider plugin   |
| -------- | ------------------- | --------- | ----------------- |
| Auth     | amplifyuser751c3c76 | Create    | awscloudformation |
? Are you sure you want to continue? Yes

コマンドの実行が完了するとS3のバケットに最新のCloudfrontのテンプレートファイルなどがアップデートされます。

s3-1.png

次に、ReactのアプリケーションにAmplifyライブラリをインストールします。

$ yarn add aws-amplify aws-amplify-react

src/App.jsにAmplifyライブラリの設定を追加します。
signUpConfigには、ユーザーを登録する際に必要な情報を指定することができます。
詳しい設定方法は公式ドキュメントを参照してください。

https://aws-amplify.github.io/docs/js/react#signup-configuration

src/App.js
import React from 'react';
import Amplify, { Auth } from "aws-amplify";
import awsmobile from "./aws-exports";
import { withAuthenticator } from "aws-amplify-react";

// Amplifyの設定を行う
Amplify.configure(awsmobile)

// SingUp時に、メールアドレスとパスワードを要求する
const signUpConfig = {
    header: 'Sign Up',
    hideAllDefaults: true,
    defaultCountyCode: '1',
    signUpFields: [
        {
            label: 'User Name',
            key: 'username',
            required: true,
            displayOrder: 1,
            type: 'string'
        },
        {
            label: 'Email',
            key: 'email',
            required: true,
            displayOrder: 2,
            type: 'string'
        },
        {
            label: 'Password',
            key: 'password',
            required: true,
            displayOrder: 3,
            type: 'password'
        }
    ]
}

// SingOut
function signOut(){
  Auth.signOut()
  .then()
  .catch();
}

function App() {
  return (
    <React.Fragment>
      <button onClick={signOut}>Sign out</button>
      <div>
        Hello World
      </div>
    </React.Fragment>
  );
}

// Appコンポーネントをラップする
export default withAuthenticator(App,{signUpConfig});

これで、コンポーネントを開く前にユーザーのメールアドレスでログイン画面が表示されます。ローカルで確認してみます。

$ npm start

http://localhost:3000/にアクセスすると、次の画面が表示されます。

auth1.png

Create accountをクリックしアカウント作成画面でアカウントを作成し、ログインしてみます。作成したユーザーは、Cognitoに作成されています。

  • 画面

auth2.png

  • Cognito

cogunite.png

Hello Worldの画面が表示されます。

helloworld.png

サイトを公開する

apmlify add hostingでS3での静的ウェブホスティングを有効にします。バケット名には、何も指定しない場合デフォルトでユニークなバケットを作成してくれます。

$ amplify add hosting
? Select the plugin module to execute Amazon CloudFront and S3
? Select the environment setup: PROD (S3 with CloudFront using HTTPS)
? hosting bucket name 
Static webhosting is disabled for the hosting bucket when CloudFront Distribution is enabled.

You can now publish your app using the following command:
Command: amplify publish

ホスティングを有効した後に、amplify publishを実行し、アプリケーションをビルドしデプロイします。

$ amplify publish
✔ Successfully pulled backend environment dev from the cloud.

Current Environment: dev

| Category | Resource name       | Operation | Provider plugin   |
| -------- | ------------------- | --------- | ----------------- |
| Auth     | amplifyuser751c3c76 | No Change | awscloudformation |
| Hosting  | S3AndCloudFront     | No Change | awscloudformation |
? Are you sure you want to continue? Yes
~ 省略 ~
✔ Uploaded files successfully.
Your app is published successfully.
https://×××××××××××××.cloudfront.net

最後に表示されるURLにアクセスしてみてください。先ほど作成した画面が、CloudFrontで公開されています。
これで、プロジェクトの作成からデプロイまでが完了です。

バックエンドのGraphQLを追加する

認証機能を設定できたので、データベースにデータを永続化し、バックエンドAPIを追加します。

まずは、amplify addでGraphQLを選択肢API機能を追加します。
認証形式にAmazon Cognito User Poolを選択すると、先ほど作成したユーザー情報を用いた認証を使用することができます。

$ amplify add api
? Please select from one of the below mentioned services: GraphQL
? Provide API name: amplifytodo
? Choose the default authorization type for the API Amazon Cognito User Pool
Use a Cognito user pool configured as a part of this project.
? Do you want to configure advanced settings for the GraphQL API No, I am done.
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? No
? Provide a custom type name Todo

amplify statusで確認します。

$ amplify status
amplify status                                                                                                                                                                             11:12:55

Current Environment: dev

| Category | Resource name       | Operation | Provider plugin   |
| -------- | ------------------- | --------- | ----------------- |
| Api      | AmplifyUserAPI      | Create    | awscloudformation |
| Auth     | amplifyuser751c3c76 | No Change | awscloudformation |
| Hosting  | S3AndCloudFront     | No Change | awscloudformation |

APIが追加されていることがわかります。

@modelの作成

@modelが付与されたオブジェクトは、エンティティとしてAmazon DynamoDBに保存されます。@modeの単位でテーブルが作成されるイメージです。
TODOアプリ用に、モデルを作成していきます。
amplify/backend/api/amplifytodoディレクトリにschema.graphqlファイルが作成されています。
それを以下のように書き換えます。

amplify/backend/api/amplifytodo/schema.graphql
type Todo @model {
    id: ID!
    title: String!
    detail: String!
    createdAt: AWSDateTime
    updatedAt: AWSDateTime
}

この状態で、amplify pushをしてみます。一旦全てデフォルトの値で設定します。

$ amplify push
? Do you want to generate code for your newly created GraphQL API Yes
? Choose the code generation language target javascript
? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js
? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions Yes
? Enter maximum statement depth [increase from default if your schema is deeply nested] 2
~省略~
✔ Generated GraphQL operations successfully and saved at src/graphql
✔ All resources are updated in the cloud

GraphQL endpoint: https://×××××××××××××.appsync-api.ap-northeast-1.amazonaws.com/graphql

GraphQL Endpointが表示されれば成功です。
AppSyncとDynamoDBのページでリソースが作成されているか確認してみてください。

  • AppSync

appsync.png

  • DynamoDB

dynamo.png

ではTODOを追加、確認できるようにしていきます。
まずはライブラリを追加します。

$ npm install @aws-amplify/api @aws-amplify/pubsub 

src/App.jsを以下のように書き換えます。

import React, {useState, useEffect, useReducer } from 'react';
import Amplify, { Auth } from 'aws-amplify';
import API, { graphqlOperation } from '@aws-amplify/api';
import { withAuthenticator } from 'aws-amplify-react'
import { createTodo } from './graphql/mutations';
import { listTodos } from './graphql/queries';
import { onCreateTodo } from './graphql/subscriptions';

import awsconfig from './aws-exports';

Amplify.configure(awsconfig);

const GET = 'GET';
const CREATE = 'CREATE';

const initialState = {
  todos: [],
};

const reducer = (state, action) => {
  switch (action.type) {
    case GET:
      return {...state, todos: action.todos};
    case CREATE:
      return {...state, todos:[...state.todos, action.todo]}
    default:
      return state;
  }
};

function signOut(){
  Auth.signOut()
  .then()
  .catch();
}

function App() {
  const [state, dispatch] = useReducer(reducer, initialState);
  const [user, setUser] = useState(null);
  const [title, setTitle] = useState(null);
  const [detail, setDetail] = useState(null);

  function onChange(e){
    if(e.target.id === 'title'){
      setTitle(e.target.value);
    }
    if(e.target.id === 'detail'){
      setDetail(e.target.value);
    }
  }

  async function create(e) {
    e.preventDefault();
    setTitle('')
    setDetail('')
    const todo = { title:title, detail:detail };
    await API.graphql(graphqlOperation(createTodo, { input: todo }));
  }

  useEffect(() => {

    async function getUser(){
      const user = await Auth.currentUserInfo();
      setUser(user);
      return user
    }

    getUser();

    async function getData() {
      const todoData = await API.graphql(graphqlOperation(listTodos));
      dispatch({ type: GET, todos: todoData.data.listTodos.items });
    }

    getData();

    const subscription = API.graphql(graphqlOperation(onCreateTodo)).subscribe({
      next: (eventData) => {
        const todo = eventData.value.data.onCreateTodo;
        dispatch({ type: CREATE, todo });
      }
    });

    return () => subscription.unsubscribe();
  }, []);

  return (
    <div className="App">
      <p>user: {user!= null && user.username}</p>
      <button onClick={signOut}>Sign out</button>
      <div>
        <table border="1" style={{'border-collapse': 'collapse'}}>
          <tr>
            <th>No</th>
            <th>Title</th>
            <th>Detail</th>
            <th></th>
          </tr>
          <tr>
            <td></td>
            <td><input id='title' type='text' onChange={onChange} value={title}/></td>
            <td><input id='detail' type='text' onChange={onChange} value={detail}/></td>
            <th><button onClick={create}>New</button></th>
          </tr>
          {state.todos && state.todos.map((todo,index) => {
            return(
              <tr key={todo.id}>
                <td>{index + 1}</td>
                <td>{todo.title}</td>
                <td>{todo.detail}</td>
                <td>{todo.createdAt}</td>
              </tr>
            )
          })}
        </table>
      </div>
    </div>
  );
}

const signUpConfig = {
    header: 'Sign Up',
    hideAllDefaults: true,
    defaultCountyCode: '1',
    signUpFields: [
        {
            label: 'User Name',
            key: 'username',
            required: true,
            displayOrder: 1,
            type: 'string'
        },
        {
            label: 'Email',
            key: 'email',
            required: true,
            displayOrder: 2,
            type: 'string'
        },
        {
            label: 'Password',
            key: 'password',
            required: true,
            displayOrder: 3,
            type: 'password'
        }
    ]
}

export default withAuthenticator(App, {
  signUpConfig: signUpConfig
});

ローカルで実行してみます。

$ npm start

ブラウザでサイトを立ち上げて確認してみます。

video1.gif

TODOが追加できていることがわかります。DynamoDBのコンソールでも確認してみてください。
作成したTODOが追加されています。

簡単ですが、GraphQLのバックグラウンドを追加してデータの追加をしてみました。

削除

amplify deleteinitで作成した環境を全て削除できます。何かとお金がかかるので不安な方は実行してください。

まとめ

AWS Amplifyの紹介と実際に少し触ってみました。
まだまだAmplifyの一部分しか触れていませんが、一から構築するのと比べものにならないぐらい爆速でアプリを立ち上げることができます。
Amplify Frameworkの基本的なフローは、amplify addで機能を追加しamplify pushでCloudFrontのテンプレートファイルを更新し、amplify publishで静的サイトをデプロイする、の流れになります。
Amplifyを使ってAWSを簡単に導入して、少しずつ各サービスを理解していき、最終的には同等の環境をAmplifyなしで構築できればベストかなと感じました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Amplify はじめてみる編

AWS Apmlifyは、モバイルアプリケーションとウェブアプリケーションを構築するためのAWSがOSSで公開する開発プラットフォームです。
簡単に言えば、AWSでもFirebaseみたいにバックエンドはお任せでフロントだけ開発できるようにしてくれるフレームワークみたいなやつです。
あくまでもプラットフォームなので、AWS Amplify == Firebaseではないです。

↓AWSのページ
https://aws.amazon.com/jp/amplify/

↓公式ドキュメント
https://aws-amplify.github.io/docs/

今回は、Apmlifyの概要とプロジェクトの作成からデプロイまで軽く触ってみます。

AWS Apmlifyとは

AWSのサービスを用いた、Web・モバイルアプリを最速でリリースするための開発プラットフォームです。
React, Vue, AngularなどでのSPAや、Gatsby, Hugoなどの静的サイトジェネレーターを用いたWebアプリケーションを最速で開発するためのプラットフォームと紹介されています。
アプリケーション開発者はフロントエンドの開発に集中でき、バックエンドとインフラはAWSにサーバーレスでお任せできます。
さらに、CI/CD環境の構築も自動で構築してくれます。このあたりはFirebaseとよく似ています。
AWSのサービスを駆使して同等な環境を構築できますが、175個もあるサービスから選定してアーキテクトするのはかなり時間がかかります。
そのコストをAmplifyが解決してくるということです。

AWS Amplifyの以下のような特徴があります。

  • 最速でアプリを開発できる
  • スケールするアプリを開発できる
  • 簡単にアプリを開発できる

サービスの立ち上げからグロースまでを行うことができることが特徴です。

構成

AWS AmplifyはAWSの様々なサービスやツールで構成されています。
そのため、AWS Amplifyで提供されているサービスやツールをまとめてAmplifyファミリーと呼ばれています。
Amplifyファミリーは以下の構成になっています。

  • Framework
  • CLI
  • Developer Tools

Amplify Framework

ライブラリ、UIコンポーネント、CLIを含むOSSのクライアントフレームワーク。SDKとコンポーネントが一緒になったみたいなものです。
Amplify Framreworkは、クライアントがAWSのバックエンドと連携するための処理を数行で実装できるようにするフレームワークです。
以下のようなサービスが提供されています。

  • クライアントライブラリ(JavaScript・iOS・Android)
  • UIコンポーネント
  • Amplify DataStore
  • Amplify CLI
クライアントライブラリ

Amplify for JavaScript / iOS / Andoridとして各クラインとごとにライブラリを提供しています。(iOS/Androidはプレビュー版)
特徴としては、

  • AWSバックエンドと簡単に統合できるクライアントライブラリ
  • React / Vue / AngularといったWebフレームワークやiOS / Androidに対応
  • カテゴリベースで直感的な実装ができるインターフェイス

があげられます。SDKのラッパーのような役割だと思ってもらえれば。

UIコンポーネント

各フレームワーク向けにUIコンポーネントライブラリを提供しています。React, React Native, Angular, Ionic, Vue向けに提供されています。

例えば、ユーザー認証用のUIを追加する場合、UIコンポーネントがあると予め用意された認証UIをさくっと実装できますが、ない場合は全て自らUIとその機能を実装する必要があります。
この後で少し触りますが、一瞬で認証機能を構築することができます。

AWS DataSotre

マルチプラットフォームなクライアント向けのストレージエンジを提供します。
AWS上にバックエンドを用意しなくても、GraphQL経由で自動的にアプリケーション・バックエンドのデータを同期することができます。
Amplifyでのバックエンドの実装は、AWS AppSyncを使用したGraphQL APIがデフォルトの選択肢になっています。
API GateawayとAWS Lambdaを使用したREST APIに変更することもできます。
DataStoreはオフラインに対応しています。

Amplify CLI

AWSでサーバーレスなバックエンドを構築・管理するためのCLIツール。コマンドを実行して対話的に質問に回答するだけで、サーバーレスなバックエンドを構築することができます。
バックエンドとの接続に必要な設定ファイルやソースコードの一部を自動で生成することができます。

Amplify CLIがない場合、

  • AWSのバックエンドをGUIから手動で構築しないといけない
  • AWS CloudFormationやAWS SAMなどで、バックエンドをモデル化し自動で構築する

といった「やりたいこと」の実現手法を知っていれば構築できるやり方です。
しかし、GUIで構築する場合は手順書を用意する必要があり、AWSのGUIが変更されると手順書も更新しなければなりません。また、手順書がなければAWSが初めての方は調べながら構築する必要があり時間がかなりかかります。
また、CloudFormation、AWS SAM、以前紹介したServerless Frameworkなどを使用する場合は、手動で構築する問題を解決できますが、CloudFormationの記法を知らなければ、どのようなバックエンド構成かを理解するのに時間がかかります。

一方のAmplify CLIは「やりたいこと」から実現する手法を構築してくれます。
例えば認証機能を追加した場合は、amplify add authとするだけでAWSの各サービスを組み合わせて認証機能のバックエンドを構築することができます。

Developer Tools

フロントエンドとバックエンドに対してビルド、テスト、デプロイ、ホスティングを容易に実現できるAWSサービス群のことです。

以下のサービスで構成されています。

  • AWS Amplify Console
  • AWS Device Farm

AWS Amplify Consoleは、SPAとSSGによるフルスタックなWebアプリ向けCI/CD環境構築とホスティングを行うことができます。
Gitリポジトリを接続するだけで、WebアプリケーションのためのCI/CDパイプラインを簡単に構築でき、さらにホスティングまでできちゃう、といったところでしょうか。ここはまだあまり理解できていません。

Amplifyの紹介は以上です。
ではAmplifyファミリーのFrameworkを使用して、認証機能とGraphQLでのバックグラウンドを構築していこうと思います。

AWS Amplify実践

AWS Amplifyのインストール

では早速Amplify CLIをインストールしていきます。

$ npm install -g @aws-amplify/cli
$ amplify -v
4.16.1
$ amplify configure

amplify configureを起動すると、AWSのログイン画面がブラウザで表示されます。この辺はFirebaseとほぼ一緒ですね。
ルートユーザーでも、IAMユーザーでもログインできます。
ログインしたらコンソールに戻って、エンターキーを押してください。

ログインすると、Amplifyで使用するリージョンを聞かれます。使用するリージョンを決定してください。

Specify the AWS Region
? region:  ap-northeast-1

次に、ユーザー名を聞かれます。これは、IAMユーザーを聞かれていますので、作成していなければそのまま実行します。

Specify the username of the new IAM user:
? user name:  

すると、AWS IAMのユーザー作成の画面が表示されます。ここからは、普通にIAMユーザーを作成していきます。

  • プログラムによるアクセスのみ許可
  • アクセス権限はとりあえずAdministratorAccess
  • タグはお好みで追加

ユーザーを作成すると、アクセスキーとシークレットアクセスキーを取得することができます。念のためCSVファイルをダウンロードして大切に保管してださい。

ユーザーを作成できたら、先ほど取得したアクセスキーとシークレットアクセスキーを設定します。

Enter the access key of the newly created user:
? accessKeyId:  (<YOUR_ACCESS_KEY_ID>)
? secretAccessKey:  (<YOUR_SECRET_ACCESS_KEY>)

次にプロファイル情報の名前を聞かれますが、任意の名前で大丈夫です。すでにAWS CLIなどがインストールされていて、プロファイル情報がある場合は上書きされます。

This would update/create the AWS Profile in your local machine
? Profile Name:  (default)

以上で初期設定は環境です、

Successfully set up the new user.

Reactアプリケーションの作成

検証用アプリケーションはReactで実装していきます。まずはReactアプリケーションを作成します。

$ npx create-react-app amplify-todo
$ cd amplify-todo

このタイミングで、いらないファイルは消しておきましょう。

Amplifyプロジェクトの構築

Amplifyのプロジェクトを立ち上げて初期化します。プロジェクトを初期化するにはamplify initコマンドを実行します。

$ amplify init
? Enter a name for the project amplify-todo
? Enter a name for the environment dev
? Choose your default editor: Visual Studio Code
? Choose the type of app that you're building javascript
Please tell us about your project
? What javascript framework are you using react
? Source Directory Path:  src
? Distribution Directory Path: build
? Build Command:  npm run build
? Start Command: npm start
Using default provider  awscloudformation

For more information on AWS Profiles, see:
https://docs.aws.amazon.com/cli/latest/userguide/cli-multiple-profiles.html

? Do you want to use an AWS profile? Yes
? Please choose the profile you want to use default

上記のように必要な情報を聞かれるので、プロジェクトに沿った回答をします。
コマンドの実行が完了すると、amplifyディレクトリとsrc/aws-exports.jsファイルが作成されます。

// WARNING: DO NOT EDIT. This file is automatically generated by AWS Amplify. It will be overwritten.

const awsmobile = {
    "aws_project_region": "ap-northeast-1"
};


export default awsmobile;

Amplify CLIの初期設定で設定したリージョンが指定されています。プロジェクトの初期化は以上で完了です。

認証機能の追加

Amplifyプロジェクトの初期化ができたので、次は認証機能を追加します。

まずは、Amplifyの認証機能を追加するコマンドを実行します。Apmlifyに機能を追加する場合は、amplify add <機能>コマンドで追加します。
今回はメールアドレスで認証を行うため、ログイン方法にEmailを選択します。

$ amplify add auth
Using service: Cognito, provided by: awscloudformation

 The current configured provider is Amazon Cognito. 

 Do you want to use the default authentication and security configuration? Default configuration
 Warning: you will not be able to edit these selections. 
 How do you want users to be able to sign in? Email
 Do you want to configure advanced settings? No, I am done.

設定が成功したら、amplify pushコマンドで認証機能をクラウドに反映します。

$ amplify push
Current Environment: dev

| Category | Resource name       | Operation | Provider plugin   |
| -------- | ------------------- | --------- | ----------------- |
| Auth     | amplifyuser751c3c76 | Create    | awscloudformation |
? Are you sure you want to continue? Yes

コマンドの実行が完了するとS3のバケットに最新のCloudfrontのテンプレートファイルなどがアップデートされます。

s3-1.png

次に、ReactのアプリケーションにAmplifyライブラリをインストールします。

$ yarn add aws-amplify aws-amplify-react

src/App.jsにAmplifyライブラリの設定を追加します。
signUpConfigには、ユーザーを登録する際に必要な情報を指定することができます。
詳しい設定方法は公式ドキュメントを参照してください。

https://aws-amplify.github.io/docs/js/react#signup-configuration

src/App.js
import React from 'react';
import Amplify, { Auth } from "aws-amplify";
import awsmobile from "./aws-exports";
import { withAuthenticator } from "aws-amplify-react";

// Amplifyの設定を行う
Amplify.configure(awsmobile)

// SingUp時に、メールアドレスとパスワードを要求する
const signUpConfig = {
    header: 'Sign Up',
    hideAllDefaults: true,
    defaultCountyCode: '1',
    signUpFields: [
        {
            label: 'User Name',
            key: 'username',
            required: true,
            displayOrder: 1,
            type: 'string'
        },
        {
            label: 'Email',
            key: 'email',
            required: true,
            displayOrder: 2,
            type: 'string'
        },
        {
            label: 'Password',
            key: 'password',
            required: true,
            displayOrder: 3,
            type: 'password'
        }
    ]
}

// SingOut
function signOut(){
  Auth.signOut()
  .then()
  .catch();
}

function App() {
  return (
    <React.Fragment>
      <button onClick={signOut}>Sign out</button>
      <div>
        Hello World
      </div>
    </React.Fragment>
  );
}

// Appコンポーネントをラップする
export default withAuthenticator(App,{signUpConfig});

これで、コンポーネントを開く前にユーザーのメールアドレスでログイン画面が表示されます。ローカルで確認してみます。

$ npm start

http://localhost:3000/にアクセスすると、次の画面が表示されます。

auth1.png

Create accountをクリックしアカウント作成画面でアカウントを作成し、ログインしてみます。作成したユーザーは、Cognitoに作成されています。

  • 画面

auth2.png

  • Cognito

cogunite.png

Hello Worldの画面が表示されます。

helloworld.png

サイトを公開する

apmlify add hostingでS3での静的ウェブホスティングを有効にします。バケット名には、何も指定しない場合デフォルトでユニークなバケットを作成してくれます。

$ amplify add hosting
? Select the plugin module to execute Amazon CloudFront and S3
? Select the environment setup: PROD (S3 with CloudFront using HTTPS)
? hosting bucket name 
Static webhosting is disabled for the hosting bucket when CloudFront Distribution is enabled.

You can now publish your app using the following command:
Command: amplify publish

ホスティングを有効した後に、amplify publishを実行し、アプリケーションをビルドしデプロイします。

$ amplify publish
✔ Successfully pulled backend environment dev from the cloud.

Current Environment: dev

| Category | Resource name       | Operation | Provider plugin   |
| -------- | ------------------- | --------- | ----------------- |
| Auth     | amplifyuser751c3c76 | No Change | awscloudformation |
| Hosting  | S3AndCloudFront     | No Change | awscloudformation |
? Are you sure you want to continue? Yes
~ 省略 ~
✔ Uploaded files successfully.
Your app is published successfully.
https://×××××××××××××.cloudfront.net

最後に表示されるURLにアクセスしてみてください。先ほど作成した画面が、CloudFrontで公開されています。
これで、プロジェクトの作成からデプロイまでが完了です。

バックエンドのGraphQLを追加する

認証機能を設定できたので、データベースにデータを永続化し、バックエンドAPIを追加します。

まずは、amplify addでGraphQLを選択肢API機能を追加します。
認証形式にAmazon Cognito User Poolを選択すると、先ほど作成したユーザー情報を用いた認証を使用することができます。

$ amplify add api
? Please select from one of the below mentioned services: GraphQL
? Provide API name: amplifytodo
? Choose the default authorization type for the API Amazon Cognito User Pool
Use a Cognito user pool configured as a part of this project.
? Do you want to configure advanced settings for the GraphQL API No, I am done.
? Do you have an annotated GraphQL schema? No
? Do you want a guided schema creation? No
? Provide a custom type name Todo

amplify statusで確認します。

$ amplify status
amplify status                                                                                                                                                                             11:12:55

Current Environment: dev

| Category | Resource name       | Operation | Provider plugin   |
| -------- | ------------------- | --------- | ----------------- |
| Api      | AmplifyUserAPI      | Create    | awscloudformation |
| Auth     | amplifyuser751c3c76 | No Change | awscloudformation |
| Hosting  | S3AndCloudFront     | No Change | awscloudformation |

APIが追加されていることがわかります。

@modelの作成

@modelが付与されたオブジェクトは、エンティティとしてAmazon DynamoDBに保存されます。@modeの単位でテーブルが作成されるイメージです。
TODOアプリ用に、モデルを作成していきます。
amplify/backend/api/amplifytodoディレクトリにschema.graphqlファイルが作成されています。
それを以下のように書き換えます。

amplify/backend/api/amplifytodo/schema.graphql
type Todo @model {
    id: ID!
    title: String!
    detail: String!
    createdAt: AWSDateTime
    updatedAt: AWSDateTime
}

この状態で、amplify pushをしてみます。一旦全てデフォルトの値で設定します。

$ amplify push
? Do you want to generate code for your newly created GraphQL API Yes
? Choose the code generation language target javascript
? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js
? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions Yes
? Enter maximum statement depth [increase from default if your schema is deeply nested] 2
~省略~
✔ Generated GraphQL operations successfully and saved at src/graphql
✔ All resources are updated in the cloud

GraphQL endpoint: https://×××××××××××××.appsync-api.ap-northeast-1.amazonaws.com/graphql

GraphQL Endpointが表示されれば成功です。
AppSyncとDynamoDBのページでリソースが作成されているか確認してみてください。

  • AppSync

appsync.png

  • DynamoDB

dynamo.png

ではTODOを追加、確認できるようにしていきます。
まずはライブラリを追加します。

$ npm install @aws-amplify/api @aws-amplify/pubsub 

src/App.jsを以下のように書き換えます。

import React, {useState, useEffect, useReducer } from 'react';
import Amplify, { Auth } from 'aws-amplify';
import API, { graphqlOperation } from '@aws-amplify/api';
import { withAuthenticator } from 'aws-amplify-react'
import { createTodo } from './graphql/mutations';
import { listTodos } from './graphql/queries';
import { onCreateTodo } from './graphql/subscriptions';

import awsconfig from './aws-exports';

Amplify.configure(awsconfig);

const GET = 'GET';
const CREATE = 'CREATE';

const initialState = {
  todos: [],
};

const reducer = (state, action) => {
  switch (action.type) {
    case GET:
      return {...state, todos: action.todos};
    case CREATE:
      return {...state, todos:[...state.todos, action.todo]}
    default:
      return state;
  }
};

function signOut(){
  Auth.signOut()
  .then()
  .catch();
}

function App() {
  const [state, dispatch] = useReducer(reducer, initialState);
  const [user, setUser] = useState(null);
  const [title, setTitle] = useState(null);
  const [detail, setDetail] = useState(null);

  function onChange(e){
    if(e.target.id === 'title'){
      setTitle(e.target.value);
    }
    if(e.target.id === 'detail'){
      setDetail(e.target.value);
    }
  }

  async function create(e) {
    e.preventDefault();
    setTitle('')
    setDetail('')
    const todo = { title:title, detail:detail };
    await API.graphql(graphqlOperation(createTodo, { input: todo }));
  }

  useEffect(() => {

    async function getUser(){
      const user = await Auth.currentUserInfo();
      setUser(user);
      return user
    }

    getUser();

    async function getData() {
      const todoData = await API.graphql(graphqlOperation(listTodos));
      dispatch({ type: GET, todos: todoData.data.listTodos.items });
    }

    getData();

    const subscription = API.graphql(graphqlOperation(onCreateTodo)).subscribe({
      next: (eventData) => {
        const todo = eventData.value.data.onCreateTodo;
        dispatch({ type: CREATE, todo });
      }
    });

    return () => subscription.unsubscribe();
  }, []);

  return (
    <div className="App">
      <p>user: {user!= null && user.username}</p>
      <button onClick={signOut}>Sign out</button>
      <div>
        <table border="1" style={{'border-collapse': 'collapse'}}>
          <tr>
            <th>No</th>
            <th>Title</th>
            <th>Detail</th>
            <th></th>
          </tr>
          <tr>
            <td></td>
            <td><input id='title' type='text' onChange={onChange} value={title}/></td>
            <td><input id='detail' type='text' onChange={onChange} value={detail}/></td>
            <th><button onClick={create}>New</button></th>
          </tr>
          {state.todos && state.todos.map((todo,index) => {
            return(
              <tr key={todo.id}>
                <td>{index + 1}</td>
                <td>{todo.title}</td>
                <td>{todo.detail}</td>
                <td>{todo.createdAt}</td>
              </tr>
            )
          })}
        </table>
      </div>
    </div>
  );
}

const signUpConfig = {
    header: 'Sign Up',
    hideAllDefaults: true,
    defaultCountyCode: '1',
    signUpFields: [
        {
            label: 'User Name',
            key: 'username',
            required: true,
            displayOrder: 1,
            type: 'string'
        },
        {
            label: 'Email',
            key: 'email',
            required: true,
            displayOrder: 2,
            type: 'string'
        },
        {
            label: 'Password',
            key: 'password',
            required: true,
            displayOrder: 3,
            type: 'password'
        }
    ]
}

export default withAuthenticator(App, {
  signUpConfig: signUpConfig
});

ローカルで実行してみます。

$ npm start

ブラウザでサイトを立ち上げて確認してみます。

video1.gif

TODOが追加できていることがわかります。DynamoDBのコンソールでも確認してみてください。
作成したTODOが追加されています。

簡単ですが、GraphQLのバックグラウンドを追加してデータの追加をしてみました。

削除

amplify deleteinitで作成した環境を全て削除できます。何かとお金がかかるので不安な方は実行してください。

まとめ

AWS Amplifyの紹介と実際に少し触ってみました。
まだまだAmplifyの一部分しか触れていませんが、一から構築するのと比べものにならないぐらい爆速でアプリを立ち上げることができます。
Amplify Frameworkの基本的なフローは、amplify addで機能を追加しamplify pushでCloudFrontのテンプレートファイルを更新し、amplify publishで静的サイトをデプロイする、の流れになります。
Amplifyを使ってAWSを簡単に導入して、少しずつ各サービスを理解していき、最終的には同等の環境をAmplifyなしで構築できればベストかなと感じました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Oracle Cloud Infrastructure Data Scienceを使って、OCI Object StorageとAWS S3のファイルデータにアクセスしてみる

本記事の狙い

2020/2に、Oracle Cloud Infrastructure Data Science(OCI-Data Science)がリリースされました。
前回、OCI-Data ScienceからOracle Autonomous Database(ADW)上のデータにクエリしてみたので(Qiita記事:Oracle Cloud Infrastructure Data Scienceを使ってOracle Autonomous Database(ADW)のデータにアクセスしてみる)、本記事では、実際にOCI-Data Scienceを使って、Oracle Cloud Infrastructure Object Storage(OCI-Object Storage)と、AWS S3上のファイルからデータを取得する手順を、実際に実施してみたいと思います。

参考文献

実施に参考になるリンク

手順

以下のような手順で実施します。
1.OCI-Data Scienceの設定
2.OCI-Object Storage上にファイルをおき、OCI-Data Scienceからアクセスする
3.OCI-Data Science上にファイルををおき、OCI-Data Scienceからアクセスする
4.AWS S3上にファイルをおき、OCI-Data Scienceからアクセスする

1.OCI-Data Scienceの設定

上記参考文献の「Oracle Cloud Infrastructure Data Science(OCI-Data Science)を使ってみよう」を参考にOCI-Data Scienceのノートブック環境を構築、設定をします。
手順とおりに実施すれば、それほど難しくないのでは、と思います。

  1. Oracle Cloudの基本的な設定の後に、ノートブック環境を構築します。
  2. getting-started.ipynbを使って、ノートブック環境(JupyerLab)の初期作業を行います。

2.OCI-Object Storage上にファイルをおき、OCI-Data Scienceからアクセスする

OCI-Data Scienceの中には、/home/datascience/ads-examples 配下のディレクトリに、多くのサンプルノートブックファイルが存在します。
これらサンプルファイルで、基本的な使い方は大体網羅されていますが、今回はその中の一つ、ads_loading_data-2.ipynb というサンプルファイルを使います。
このサンプルノートブックの順序に従ってやれば、大体できるようになっています。

a.OCI-Object Storageにファイルをおく

  • 左のナビゲートから、オブジェクト・ストレージを選択します。
  • 「バゲットの作成」ボタンから、バゲットを作成します。(例:bucket-20200323-2255)
  • バゲットができたら、「オブジェクトのアップロード」ボタンから、ファイルをアップロードします。(例:Purchase_Item.csv) image.png

b.OCI-Data Scienceからファイルにアクセスする

OCI-Data Scienceのノートブック環境から、ads_loading_data-2.ipynb を開きます。
image.png

必要なライブラリを読み込みます。

import pandas as pd
import numpy as np

import warnings
warnings.filterwarnings('ignore')

import logging
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.ERROR)

from ads.dataset.factory import DatasetFactory
from ads.dataset.dataset_browser import DatasetBrowser

OCI-Object Storageへの接続にあたっては、OCI configuration fileの設定が必要ですが、こちらは、getting-started.ipynbを使って、先に設定しておく必要があります。参考文献の「Oracle Cloud Infrastructure Data Science(OCI-Data Science)を使ってみよう」を参考にOCI-Data Scienceのノートブック環境を構築、設定しておいてください。

実際にOCI-Object Storage上のデータにアクセスしてみます。
OCI-Object Storage上のファイルにアクセスするには、ADSに含まれるDatasetFactory.openを使って、oci://<bucket-name>/<file-name>のように指定します。

以下のように記載します。

ds_oci = DatasetFactory.open("oci://bucket-20200323-2255/Purchase_Item.csv", 
                         storage_options={"config":"~/.oci/config", "profile":"DEFAULT"}, delimiter=",")

以上です。
OCI configuration fileを利用し、CSVファイルをカンマ区切りで読み込んでいます。
正常に取得できたか、確認してみます。

ds_oci.head()

image.png

きちんとOCI-Object Storage上のファイルからデータが取得されています。
簡単ですね。

3.OCI-Data Science上にファイルをおき、OCI-Data Scienceからアクセスする

ads_loading_data-2.ipynb の中には、Local File Storageという、OCI-Data Scienceのノートブック環境上にファイルをおいてアクセスする方法も紹介されているのでやってみます。

a.OCI-Data Science上にファイルをおく

/home/datascience/ads-examples/dataディレクトリ配下には、デフォルトでサンプルデータが置いてあります。
同じようにデータをこのディレクトリ(もしくは適当なディレクトリ)に置きます。ファイルのアップロードには、JupyterLabのアップロードボタンを利用すると便利です。
image.png

b.OCI-Data Scienceからファイルにアクセスする

今回はads_loading_data-2.ipynbにあるとおり、/home/datascience/ads-examples/dataディレクトリ配下に、デフォルトで存在するサンプルデータを利用します。
この場合も、ADSに含まれるDatasetFactory.openを使って、以下のように記載します。

ds_ocids = DatasetFactory.open("/home/datascience/ads-examples/data/multiclass_fk_10k.csv")

確認してみます。

ds_ocids.head()

image.png

うむ。
難しくないですね。

c.OCI-Data Science上に新規ファイルを作成し、データをロードする

今度は逆に、Notebook上のデータを使って、OCI-Data Science上のノートブック環境に新規ファイルを作成し、上記で使用したds_ocidsのデータをロードしてみます。
この場合は、ADSDatasetに含まれる、to_csv()メソットを利用します。

import os
# Generate CSV of our data
[ds_link] = ds_ocids.to_csv("./data/test_multiclass.csv")

確認します。
確かに新規ファイルが作成され、データがファイルにロードされていますね。
image.png

4.AWS S3上にファイルをおき、OCI-Data Scienceからアクセスする

次に、AWS S3上のデータに、OCI-Data Scienceからアクセスしてみます。

a.AWS S3にファイルをおく

  • S3上にバゲットを作成し、ファイルをアップします。 image.png

OCI-Data Scienceからアクセスするには、アクセスキーID、シークレットアクセスキーが必要となります。
参考文献「AWSアクセスキー作成」を参考にしながら、以下を実施します。

  • グループ作成
  • ユーザー作成
  • アクセスキーID、シークレットアクセスキーIDの確認

また、バケットへのエンドポイントURLを確認しておきます。S3上のファイル詳細のオブジェクトURLに記載あります。(もっといい確認方法があるかもしれません、、、)
例:https://<バケット名>.s3-ap-northeast-1.amazonaws.com

b.OCI-Data Scienceからファイルにアクセスする

AWS S3上のファイルにアクセスする場合も、OCI-Object Storageと同様に、ADSに含まれるDatasetFactory.openを使って、oci://<bucket-name>/<file-name>のように指定します。
以下のように記載します。

aws_key = '<上記で確認したアクセスキーID>'
aws_secret = '<上記で確認したシークレットアクセスキーID>'
ds_s3 = DatasetFactory.open("s3://<バケット名>/<ファイル名>", storage_options = {
    'key': aws_key,
    'secret': aws_secret,
    'client_kwargs': {
            "endpoint_url": "<エンドポイントURL>"
    }
})

確認してみます。

ds_s3.head()

確かに、無事取得できました。
image.png

これでAWS S3上のデータを使って、OCI-Data Science上でデータ分析を実施したり、OCI-Object StorageとAWS S3上のデータを結合してOCI-Data Scienceで利用したり、分析の幅が広がりますね。

終わりに

今回は、OCI-Data Scienceにサンプルとして含まれる、ads_loading_data-2.ipynb をベースに、OCI-Data Scienceから、OCI-Object Storageと、AWS S3上のファイルにアクセスし、データを取得してみました。

またこの方法以外にもADSを使って、様々なデータソースからデータを取得する方法が、サンプルノートブックや、ADSのドキュメントの「Loading Data」に記載しているので参考にしてみてください。

OCI-Data Scienceは、最大30日間300$分の無償クレジットが使えるOracle Free Trialの、対象サービスですので、ぜひ実際に使ってみることをおすすめします。

Let's Enjoy Data Science!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む