- 投稿日:2020-03-24T23:35:52+09:00
EC2の処理が突然遅くなったときはCPUクレジットを確認しよう
はじめに
EC2のインスタンス上で画像処理をする機能を社内用に提供していました。
ところが、変換するのに通常より時間がかかってくるとの声が上がってきました。
しかも、午前中は大丈夫だが、午後になると遅くなって使い物にならなくなるとのこと。調査してみると、CPUクレジットが枯渇していることが原因となっているようでした。
CPUクレジットとは何か、なぜ午後に遅くなってしまったのかをまとめます。まずは調査
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を使ったほうが良いかと思います)
- 投稿日:2020-03-24T23:29:00+09:00
AWSで料金アラートの設定
最近UdemyでAWSを学び始めた。AWSは無料期間が一年間あるが、有料サービスを利用してしまったり、無料期間の終了に気づかず使用してると料金が知らない間に発生してしまう。
そうならないためにも、CloudWatchという機能を使ってアラートを設定していく。料金アラートの設定
AWSにログインすると以下の画面になるので、ユーザー名の書いてある赤枠部分を選択。
マイ請求ダッシュボードを選択。
Billingの設定を選択。
請求設定にチェック、メールアドレスの設定をして、「請求アラートを管理する」を設定。
左のメニューの請求を選択。
アラームの作成を選択。
料金の設定。今回は10ドルを超えたらアラートするように指定して「次へ」を選択。
メールアドレスを設定して、「次へ」を選択。
エラーが出てるけどとりあえず次へ。
プレビュー画面の一番下の「アラームの作成」を選択。
一応正常に作成された。
終わりに
とりあえず作成できたから、超えたら通知が来るはず・・・。
- 投稿日:2020-03-24T22:50:55+09:00
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年3月時点では東京リージョンに対応していません。
他のリージョンをお選びください。
4. [Verify a New Email Address] をクリック
5. 自分のメールアドレスを入力し、[Verify This Email Address] をクリック
6. 検証メールを送信した旨が表示されるので、[Close] をクリック
※ 検証メールが届くまで1時間ほどかかる場合があるようです7. 自分のメールアドレス宛に検証メールが届いたか確認する
こんな感じのメールが届いているはずです。
8. メール本文内のURLをクリック (真ん中に書いてある方)
※ クリックしないと以降の手順が進められないのでご注意ください10. Amazon SESコンソールで[Email Addresses] をクリックする
自分のメールアドレスのステータスが[verified] になったことが確認できます。
11. メールアドレス横のチェックを入れ、[Send a Test Email] をクリック
12. 以下の内容を入力し、[Send Test Email] をクリック
Email Format:Formatted
- [Raw] はより細かくカスタマイズしたいときに使うようです。添付ファイルをつけたいとか
From:自分のメールアドレス
To:自分のメールアドレス
Subject:適当な内容
Body:適当な内容
13. 自分のメールアドレス宛に検証メールが届いたか確認する
あとがき
ユースケースとしてはシステムセットアップ時のテストぐらいにしか使わないっぽいけど、やってみました。
参考
- 投稿日:2020-03-24T18:25:35+09:00
複数インスタンスから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こういったサービスってないのかな?
- 投稿日:2020-03-24T16:25:58+09:00
【AWS】Amazon WorkSpacesの作成
はじめに
初回起動時は高速セットアップで作成することも可能です。
以下で説明する方法は、通常のWorkSpaceの起動について説明します。起動方法
上記の図の
WorkSpacesの起動
ボタンを押します。ディレクトリの選択
WorkSpaces を起動するディレクトリを選択します。ディレクトリには、ユーザーと WorkSpaces の両方が含まれます。]
ディレクトリには、既に作成してあるディレクトリが表示されるので、選択します。
設定項目の下記2点は
有効
にしておきます。
- セルフサービスアクセス許可の有効化
- Amazon WorkDocs の有効化
次のステップ
をクリックします。ユーザーの特定
新規ユーザーを作成する場合は必要事項を記載し、
ユーザーの作成
をクリックします。
既存のユーザーから選択したい場合は、検索を実行し、追加したいユーザーを選択して、
選択項目を追加
を押してください。
ユーザーの特定が完了したら、
次のステップ
を選択してください。バンドルの選択
起動したいバンドルを選択して、起動します。
目的がテストの場合は、無料利用枠の対象のマシンを選択すると、無料利用枠を利用できます。WorkSpacesの設定
実行モード
AlwaysOn
とAuto Stop
がありますが、今回はAuto Stop
を利用します。暗号化
今回はテストなので、暗号化は行いません。
タグの管理
適宜タグを設定します。
WorkSpaces のレビューと起動
表示されている内容を確認して、
WorkSpacesの起動
をクリックします。
起動には20分ほど時間がかかる可能性があります。
届いたメールの手順に沿ってアクセスしてください。
- 投稿日:2020-03-24T14:40:07+09:00
【AWS】Simple AD ディレクトリの作成
初めに
Simple ADを配置するためのVPCを構築します。
2つ以上のAZでサブネットを作成し、それぞれにインターネット接続できるように、Internet GateWayを設定します。作成方法
サービス画面の表示
AWSのActive Directoryのサービスページに移動します。
その後、ディレクトリのセットアップ
を選択します。ディレクトリタイプの選択
Simple AD
を選択し、次へ進みます。ディレクトリ情報の入力
- ディレクトリのサイズ
スモール- ディレクトリのDNS名
任意の文字列でOK
例)test.local- ディレクトリのNetBIOS名
今回は指定なし- デフォルト管理ユーザー
Administrator(変更不可)- 管理者のパスワード
任意の文字列- 説明
任意の説明を入力
例)test上記の内容の入力が完了したら、次に進みます。
VPCとサブネットの選択
VPCとサブネットは先ほど作成したものを利用してください。
確認と作成
表示されている内容を確認し、
ディレクトリの作成
を選択します。さいごに
ディレクトリの作成には5~10分かかります。
次回は、作成したDirectoryを利用して、WorkSpacesを利用してみようと思います。
- 投稿日:2020-03-24T13:54:52+09:00
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参考
- https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_AdminInitiateAuth.html
- https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html
- https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/admin-initiate-auth.html
- https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/initiate-auth.html
- 投稿日:2020-03-24T13:47:57+09:00
AWS 資格 データ分析の取得を目指す
まずはビッグデータを勉強して、試験に望む。
ブログ
ブレインパッドの方のブログudemy
過去問集があった。(英語)ジェル?16個消費で実施。65問Whizlabs
フリーの15問と、有料のものがあった。a cloud guru
テストシミュレーターがビッグデータはない。。公式サンプル問題集
公式模試
- 投稿日:2020-03-24T11:49:54+09:00
S3バケットのオブジェクトを1000個以上取得する
公式リファレンスに記載があるように、list_objects_v2は1000個以上のS3オブジェクトを取得する際には面倒なnext_tokenの処理が必要になります。
そこで、1000個以上のS3オブジェクトを扱う際には、Aws::S3::Bucket#objectsを使うと、このようにシンプルに書けます。
list-objects.rbrequire 'aws-sdk' bucket = Aws::S3::Bucket.new('<バケット名>') obj_array = bucket.objects.map(&:key) obj_array.size # => オブジェクト数 obj_array.first # => プレフィックス/オブジェクト名
- 投稿日:2020-03-24T10:23:21+09:00
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バケットに生成および発行できる
- 投稿日:2020-03-24T09:23:08+09:00
AWSスナップショット管理の決定版!!Veritas CloudPointを、ガッツリご紹介します!!
はじめに
今回は、Vertias CloudPointの紹介です。
紹介資料のフル版はSlideShareに公開していますので参照ください。
「Vertias CloudPoint(AWS スナップショット管理)マーケットプレイスから導入してみた」もご覧ください。
ダイジェスト版の動画(説明つき)と資料についても、別途公開予定です。本記事では、下記の内容を抜粋して紹介します。
- クラウド上で、バックアップって必要なの?
- クラウドのスナップショットって、バックアップ用途に使えるの?
- Veritas CloudPointって何?
- 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 スナップショット管理)マーケットプレイスから導入してみた」もご覧ください。フル版スライド資料ダウンロード
下記の動作説明、画面キャプチャでの機能説明をしておりますので、ぜひ、ご確認ください。
■バックアップ、リストアの動作
- EC2インスタンス(Host)バックアップ
- EC2インスタンス(Host)リストア
- EC2インスタンス(Disk)バックアップ
- EC2インスタンス(Disk)リストア
- EC2インスタンス ファイル単位のリストア
- RDS、Auroraバックアップ
- RDS、Auroraリストア■動作画面のキャプチャ
- ダッシュボード
- ポリシー作成&アセットへの適用
- Application on EC2 整合性(MSSQL、MongoDB)
- ファイルリストア
- Veritas Information Classifier
- RBAC(ロールベースアクセス制御)
- NetBackup連携商談のご相談はこちら
本稿からのお問合せをご記入の際には「お問合せ内容」に#GWCのタグを必ずご記入ください。ご記入いただきました内容はベリタスのプライバシーポリシーに従って管理されます。
- 投稿日:2020-03-24T07:01:56+09:00
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のテンプレートファイルなどがアップデートされます。
次に、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.jsimport 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/
にアクセスすると、次の画面が表示されます。
Create account
をクリックしアカウント作成画面でアカウントを作成し、ログインしてみます。作成したユーザーは、Cognitoに作成されています。
- 画面
- Cognito
Hello World
の画面が表示されます。サイトを公開する
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.graphqltype 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/graphqlGraphQL Endpointが表示されれば成功です。
AppSyncとDynamoDBのページでリソースが作成されているか確認してみてください。
- AppSync
- DynamoDB
では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ブラウザでサイトを立ち上げて確認してみます。
TODOが追加できていることがわかります。DynamoDBのコンソールでも確認してみてください。
作成したTODOが追加されています。簡単ですが、GraphQLのバックグラウンドを追加してデータの追加をしてみました。
削除
amplify delete
でinit
で作成した環境を全て削除できます。何かとお金がかかるので不安な方は実行してください。まとめ
AWS Amplifyの紹介と実際に少し触ってみました。
まだまだAmplifyの一部分しか触れていませんが、一から構築するのと比べものにならないぐらい爆速でアプリを立ち上げることができます。
Amplify Frameworkの基本的なフローは、amplify add
で機能を追加しamplify push
でCloudFrontのテンプレートファイルを更新し、amplify publish
で静的サイトをデプロイする、の流れになります。
Amplifyを使ってAWSを簡単に導入して、少しずつ各サービスを理解していき、最終的には同等の環境をAmplifyなしで構築できればベストかなと感じました。
- 投稿日:2020-03-24T07:01:56+09:00
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のテンプレートファイルなどがアップデートされます。
次に、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.jsimport 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/
にアクセスすると、次の画面が表示されます。
Create account
をクリックしアカウント作成画面でアカウントを作成し、ログインしてみます。作成したユーザーは、Cognitoに作成されています。
- 画面
- Cognito
Hello World
の画面が表示されます。サイトを公開する
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.graphqltype 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/graphqlGraphQL Endpointが表示されれば成功です。
AppSyncとDynamoDBのページでリソースが作成されているか確認してみてください。
- AppSync
- DynamoDB
では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ブラウザでサイトを立ち上げて確認してみます。
TODOが追加できていることがわかります。DynamoDBのコンソールでも確認してみてください。
作成したTODOが追加されています。簡単ですが、GraphQLのバックグラウンドを追加してデータの追加をしてみました。
削除
amplify delete
でinit
で作成した環境を全て削除できます。何かとお金がかかるので不安な方は実行してください。まとめ
AWS Amplifyの紹介と実際に少し触ってみました。
まだまだAmplifyの一部分しか触れていませんが、一から構築するのと比べものにならないぐらい爆速でアプリを立ち上げることができます。
Amplify Frameworkの基本的なフローは、amplify add
で機能を追加しamplify push
でCloudFrontのテンプレートファイルを更新し、amplify publish
で静的サイトをデプロイする、の流れになります。
Amplifyを使ってAWSを簡単に導入して、少しずつ各サービスを理解していき、最終的には同等の環境をAmplifyなしで構築できればベストかなと感じました。
- 投稿日:2020-03-24T01:35:17+09:00
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上のファイルからデータを取得する手順を、実際に実施してみたいと思います。参考文献
実施に参考になるリンク
- Oracle Cloud Infrastructure Data Science(OCI-Data Science)を使ってみよう
- OCI-Data Science 公式ドキュメント
- Oracle Accelerated Data Science SDK (ADS) 公式ドキュメント(Loading Data)
- Qiita記事:AWSアクセスキー作成
手順
以下のような手順で実施します。
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のノートブック環境を構築、設定をします。
手順とおりに実施すれば、それほど難しくないのでは、と思います。
- Oracle Cloudの基本的な設定の後に、ノートブック環境を構築します。
- 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)
b.OCI-Data Scienceからファイルにアクセスする
OCI-Data Scienceのノートブック環境から、ads_loading_data-2.ipynb を開きます。
必要なライブラリを読み込みます。
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 DatasetBrowserOCI-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()きちんと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のアップロードボタンを利用すると便利です。
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()うむ。
難しくないですね。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")確認します。
確かに新規ファイルが作成され、データがファイルにロードされていますね。
4.AWS S3上にファイルをおき、OCI-Data Scienceからアクセスする
次に、AWS S3上のデータに、OCI-Data Scienceからアクセスしてみます。
a.AWS S3にファイルをおく
OCI-Data Scienceからアクセスするには、アクセスキーID、シークレットアクセスキーが必要となります。
参考文献「AWSアクセスキー作成」を参考にしながら、以下を実施します。
- グループ作成
- ユーザー作成
- アクセスキーID、シークレットアクセスキーIDの確認
また、バケットへのエンドポイントURLを確認しておきます。S3上のファイル詳細のオブジェクトURLに記載あります。(もっといい確認方法があるかもしれません、、、)
例:https://<バケット名>.s3-ap-northeast-1.amazonaws.comb.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()これで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!