20210329のAWSに関する記事は28件です。

AWS IoT Coreのカスタムジョブでシェルスクリプトを配信して実行させる

はじめに

今までGreengrassのOTAアップデートを何度か試してきました。
ただ、それだけでなく更新用のファイルを配信→実行までしたい、ということでカスタムジョブを使ってみます。

今回は以下の記事を大いに参考にさせていただきました。
参考:AWS IoTのジョブ機能とモノの動的グループを利用してデバイスに配布するソフトウェアを管理する

1 必要なファイルの作成

今回はデバイスにシェルスクリプトを配信→実行ができるかまでを検証します。
実行できたことも分かるよう、シェルスクリプトは/tmp配下にログを吐くようなものを作成しました。

1.以下の通りシェルスクリプトを作成する

test.sh
#!/bin/bash

DIR=/tmp
FILE=$DIR/"update-test.log"

DATE=`date "+%Y-%m-%D %H:%M:%S"`

if [ -f $FILE ] ; then
    touch $FILE
fi

#/tmp配下に実行時刻を記録する「update-test.log」を作成
echo "$DATE update" >> $FILE

次に、ジョブドキュメントを作成します。
今回は参考サイトのものをそのまま利用します。

2 配信元S3の作成

1.配信元のS3バケットを作成する
2.S3バケットに test.sh をアップロードする
3.今回は作成したバケットを静的ウェブホスティングで公開し test.sh を取得できるようにする
4.S3のマネジメントコンソールで対象のバケット > アクセス許可タブ の順にクリック
5.ブロックパブリックアクセス (バケット設定)の「編集する」をクリック
6.「パブリックアクセスをすべてブロックする」からチェックを外し、「変更の保存」の順にクリック
image.png
7.プロパティタブ > 静的ウェブサイトホスティングの「編集する」の順にクリック
8.以下の通り設定を変更して、「変更の保存」をクリック

  • 静的ウェブサイトホスティング:有効にする
  • ホスティングタイプ:静的ウェブサイトをホストする
  • インデックスドキュメント:test.sh ※配信ファイル

image.png
9.アクセス許可タブ > バケットポリシーの「編集する」の順にクリック
10.以下の通りバケットポリシーを設定して「」をクリック

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::[バケット名]/*"
        }
    ]
}

11.オブジェクトタブでアップロードした配信ファイルをクリック > 「オブジェクトURL」を控える
image.png

3 ジョブ実行の準備

次に、ジョブドキュメントとデバイス側でジョブを受けて処理をするプログラムを用意します、
ジョブドキュメントは参考サイトのものをそのまま利用し、デバイスで実行するプログラムは参考サイトのモノに少し手を入れています。

1.ローカルでジョブドキュメントを作成する

update-test-0001.json
{
    "app_url": "先ほどの手順で控えた実行ファイルのオブジェクトURL",
    "app_version": "2.0"
}

2.作成したジョブドキュメントをS3にアップロードする
※任意のバケット
3.デバイスで実行プログラムを作成する
※参考サイト同様AWS IoT Device SDK for Pythonのsamples/jobsの jobsSample.py に少し手を加えた
 AWS IoT Device SDK for Pythonの導入は以下を参照のこと(下記手順のあと、作業ディレクトリにjobsSample.pyをコピーして実行した)
 参考:モジュール 4: AWS IoT Greengrass グループでのデバイスの操作

jobsSample.py
#主な修正箇所のみ記載

#---前略---

import threading
import logging
import time
import datetime
import argparse
import json
#以下のライブラリを追加でimport
import urllib.request
import os
import subprocess

#---中略---

    def executeJob(self, execution):
        print('Executing job ID, version, number: {}, {}, {}'.format(execution['jobId'], execution['versionNumber'], execution['executionNumber']))
        print('With jobDocument: ' + json.dumps(execution['jobDocument']))
        #参考サイトよりコピペ、ジョブドキュメントのURLをもとに配信ファイルをダウンロードする
        app_url = execution['jobDocument']['app_url']
        self.app_version = execution['jobDocument']['app_version']
        urllib.request.urlretrieve(app_url, 'app.sh')
        #配信ファイルに実行権限を付与して実行する
        os.chmod('test.sh', 0o777)
        subprocess.run('./test.sh')

#---後略---

4 カスタムジョブの実行

IoT Coreのマネジメントコンソールからジョブを実行し、test.sh の配信と実行を確認します。
なお、実行中 jobsSample.py から実行結果が $aws/events/ 配下のtopicに送られてくるので、テスト画面で $aws/events/# をサブスクライブしても状況を見ることができます。

1.IoT Coreのマネジメントコンソールで左のメニューから 管理 > ジョブ > ジョブを作成する の順にクリック
2.「カスタムジョブを作成」をクリック
image.png
3.以下の通り設定して「次へ」をクリック

  • ジョブID:任意の名称 ※ただし既存のジョブIDと被ってはいけない
  • 更新するデバイスの選択:任意のデバイスまたはグループ
  • ジョブファイルの追加:「3.ジョブ実行の準備」で作成したジョブドキュメントを選択
  • ジョブタイプ:ジョブは、選択したデバイス/グループへのデプロイ後に完了します (スナップショット)

image.png
4.デフォルト設定のまま「作成」をクリック
5.デバイス側で jobsSample.py を以下の通り実行する

python jobsSample.py --endpoint [エンドポイントのURL] \
 --rootCA [ルートCA証明書] --cert [デバイス証明書] --key [秘密鍵] \
 --thingName [モノの名前]

6.プロンプトが返ってきたら、マネジメントコンソールでジョブの実行状況を確認する
image.png
※詳細画面でジョブドキュメントも確認できる
image.png

5 実行結果の確認

まず、デバイスで jobsSample.py を実行したディレクトリ(カレントディレクトリ)に test.sh がダウンロードできていました。
以下の通り、権限も変更されています。

ls -la test.sh 
-rwxrwxrwx 1 root root 156  3月 29 20:05 test.sh

また、 test.sh を実行した証跡として期待通りログが出力されていました。

cat /tmp/update-test.log 
2021-03-03/29/21 20:05:22 update

6 おわりに

当初目的としていた以下は達成できました。

  • 実行ファイルを配信する
  • 配信したファイルを実行する

以下については今後もう少し工夫してみようと思います

  • デバイス側でジョブを処理するプログラムを手動実行しないで済むようにする
  • 署名付きURLを使ったジョブの実行

7 参考文献(本文中で登場していないもの)

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

AWS Data Pipelineってなんだろ?

名前だけは聞いたことあるけど、どんなサービスなのか知らないので調べてみました。

ドキュメント

AWS Data Pipeline(データの移動や変換を簡単に自動化)| AWS

ざっくり

  • データの移動や変換を簡単に自動化
  • 指定された間隔で、AWS のサービスやオンプレミスのデータソース間で信頼性の高いデータ処理やデータ移動を行うことを支援するウェブサービス
  • 保存場所にあるお客様のデータに定期的にアクセス
  • 必要なスケールのリソースで変換と処理を行い、その結果を Amazon S3、Amazon RDS、Amazon DynamoDB、Amazon EMR のような AWS サービスに効率的に転送
  • 耐障害性があり、繰り返し可能で、高可用性を備えた、複雑なデータ処理ワークロードを簡単に作成

3行でまとめると、

保存場所にあるデータに定期的にアクセスし、
最低限のリソースで変換や処理を行い、
AWSサービスに転送することができるサービス

というかんじでしょうか。

ざっくりメリット

  • 信頼性
  • 使いやすさ
  • 柔軟性
  • スケーラブル
  • 低コスト
  • 透過的

イメージ

image.png
AWS Data Pipeline を使用して、クリックストリームデータを Amazon S3 から Amazon Redshift に移動します。

よくある質問

よくある質問 - Amazon Data Pipeline | AWS

AWS Data Pipeline とは何ですか?

  • AWS クラウドでの定期的なデータ移動やデータ処理といったアクティビティのスケジュールを簡単に設定できるウェブサービス
  • Data Pipeline によりオンプレミスとクラウドベースのストレージシステムが統合されるため、開発者はそれらのデータを必要なときに、使用したい場所で、必要な形式で使用できる
  • データソース、送信先、および「パイプライン」と呼ばれるデータ処理アクティビティ (あらかじめ定義されたアクティビティまたはカスタムアクティビティ) から成る依存関係をすばやく定義できる
  • パイプラインは、定義したスケジュールに基づき、処理アクティビティを定期的に実行

冒頭の3行とほぼ同じですが、

データ処理の流れや方法を定義し、
オンプレとクラウドのデータ移動や処理を
スケジュールに基づいて定期的に実行するウェブサービス

とまとめてみました。

AWS Data Pipeline を使用して何ができますか?

  • パイプラインの準備がすばやく簡単に行えるようになり、日次データ運用の管理に必要な開発とメンテナンスの手間が省けるため、そのデータを基にした将来の予測を立てることに集中できる
  • 処理アクティビティの実行とモニタリングは、高い信頼性があり耐障害性を備えたインフラストラクチャ上で行われる
  • Amazon S3 と Amazon RDS 間でのデータコピーや、Amazon S3 ログデータに対するクエリの実行など、一般的なアクションの組み込みアクティビティが用意されている

一言でまとめると
本来必要な業務に集中できる
だと思います。

そのために、Data Pipelineは「すぐに準備ができて」、「信頼性と耐障害性を備え」、「よくある処理は準備されている」ということだと思います。

AWS Data Pipeline と Amazon Simple Workflow Service の違いは何ですか?

  • 両サービスとも、追跡、再試行、例外処理、任意のアクションの実行といった機能を提供
  • AWS Data Pipeline では特にデータ駆動型ワークフローの大半に共通する特定の手順を簡素化
  • 入力データが特定の準備基準に一致した場合にアクティビティを実行する、異なるデータストア間で簡単にデータをコピーする、変換スケジュールを簡単に設定するなど
  • Data Pipeline は特定の手順に高度に特化しているため、コーディングやプログラミングの知識がなくても、ワークフロー定義を簡単に作成できる

「よく行われる処理は手順を簡素化してるから、プログラミングできなくても使える」というのがData Pipelineの特徴のようです。
「よく行われる処理」の例として、「データストア間で簡単にデータをコピーする」などが挙げられています。

パイプラインとは何ですか?

  • AWS Data Pipeline のリソース
  • データソースの依存関係の定義、送信先、およびビジネスロジックの実行に必要な定義済みまたはカスタムのデータ処理アクティビティなど

冒頭の図全体をイメージし、Data Pipeline全体で扱うリソースと捉えました。

データノードとは何ですか?

  • お客様のビジネスデータを表したもの
  • 例えば、データノードは特定の Amazon S3 パスを参照できる
  • s3://example-bucket/my-logs/logdata-#{scheduledStartTime('YYYY-MM-dd-HH')}.tgz のように指定

データそのものではなく、データのある場所を示す用語というかんじがします。

アクティビティとは何ですか?

  • AWS Data Pipeline がパイプラインの一部としてお客様の代わりに実行するアクション
  • 例としては、EMR または Hive ジョブ、コピー、SQL クエリ、コマンドラインスクリプトなど

シンプルに考えると、実際の処理のことだと思います。

前提条件とは何ですか?

  • 準備状況のチェックのこと
  • オプションでデータソースまたはアクティビティに関連付けることができる
  • データソースに前提条件チェックがある場合、そのデータソースを使用するアクティビティが起動される前に、その前提条件チェックが正常に完了しなければならない
  • アクティビティに前提条件がある場合は、アクティビティが実行される前に前提条件チェックが正常に完了しなければならない
  • 高額なコンピューティングアクティビティを実行していて、一定の基準を満たすまではそのアクティビティを実行すべきでない場合に有用

処理を開始するための条件だと思います。
以下のような流れになりそうです。

条件をチェック → チェックが正常に完了 → 処理実行

例として、処理に結構なお金がかかる場合が挙げられています。
「途中までやったけど失敗した」となると、その分も課金されてしまうので、条件をクリアするまでは実行しないという使い方が良いと記述されています。

スケジュールとは何ですか?

  • パイプラインのアクティビティが実行されるタイミング、およびサービスがお客様のデータを利用できると想定する頻度
  • すべてのスケジュールには開始日と頻度の設定が必要
  • オプションで終了日を指定できる
  • 終了日以降は、AWS Data Pipeline サービスはいかなるアクティビティも実行しない

処理のタイミングと頻度ですね。
必須なのは「開始日」、「頻度」で
オプションで「終了日」の指定ができるようです。
終了日以降は何もしないことも記述されていますね。

いったんまとめてみる

ここまでを簡単にまとめてみます。

  • オンプレとクラウドのデータ移動や処理を、スケジュールに基づいて定期的に実行するウェブサービス
  • よく行われる処理は手順を簡素化してるから、プログラミングできなくても使える
  • パイプラインとは、Data Pipeline全体で扱うリソース
  • データノードは、データのある場所を示す
  • アクティビティは、実行するアクション
  • 前提条件とは、処理を開始するための条件
  • スケジュールには開始日、頻度、終了日(オプション)を指定する

ドキュメント以外

今日もお世話になります。
AWS再入門 AWS Data Pipeline編 | DevelopersIO

ポイント

  • AWSのマネージドサービスである
  • ノード間でのデータ移行やETL処理を実行することができる
  • 一般的なスケジューラの機能を持っている(時間指定やサイクリック、依存関係設定など)
  • オンプレの処理にも使える
  • Data Pipelineはあくまでデータ移行に関するベースの機能を提供
  • データの変換と加工については、別途プログラミングが必要

ドキュメントに記載されている「プログラミング不要」というのは「データ移行に関しては」の話だったんですね。

AWSのマネージドサービスである

ハードの調達や管理、運用などなど面倒なことはAWSにお任せってやつですね。

データ移行やETL処理を実行することができる

  • 開発用のGUI
  • AWSサービス間の単純なデータ移行くらいであれば、簡単なマウスとキーボードの操作だけで処理を作り、実行できる
  • 複雑な変換や加工の処理を実行したい場合でも、自前で開発したプログラムをData Pipelineで実行させることができる

ドキュメントにも、「ウェブサービス」としての提供と書かれていましたね。
専用のGUIで簡単にできる部分は簡単にでき、自前のプログラムも実行できるようです。

一般的なスケジューラの機能を持っている

  • 複数に分割されたデータ移行やETL処理を連携して実行できる
  • 意図した時間に実行できる
  • サイクリック実行も可能
  • エラーになった場合のアクションも設定可能

単なるスケジューラではなく、エラー時のアクションも設定できるのもいいですね。

オンプレの処理にも使える

  • Task RunnerというJavaのプログラムをインストールするだけで、オンプレのサーバだとしてもData Pipelineで扱うことができるようになる

これでクラウドでもオンプレでもデータ移動などができるようになるんですね。

ユースケース

図をお借りします。
既存のRDBからRedshiftにデータを投入するパターンということです。
image.png

  • 既存のRDBからはS3に対してソースデータをエクスポート
  • Redshiftのテーブルに合わせて変換と加工
  • 最終的にRedshiftにインポート

いったんまとめからの追加

  • データの変換と加工については、別途プログラミングが必要
  • 自前で開発したプログラムをData Pipelineで実行可能
  • エラー時のアクションも設定可能
  • Task RunnerというJavaのプログラムをインストールしてオンプレで利用する

ちょっとコンソールを覗いてみる

実際に試すのは次の機会として、コンソールだけチラ見してみます。

パイプラインの設定
image.png

処理のテンプレート
image.png

スケジュールの設定
image.png

パイプラインのログ設定かな?
image.png

IAMによるアクセス権限の設定
image.png

タグ
image.png

GUI
Step Functionを触ったことがあるのでとても親近感が沸きます
image.png

image.png

これだけ見ると、確かに簡単なデータ移動だけならノーコーディング & GUIでササっとできそうです。

まとめ

今回はAWS Data Pipelineの基本について勉強してみました。
何となく難しそうだと思っていましたが、簡単な処理の構築なら触れそうなサービスだということが分かりました。
今度は実際に触ってみる時間も作りたいと思います。

基本的な内容ですが、どなたかの参考になれば幸いです。
ご覧頂きありがとうございました!

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

【備忘録】Greengrass(V1)のMQTTサーバ証明書について

1 概要

Greengrass(V1)では、GreengrassデバイスがGreengrassコアデバイス(以下、コアデバイス)接続する際にグループ証明書を使っています。
Greengrassデバイスはデバイス証明書を用いてコアデバイスのMQTTサーバ証明書を検証します。
参考:AWS IoT Greengrass セキュリティの概要

コアデバイスのMQTTサーバ証明書はデフォルトの有効期限が7日間となっています。
有効期限が切れる前のタイミングでコアデバイスがIoT Greengrassサービス(クラウド側)に接続し、新たなMQTTサーバ証明書を取得します。
当然、このタイミングでクラウド側と接続できる必要があります。

MQTTサーバ証明書の有効期限はデフォルトの7日から30日まで変更できます。
ベストプラクティスは短い期間でのローテーションです。
※ただし、申請すれば31日以上にもできるとのこと
参考:AWS IoT Greengrass のデバイス認証と認可 - ローカル MQTT サーバーの証明書ローテーション

MQTTサーバ証明書の更新はマネジメントコンソールから手動でも可能です。
今回は触ってみた際の結果を残しておきます。

2 更新してみる

MQTTサーバ証明書を更新すると、MQTTサーバがいったん再起動するため、接続がいったん切断されます。
また、Greengrassデバイスはグループ証明書の再取得が必要になります。
今回は、AWS IoT Device SDK for PythonのSample実行時にどのような挙動をしたか備忘録として残します。
※サンプルコードの中身をまだ十分咀嚼できていないので、目に見える動きと試した手順を残すに留める

1.IoT Coreのマネジメントコンソールで左のメニューから Greengrass > クラシック(V1) > グループ の順にクリック
2.対象のグループをクリックし、設定 をクリック
image.png
3.「CAのローテーション」をクリックし、モーダルウィンドウで「今すぐローテーションと切断」をクリック
image.png
4.画面上部に「グループのCAが正常にローテーションされました」と表示されたら完了
image.png

3 結果

どのファイルが更新されているのか、ローテーション時に動いていたコアデバイス-Greengrassデバイス間のメッセージのやり取りがどうなっていたかの備忘録です。

更新されたファイル

ローテーションの実行は /greengrass/ggc/var/log/system/GGDeviceCertificateManager.log に記載がありました。

GGDeviceCertificateManager.log
[2021-03-29T21:17:54.888+09:00][INFO]-Message from cloud        {"topic": "$aws/things/Greengrass_Test_Core_20210308-gcm/shadow/update/delta"}
[2021-03-29T21:17:54.888+09:00][INFO]-New CertificateManagerService version: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
[2021-03-29T21:17:54.888+09:00][INFO]-Starting the workflow of Certificate generation

ファイルとしては、以下が更新されていました。

  • /greengrass/ggc/var/state/server/server.crt
  • /greengrass/ggc/var/state/server/server.key

グループ内でのMQTTのやり取り

今回は、AWS IoT SDK for Pythonの samples/greengrass にある basicDiscovery.py を実行しています。
GitHub:AWS IoT SDK for Python
※AWS IoT SDK for Pythonのインストールと basicDiscovery.pyの実行までの手順は以下を参照のこと
 モジュール 4: AWS IoT Greengrass グループでのデバイスの操作

MQTTサーバ証明書をローテーションする前のタイミングから、2台のGreengrassデバイス(ラズパイとMac)でそれぞれ以下を実施していました。

  • ラズパイ:MQTTメッセージを送り続ける
  • Mac:MQTTメッセージをサブスクライブし続ける

結果として、ローテーションのタイミングでいずれもいったん処理が止まりました。
ラズパイは少しの停止後、再度メッセージを送り続けていましたが、Mac側はサブスクライブは再開しませんでした。

なお、グループ証明書は basicDiscovery.py を実行したディレクトリ(カレントディレクトリで実行した)に groupCA/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx_CA_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.crt として取得されました。

4 おわりに

MQTTサーバ証明書のローテーション後、再接続、グループCAの再取得が必要になります。
サンプルコードでどのようにしているか整理し、次は自身でプログラムを書いてみようと思います。

5 参考文献(文中で登場していないもの)

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

AWS AmplifyでWebアプリケーションを作ってみた

背景

自己紹介

エンジニア1年目です。あと3日で2年目突入です(!)。1年間あっという間でした。AWSを使ったWebアプリケーションに興味を持っています。FacebookやTwitterのように世界中から利用されるうようなアプリを自分でも作ってみたいです。クラウドプラクティショナーの資格を持っています。SAAは先日受験しましたが落ちました。AWSは8ヵ月程度の経験があります。普段はEC2やEFSを使うことが多いです。

作成に関して

作成期間は15日です。最低限の実装はできたと思い、今回紹介することにしました。スタイルはbootstrapを使っているくらいでほとんど手をつけていません。今後の課題です。

苦労したこと

業務ではまったく違うことをしているのでWebアプリケーションの勉強は土日・帰宅後に取り組んでいます。帰宅後だとなかなか時間が取れず、その日の開発がハマって終わるのが辛かったです。アプリの開発もしたい、資格の勉強もしたいということでとにかく時間が足りないです。開発面では非同期処理にとても苦労しました。まだ理解が足りていない点が多いです。

今後の課題

  • 更新ボタンや戻るボタンを実装せずとも、ユーザー情報を保持できるようにする
  • ログアウト機能
  • スタイルを整える
  • 非同期処理の勉強
  • セキュリティについての基礎知識

構成図

image.png

どんなアプリか

URLはこちらになります。
https://www.irreg-yuta.com

用語メモアプリです。以下の機能を実装しました。

  • メモしたい用語を登録する
  • 登録した用語の一覧を表示する
  • 登録した用語の中から検索する

image.png

参考記事

本記事では引用していませんが、作成するにあたって参考にした記事です。

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

Red Hat OpenShift Service on AWS (ROSA) Walkthrough

はじめに

  • やっと ROSA(Red Hat OpenShift Service on AWS)がGAされました。
  • AWSのブログに以下文言がありましたが、OpenShiftが実家になりつつある人々にはGood newsなのです。
    • we are continually thinking about how we can make them feel at home on AWS.
  • 尚、以降の手順等はかなり適当に実行しているので、誤りやセキュリティ的な問題を抱えているものがあると思います。悪しからず。

ROSAとは

  • 詳細は、AWSのサイト、若しくは、Red Hatのサイトを参照しましょう。
  • 有り体に言えば、OpenShiftのControl PlaneやData Planeの運用・管理をAWSやRed HatのSREチームと共有できるサービスと理解しています。
  • 既にARO(Azure)やROKS(IBM Cloud)といった、Managed OpenShiftは世の中に出ており、ROSA(AWS)もこれらと同等のサービスなのでしょう。

ROSAのドキュメント

  • 前提条件
    • クラスタ作成に必要なIAM、SCP権限、アクセス要件、セキュリティ要件などが記載されています。
  • クイックスタート
    • クイックスタートを含む、ROSAのドキュメントリソースが詰まっていました。
  • 役割分担
    • Red Hat・AWSと利用者の役割分担のマトリクスが記載されています。

ROSAの前提条件

当該ページにはいくつか重要なことが記載されています。

  • ROSAのクラスターは、AWS Organizationのサブアカウント上でホストすることを推奨している
    • サブアカウントにはSCPが適用できるので、サブアカウント内で扱えるアクセスを許可を制限できるから(Red HatのSREチームのアクティビティを制限できるから)
    • Red HatのSREチームは、SCPを制御することはできない
  • ROSAのクラスターを管理するために必要なアクセス許可(AdministratorAccess)をRedHatに与える

お、おう。(汗
きっと、役割分担の話なのだろうけど、利用者は真面目にPolicy切らないと、いろんなリスクシナリオが出来上がっちゃいそうな気がするのです。規約みたいなものがあるのかな。

利用者側の前提条件

利用者側の前提条件が記載されています。(自分の理解を書いたので、誤りがあるかも)

  • Account

    • ROSAをサポートするのに十分なリソースが確保できる。
    • ROSAをデプロイするAWSアカウントはSCPが適用されたAWS Organizationに属している必要がある。
    • OrganizationやSCPは必須ではないけど、後述にリストされているすべてのアクションを実行できる権限を持っている。
    • AWSアカウントをRedHatに譲渡するような構成にしない。
    • SREチームの活動に対し、使用制限を課すことはできない。制限を課すと著しくサービスレベルが下がるため。
  • Access requirements

    • ROSAを適切に管理するには、RedHatがAdministratorAccessが適用された管理者ロールを持つ必要がある。
    • Red Hatは、AWSコンソールへのアクセスが必要となる。このアクセスは、RedHatによって保護および管理されている。
    • 利用者は、パーミッションを昇格させるためにROSA内でAWSアカウントを利用してはいけない。
      • (ちょっと意味がわからない。文字通りAWSアカウントの強い権限の行使が駄目なのか、Assume Roleが駄目なのか、SecretにAccess KeyやSecretを持つのが駄目なのか?)
    • ROSA CLI、または、OCMはAWSアカウントで直接実行してはいけない。
  • Support requirements

    • AWSのBusiness Supportに入ることを推奨とする。
    • Red Hatは、利用者に代わってAWS Supportをリクエストする権限を持つ。
    • Red Hatは、利用者に代わってAWSの上限緩和申請をリクエストする権限を持つ。
    • Red Hatは、特に指定されていない限り、AWSクラスター上のすべてのROSAを同じ方法で管理する。
  • Security requirements

    • ボリュームのスナップショットは、利用者が指定したAWSアカウント内、リージョン内に残る。
    • Red Hatは、許可されたIPアドレスからEC2、及び、APIへのアクセス権を持っている必要がある。
    • システムログと監査ログをRedHatが管理するログスタックに転送するアクセスが許可されている必要がある。

かなり強い権限、接点をRed HatのSREチームに許可しないといけないようです。

利用者側の必要な手順

続いて、利用者側での手順です。

AWS Organization管理下の既存、または、新規のAWSアカウントを用意する

AWS Organizationのドキュメントを参照しながら作成します。

image.png

Red Hatが必要なアクションを実行できるようにするために、SCPを作成する

SCPのドキュメントを参照しながら作成します。

image.png

適用するポリシーは以下の通りです。ガバガバだなあ、どこまで制限していいのだろう。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "autoscaling:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "elasticloadbalancing:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudwatch:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "events:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "support:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "sts:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "tag:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "route53:*"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "servicequotas:ListServices",
                "servicequotas:GetRequestedServiceQuotaChange",
                "servicequotas:GetServiceQuota",
                "servicequotas:RequestServiceQuotaIncrease",
                "servicequotas:ListServiceQuotas"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}

SCPをAWSアカウントに紐付ける

AWS Organization → アカウント → 作成したアカウントを選択します。
さらに、画面右部に表示されるメニューより、サービスコントロールポリシーを選択します。
そこで、先程作成したSCPをアタッチします。(Full-Accessはデタッチ必要?必要そうな気がする。)

image.png

Red Hatが使うIAM User

Red Hatは、以下のIAM Policy、IAM User、IAM Roleを作成し、管理をするとのことです。

  • IAM Policy
    • AdministratorAccessを利用
  • IAM User
    • osdManagedAdminを利用(勝手に作成される)

ROSAが作成するAWSリソース

ROSAの構成の概要は以下の通り。
結構派手に使いますね~。普段、ローカルでOpenShift動かしてヾ(´∀`)ノキャッキャしてる勢には辛い。

  • EC2
    • Three m5.xlarge minimum (control plane nodes)
    • Two m5.xlarge minimum (infrastructure nodes)
    • Two m5.xlarge minimum but highly variable (worker nodes)
  • EBS
    • Control Plane Volume
      • Size: 350GB
      • Type: io1
      • Input/Output Operations Per Second: 1000
    • Infrastructure Volume
      • Size: 300GB
      • Type: gp2
      • Input/Output Operations Per Second: 100
    • Worker Volume
      • Size: 300GB
      • Type: gp2
      • Input/Output Operations Per Second: 100
  • ELB
    • NLBが2つ(API用)、ELBが最大2つ(アプリ用)
  • S3
    • EBSのスナップショット用に使う
  • VPC
    • 1つのクラスタに対し、1VPC
    • Subnet
      • 1つのAZの場合は2つのSubnet。複数のAZの場合は6つのSubnet。
    • Router tables
      • PrivateのSubnet毎に、1つのRoute Table。更に1つのクラスタ毎に1つの追加のRoute Table。
    • Internet gateways
      • 1つのクラスタ毎に1つのIGW。
    • NAT gateways
      • PublicのSubnet毎に1つのNAT Gateway。
  • Security groups

image.png

環境のセットアップ

環境のセットアップをする。

Red Hat アカウントを作成する

ROSAのインストールに必要とのことです。アカウント作成手順は省略します(既に持っているので)。
アカウント作成後はこちらのURLからトークンを取得できます。

ROSAを有効化する

Organizationで作成したAWSアカウントのROSAにアクセスし、Enable OpenShiftをクリックします。
有効化後は以下の表示になります。

image.png

AWS CLIをセットアップする

CloudShell上でAWS CLIをセットアップしていきます。ドキュメントはこちらを参照のこと。
ただ、ここで使用するIAM Userに紐づくIAM Policyなどの指示が無い気がします。ここでは適当にAdministratorAccessを持つIAM Userを利用することとします。

$ aws configure
AWS Access Key ID [None]: ...snip...
AWS Secret Access Key [None]: ...snip...
Default region name [None]: ap-northeast-1
Default output format [None]: json
$ aws sts get-caller-identity
{
    "UserId": "...snip...",
    "Account": "...snip...",
    "Arn": "arn:aws:iam::...snip...:user/rosaCli"
}

ROSA CLIをインストールする

curlでダウンロードして、展開する。

$ curl -OL https://mirror.openshift.com/pub/openshift-v4/x86_64/clients/rosa/latest/rosa-linux.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 14.8M  100 14.8M    0     0  2350k      0  0:00:06  0:00:06 --:--:-- 3284k
$ sudo tar -zxvf rosa-linux.tar.gz -C /usr/local/bin/
rosa
$ rosa
Command line tool for Red Hat OpenShift Service on AWS.

Usage:
  rosa [command]

Available Commands:
  completion  Generates bash completion scripts
  create      Create a resource from stdin
...snip...

前提条件等の確認

十分な権限を持っているかを確認します。

$ rosa verify permissions
I: Validating SCP policies...
I: AWS SCP policies ok

十分なサービスクオータがあるかを確認します。

$ rosa verify quota --region=ap-northeast-1
I: Validating AWS quota...
E: Insufficient AWS quotas
E: Service ec2 quota code L-1216C47A Running On-Demand Standard (A, C, D, H, I, M, R, T, Z) instances not valid, expected quota of at least 100, but got 5

EC2インスタンスのクオータ設定が少なすぎるようでした...。

image.png

上限緩和申請後に、リトライします。

$ rosa verify quota --region=ap-northeast-1
I: Validating AWS quota...
I: AWS quota ok

rosaコマンドでログインします。ここのトークンは先程Red Hatのサイトから取得したものを使います。

$ rosa login --token="\
eyJ ...snip..."
I: Logged in as 'rh-rosa-user' on 'https://api.openshift.com'

Red HatとAWSの認証情報がセットアップされていることを確認します。

$ rosa whoami
AWS Account ID:               ...snip...
AWS Default Region:           ap-northeast-1
AWS ARN:                      arn:aws:iam::...snip...:user/rosaCli
OCM API:                      https://api.openshift.com
OCM Account ID:               ...snip...
OCM Account Name:             ...snip...
OCM Account Username:         1ksen
OCM Account Email:            ...snip...@...snip...
OCM Organization ID:          ...snip...
OCM Organization Name:        ...snip...
OCM Organization External ID: ...snip...

良い感じですね。

初期化処理

ここまでで、準備は一通り完了です。いざ、初期化処理の実行へ。

$ rosa init
I: Logged in as '1ksen' on 'https://api.openshift.com'
I: Validating AWS credentials...
I: AWS credentials are valid!
I: Validating SCP policies...
I: AWS SCP policies ok
I: Validating AWS quota...
I: AWS quota ok
I: Ensuring cluster administrator user 'osdCcsAdmin'...
I: Admin user 'osdCcsAdmin' created successfully!
I: Validating SCP policies for 'osdCcsAdmin'...
I: AWS SCP policies ok
I: Validating cluster creation...
I: Cluster creation valid
I: Verifying whether OpenShift command-line tool is available...
W: OpenShift command-line tool is not installed.
Run 'rosa download oc' to download the latest version, then add it to your PATH.

このrosa initの処理では、CloudFormationのテンプレートが実行されているとのこと。
一応内容を確認しますが、rosa whoamiで、ap-northeast-1を指定しているのに、CFnのStackはus-east-1で作成されていました。
IAMに関するStackって、ap-northeast-1からでも作れなかったっけ。まあ、いっか。
内容自体はAdministratorAccessのPolicyを要求するosdCcsAdminというIAM Userが作成されています。(IAM User)

$ aws cloudformation describe-stacks --region us-east-1
{
    "Stacks": [
        {
            "StackId": "arn:aws:cloudformation:us-east-1:...snip...:stack/osdCcsAdminIAMUser/...snip...",
            "StackName": "osdCcsAdminIAMUser",
            "CreationTime": "...snip...",
            "RollbackConfiguration": {},
            "StackStatus": "CREATE_COMPLETE",
            "DisableRollback": false,
            "NotificationARNs": [],
            "Capabilities": [
                "CAPABILITY_IAM",
                "CAPABILITY_NAMED_IAM"
            ],
            "Tags": [],
            "DriftInformation": {
                "StackDriftStatus": "NOT_CHECKED"
            }
        }
    ]
}
$ aws cloudformation get-template --stack-name osdCcsAdminIAMUser --region us-east-1
{
    "TemplateBody": {
        "Resources": {
            "osdCcsAdmin": {
                "Type": "AWS::IAM::User",
                "Properties": {
                    "ManagedPolicyArns": [
                        "arn:aws:iam::aws:policy/AdministratorAccess"
                    ],
                    "UserName": "osdCcsAdmin"
                }
            }
        }
    },
    "StagesAvailable": [
        "Original",
        "Processed"
    ]
}

ocコマンドのセットアップ

rosaコマンドからダウンロードできるようです。

$ rosa download oc
I: Verifying whether OpenShift command-line tool is available...
W: OpenShift command-line tool is not installed.
Run 'rosa download oc' to download the latest version, then add it to your PATH.
I: Downloading https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-client-linux.tar.gz
Downloading... 24 MB complete      
I: Successfully downloaded openshift-client-linux.tar.gz
$ ls
openshift-client-linux.tar.gz  rosa-linux.tar.gz
$ sudo tar zxvf openshift-client-linux.tar.gz -C /usr/local/bin/
README.md
oc
kubectl
$ rosa verify oc
I: Verifying whether OpenShift command-line tool is available...
I: Current OpenShift Client Version: 4.7.3

ROSA Clusterの作成

クラスタを作成します。
ドキュメントの例では15文字以上のcluster-nameを指定しているのに、実際は通らないです。

$ rosa create cluster --cluster-name=rosa-poc-cluster1
E: Cluster name must consist of no more than 15 lowercase alphanumeric characters or '-', start with a letter, and end with an alphanumeric character.
$ rosa create cluster --cluster-name=rosa-poc-1
I: Creating cluster 'rosa-poc-1'
I: To view a list of clusters and their status, run 'rosa list clusters'
I: Cluster 'rosa-poc-1' has been created.
I: Once the cluster is installed you will need to add an Identity Provider before you can login into the cluster. See 'rosa create idp --help' for more information.
I: To determine when your cluster is Ready, run 'rosa describe cluster -c rosa-poc-1'.
I: To watch your cluster installation logs, run 'rosa logs install -c rosa-poc-1 --watch'.
Name:                       rosa-poc-1
ID:                         ...snip...
External ID:                
OpenShift Version:          
Channel Group:              stable
DNS:                        rosa-poc-1....snip....openshiftapps.com
AWS Account:                ...snip...
API URL:                    
Console URL:                
Region:                     ap-northeast-1
Multi-AZ:                   false
Nodes:
 - Master:                  3
 - Infra:                   2
 - Compute:                 2 (m5.xlarge)
Network:
 - Service CIDR:            172.30.0.0/16
 - Machine CIDR:            10.0.0.0/16
 - Pod CIDR:                10.128.0.0/14
 - Host Prefix:             /23
State:                      pending (Preparing account)
Private:                    No
Created:                    ...snip...
Details Page:               https://cloud.redhat.com/openshift/details/...snip...

尚、オプション指定せずに実行すると、Single-AZの構成となるみたいです。
オプションは多く受け付けられるようになっており、本番向けには設計しないとですね。

$ rosa create cluster --help
Create cluster.

Usage:
  rosa create cluster [flags]

Examples:
  # Create a cluster named "mycluster"
  rosa create cluster --cluster-name=mycluster

  # Create a cluster in the us-east-2 region
  rosa create cluster --cluster-name=mycluster --region=us-east-2

Flags:
  -c, --cluster-name string           Name of the cluster. This will be used when generating a sub-domain for your cluster on openshiftapps.com.
...snip...

クラスタの構築には40分程度かかるみたい。
rosa describe clusterコマンドで確認できます。
※ドキュメントには-cのオプション記載が無いが、実際は必要でした。

$ rosa describe cluster -c rosa-poc-1
Name:                       rosa-poc-1
ID:                         ...snip...
External ID:                ...snip...
OpenShift Version:          
Channel Group:              stable
DNS:                        rosa-poc-1....snip....openshiftapps.com
AWS Account:                ...snip...
API URL:                    
Console URL:                
Region:                     ap-northeast-1
Multi-AZ:                   false
Nodes:
 - Master:                  3
 - Infra:                   2
 - Compute:                 2 (m5.xlarge)
Network:
 - Service CIDR:            172.30.0.0/16
 - Machine CIDR:            10.0.0.0/16
 - Pod CIDR:                10.128.0.0/14
 - Host Prefix:             /23
State:                      installing 
Private:                    No
Created:                    ...snip...
Details Page:               https://cloud.redhat.com/openshift/details/...snip...

ふと、us-east-1のEC2インスタンスを見たところ、クラスタ作成時に何かが作られた形跡があります。bootstrap的な何かなんだろうけど、特定リージョンしか許可されていないOrganization Unitなら悲しい気持ちになりそう?

$ aws ec2 describe-instances --region us-east-1
{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-000db10762d0c4c05",
...snip...

ROSA Clusterへのアクセス

40分後、再度rosa describe clusterコマンドで確認します。

$ rosa describe cluster -c rosa-poc-1 | grep State:
State:                      ready

rosa create adminコマンドで、ログインパスワードの払い出しをします。
尚、この手順の実行前にIdPやLDAPとの統合をおすすめされています。真面目に作るときは適用しましょう。

$ rosa create admin -c rosa-poc-1
W: It is recommended to add an identity provider to login to this cluster. See 'rosa create idp --help' for more information.
I: Admin account has been added to cluster 'rosa-poc-1'.
I: Please securely store this generated password. If you lose this password you can delete and recreate the cluster admin user.
I: To login, run the following command:

   oc login https://api.rosa-poc-1....snip....openshiftapps.com:6443 --username cluster-admin --password ...snip...

I: It may take up to a minute for the account to become active.

oc loginします。

$ oc login https://api.rosa-poc-1....snip....openshiftapps.com:6443 --username cluster-admin --password ...snip...
$ oc whoami
cluster-admin

Web Consoleへもアクセスしてみます。

$ rosa describe cluster -c rosa-poc-1 | grep Console
Console URL:                https://console-openshift-console.apps.rosa-poc-1.xcfa.p1.openshiftapps.com

ブラウザでアクセスすると、以下の通り。SREチームもここから入ってくるのね。

image.png

先程のrosa create adminで作成されたcluster-adminでログインします。

image.png

なんとかなったね?

ROSA Clusterの削除

個人でお試しするにはお財布に厳しいのでrosa delete clusterコマンド、rosa initコマンドで削除します。グッバイ?

$ rosa delete cluster --cluster=rosa-poc-1 --watch
? Are you sure you want to delete cluster rosa-poc-1? Yes
I: Cluster 'rosa-poc-1' will start uninstalling now
W: Logs for cluster 'rosa-poc-1' are not available
...snip...
$ rosa init --delete-stack
I: Logged in as '1ksen' on 'https://api.openshift.com'
I: Validating AWS credentials...
I: AWS credentials are valid!
I: Deleting cluster administrator user 'osdCcsAdmin'...
I: Admin user 'osdCcsAdmin' deleted successfully!

ROSAがGAされました

また、時間あるときに触ってみよう。以下はメモです。

  • 簡単にOpenShiftのクラスタのセットアップが可能。しかもRed HatのSREチームが面倒を見てくれるし、on EC2より安い!
  • 組織のポリシーと設計を踏まえた事前の仕込み(SCPの折り合い、`rosa create clusterの引数)が非常に大変そう。
  • 恐らく、事前の仕込みを捗らせるには、役割分担の理解が重要になりそう。
  • ROSAが持っている権限を用いるアプリケーションアーキテクチャの場合、SREの権限でs3覗けたり、鍵消せたりしちゃう気がするのだけど、このへんのPolicy設計どうするのだろう。

おしまい。

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

AWS主要サービス概要

はじめに

今回、普段利用しているAWSについて一から勉強し直すことにしました。
それに伴い、自分なりにまとめた内容をここにまとめていきます。

そもそもAWSとは

AWSサービス開始までの経緯

AWS(Amazon Web Service)は、Amazon社が提供するクラウドサービスです。
amazon_dkblue_noto_email_v2016_jp-main._CB462229751_.png
元々、Amazon社が自社のサイト、Amazonがどんどん大きくなり、世界有数のECサイトへと成長しました。
しかし、成長する上でさらなるビジネス課題が生まれました。

  • リコメンド等で活用するために、過去の注文履歴を保存しておきたい。
  • Amazonアソシエイト(アフィリエイト)プログラムの支払い計算の遅延

これらの他にもビジネスが成長する過程で様々な課題が生まれました。

これらの課題を解決するために、Amazon社は自前でクラウド上でのコンピューティングサービスやサーバを自社のためだけでなく、一般向けにサービスとして提供することとなりました。
こういった経緯で2006年にオンラインストレージのAmazon Simple Storage Service(S3)と、仮想コンピュータであるAmazon Elastic Compute Cloud(EC2)をもって、AWSがサービス開始されました。
*AWSとしてのサービス開始以前にキューサービスであるAmazon Simple Queue Service(SQS)が2004年に開始されています。
1614968575107.jpeg

*クラウドコンピューティング(Wikipediaより)
「クラウド(クラウドサービス、クラウドコンピューティング)」とは、クラウドサービスプラットフォームからインターネット経由でコンピューティング、データベース、ストレージ、アプリケーションをはじめとした、さまざまな IT リソースをオンデマンドで利用することができるサービスの総称です。クラウドサービスでは、必要なときに必要な量のリソースへ簡単にアクセスすることができ、ご利用料金は 実際に使った分のお支払いのみといった従量課金が一般的です。

クラウドコンピューティングのサービス形態

クラウドコンピューティングサービスにも様々な形態があります。
左から、オンプレミス、IaaS、PaaS、SaaSといったように分かれます。
iaas-paas-saas-comparison-1024x759.jpg

オンプレミス

自身で物理的にサーバを用意し、ネットワークからアプリケーションまで全て自前で用意する形態。
個人で導入するにはハードルが高い。

IaaS(Infrastructure as a Service)

仮想サーバやストレージ等のリソースをインターネット経由で提供するサービス形態。
ユーザーはOSより上のレイヤーを管理する必要があります。
物理的なハードウェアを用意する必要がないため、オンプレミスより導入コストが低い傾向にあります。

AWSでのサービス例) EC2

PaaS(Platform as a Service)

データベースやアプリケーションサーバなどのミドルウェアを提供するサービス形態。
IaaSよりも管理する範囲が狭くなり、アプリケーションやデータのみを管理すれば良くなるため、サーバなどのインフラなどを気にすることなく、アプリケーション開発に集中することができます。
OSを管理する必要がないため、セキュリティソフトなどの管理コストも不要となります。

AWSでのサービス例) Lambda、Fargate(サーバレス構成)

SaaS(Software as a Service)

ソフトウェアやアプリケーションの機能をインターネット経由で提供するサービス形態。

サービス例)DropBox、SalesForce、Gmail等
AWSでのサービス例) S3、CloudWatch

今回は、AWSの主要サービスである下記の4サービスについてまとめます。

  • VPC
  • EC2
  • IAM
  • RDS

VPC

まずは、AWSにおいて最初に学ぶべきサービスの一つであるVPCについてです。
VPCとはAmazon Virtual Private Cloudの略で、仮想的なプライベートネットワークを構築できるサービスです。
セキュリティやAWSの全てのサービスに関連してくるものです。

VPCの説明に入る前に、AWSにおける大事な用語であるリージョンアベイラビリティゾーンエッジロケーションについて記載します。

リージョン

AWSがサービスを提供している拠点(国と地域)のことを指します。(下記の画像のオレンジの円が該当します。)
2021年3月現在では、24の国・地域にリージョンが展開されています。
日本にはこれまで東京リージョンと大阪ローカルリージョンが展開されていました。
ローカルリージョンとは、後述するアベイラビリティゾーンが通常のリージョンには複数存在しているのに対し、
ローカルリージョンはアベイラビリティゾーンが1つしか展開されていません。

*2021年3月2にAWSはこの大阪ローカルリージョンを通常のリージョンに格上げすると発表しました。
これで国内に2つ目となるリージョンが開設されます。

アベイラビリティゾーン

アベイラビリティゾーン(AZ)はAWSが保有するデータセンターです。
前述したとおり、1つのリージョンに複数のAZで構成されています。
東京リージョンには4つのAZ、大阪には3つのAZが用意されており、各AZ間は専用のネットワーク回線で接続されています。
これらの複数のAZを利用した構成をマルチAZ構成と言い、可用性や耐障害性の観点からマルチAZ構成を取ることが推奨されています。

エッジロケーション

エッジロケーションはエッジサーバが存在する地域のことを指します。(下記の画像の青の円が該当します。)
CDNサービスであるCloudFrontやRoute53、AWSWAFで用いられ、コンテンツがキャッシュされる際に用いられます。
日本には、東京と大阪に存在します。

参考:AWSグローバルインフラストラクチャ
APAC-500x500.38f6af1de451c38375681fa35bbeee3d81f6ff88.png

また、VPCについて話す上で必要となるIPアドレスサブネット等のインフラの基本的な知識に関しましては、今回は割愛させていただきます。
ざっくり、
IPアドレス → インターネットにつながっている機器の住所
サブネット → 大きなネットワークを小さい単位で分けて管理しやすくするためのネットワーク
と考えていただければいいかと思います。

また、先にVPCのおいて重要となる単語について軽く説明致します。

ルートテーブル

  • サブネットに関連付けて使用します。
  • サブネットから外に出る通信をどこに向けるかを管理するルール・定義です。
  • ルートと呼ばれるルールで構成されます。
  • 最も明確なルールが優先的に適用されます。
  • 下記の例では10.0.0.0/21のVPC内の通信が優先され、それ以外の通信はインターネットに飛びます。 スクリーンショット 2021-03-18 8.54.15.png

インターネットゲートウェイ

  • VPC内のAWSリソースとインターネットを繋げる役割になります。
  • 負荷が高くなった場合も、自動でスケールするため可用性が高い。
  • サブネットのルートテーブルにて設定し、使用します。
  • 上記のルートテーブルのようにVPC内以外の通信(デフォルト)の宛先が指定されているゲートウェイをデフォルトゲートウェイと呼ぶ
  • デフォルトゲートウェイにインターネットゲートウェイが設定されているサブネットをパブリックサブネット、デフォルトゲートウェイにインターネットゲートウェイが設定されていないサブネットをプライベートサブネットと呼びます。

NATゲートウェイ

  • インターネットに接続ができないプライベートサブネットからインターネット接続を可能にするためのゲートウェイ
  • アウトバウンドは可能だが、インバウンドはできない
  • 自動でスケールするため可用性が高い

ENI(Elastic Network Interface)

  • 仮想ネットワークインタフェース
  • EC2インスタンスのIPアドレスはENIに付与される
  • 同じAZ内のインスタンスにアタッチ・デタッチすることが可能

ElasticIPアドレス

  • インスタンスにアタッチ・デタッチが可能
  • インスタンスが再起動・停止・終了しても変更されない、静的なパブリックIPアドレス

セキュリティグループ

  • AWSの仮想ファイアウォールサービス
  • より広い範囲のルールが適用される
  • インバウンド・アウトバウンドが設定可能
  • 適用範囲はサブネット単位ではなく、インスタンス(ENI)単位で適用
  • アウトバウンドの返りの通信を考慮する必要がない(ステートフルインスペクション型)

ネットワークACL

  • サブネット単位で設定するファイアウォール
  • ルールは番号で管理され、番号が小さい順で評価される。
  • アウトバウンドの戻りは考慮されない(ステートレスインスペクション型)
  • セキュリティグループの補助的な利用方法が推奨されています。

vpc_diagram.png

上記のような構成の場合、インターネットゲートウェイがアタッチされている10.0.0.0/24のサブネットはパブリックサブネットと呼ばれ、インターネットに接続可能なサブネットとなります。
インターネットゲートウェイがアタッチされていない10.0.2.0/24のサブネットはプライベートサブネットと呼ばれ、インターネット接続が不可能となります。

プライベートサブネットにはセキュリティレベルが高いものを配置するのが良いとされています。
上記の例ではEC2インスタンスを配置していますが、データベースなどを配置します。

プライベートサブネットに配置されているリソースにアクセスするためには、パブリックサブネットにあるEC2インスタンスAに一度ログインした後に、インスタンスAからプライベートサブネットのリソースにログインします。このログインの方法を踏み台、インスタンスAを踏み台サーバと呼びます。

EC2

EC2(Elastic Compute Cloud)とは、AWSが提供する仮想サーバです。
仮想サーバとは、AWSが管理するデータセンター(サーバ)上に個別に利用する論理的なサーバを作成し、利用することです。
上記に記載した、リージョン・AZから自身が利用するエリアを選択し、そこへEC2インスタンスを起動させて利用します。

EC2の料金は、リージョンや後述するインスタンスタイプによって異なるので、公式サイトで確認するようにしてください。

EC2を起動させるにあたって、利用用途にあったサーバを選択する必要があります。
どういった種類があるかを紹介していきます。

AMI

AMI(Amazon Machine Image)はEC2インスタンス作成時に必要な情報となります。
EC2作成時にAMIを指定し、EC2インスタンスを作成します。
このAMIにOSの情報が含まれています。
EC2では、AWS特有のAmazonLinuxを始め、CentOSやWindowsServerなど様々なOSが利用可能です。
*最近では、EC2のOSにMacOSが登場したことでも話題になりました。
スクリーンショット 2021-03-24 12.51.06.png

AMIではOSのみならず、ソフトウェアが含まれているAMIも利用できます。
AMIにWordPressが含まれており、すぐにブログが開設できたりもします。
wp.png

インスタンスタイプ

AMIにて、OSを決めたらこれらを起動するサーバのスペックを選定します。
EC2において、CPUの処理速度やメモリサイズ等のスペックを決める物がインスタンスタイプです。
代表的な例として、無料枠で利用できる下記のt2.microで記載致します。
無題のプレゼンテーション.jpeg

  • t:ファミリー名
  • 2:世代番号
  • micro:インスタンスサイズ

インスタンスタイプを表す文字にはそれぞれ、上記のような意味合いがあります。
ファミリー名は後述します。
基本的には、世代番号は大きいもの、インスタンスサイズは利用用途にあったものを選択しましょう。

では、下記にインスタンスタイプの種類についてざっくり記載します。

t3系 テスト向き

スクリーンショット 2021-03-23 8.47.31.png
t系インスタンスはCPUバーストが可能な汎用インスタンスタイプです。
基本的にテスト環境・開発環境で利用するケースが多いです。
t3系インスタンスにはt3とt3aがありますが、t3はCPUがIntel社製、t3aはCPUがAMD製で10%ほど安価といった特徴があります。

M系 汎用タイプ

スクリーンショット 2021-03-24 8.37.21.png
M系は汎用タイプのインスタンスタイプです。
バランスの取れた、CPUやメモリとなっており、インスタンスタイプで迷った場合は、こちらを選択しておけばいいといったタイプ。

C系 コンピューティング最適化

スクリーンショット 2021-03-24 8.40.36.png
C系はCPUの性能を要する処理に最適化されています。
処理が多いWebサーバや、モデリング、機械学習等に向いています。

R系 メモリ最適化

スクリーンショット 2021-03-24 8.54.46.png
R系はメモリを要する処理に向いているタイプとなります。
高いパフォーマンスが必要なデータベースや、ビッグデータを扱う処理に向いてます。

P系 高速コンピューティング

スクリーンショット 2021-03-24 9.05.56.png
一番の特徴はGPUがついていることです。
3DCGやグラフィックに関連する処理に用いられます。
上記の処理以外にも、機械学習やデータマイニングに向いています。

H系 ストレージ最適化

スクリーンショット 2021-03-24 12.41.47.png
H系はストレージ最適化のタイプとなります。
ストレージの高性能なディスクスループット(読み書き速度)が特徴となります。
16TBの大容量ストレージを利用することも可能です。

EBS

EBS(Elastic Block Store)は、EC2にアタッチして使用する外付けディスクです。
種類に応じてIOPS(読み書き性能)が異なる。
スナップショット(バックアップ)が取得可能です。
*異なるAZに配置されたEC2にEBSをアタッチすることは不可能

タイプ 種類 説明
SSD 汎用 SSD EC2作成時にデフォルトで作成される。
SSD プロビジョンド IOPS SSD 汎用SSDより性能が良い。課金して読み書き性能を自身で指定することができる。
HDD スループット最適化 HDD ビッグデータ等を溜め込むためのデータウェアハウスとしての利用に向いている。SSDに比べ安価。
HDD Cold HDD 保管用。利用頻度が低いデータの保管に利用される。スループット最適化HDDよりも安価。

IAM

IAM(Identity and Access Management)とは、AWSにおける権限管理を行うためのサービスとなります。
まずはIAMにおけるユーザー管理について記載します。

IAMユーザー

AWSを利用するために、最初に作成する際にメールアドレス、パスワード、クレジットカード情報、連絡先情報を登録しアカウントを作成します。
この時にメールアドレスとパスワードを用いてログインするアカウント(ユーザー)のことをルートユーザーと呼びます。
ルートユーザーは全てのAWSリソースに対してフル権限、請求情報の閲覧可能、パスワードの変更が可能といったように、全ての作業を実行できるアカウントとなってます。
但し、ルートユーザーは日常の作業では利用しないようにAWS公式からも推奨されています。

では、どういったユーザーでAWS上で作業を行うかです。

ここで出て来るのが、IAMユーザーです。
IAMユーザーとはAWSアカウントの範囲内で個別に作成し利用するユーザーです。
最初に作成した、ルートユーザーから個別のIAMユーザーを作成し、それぞれのIAMユーザーに必要なだけの権限を付与し作業を行います。
この際に作業担当(開発・テスト・運用)ごとに必要な権限を最小に抑えることで、ミスを防ぎセキュリティレベルを上げることが推奨されています。
この権限を最小に抑えることを最小権限の原則という形でAWSのベストプラクティスとしています。

*AWS環境構築におけるベストプラクティス集のことをAWS Well-Architected フレームワークという形で公開されていますので、一度目を通すのがいいかと思います。
AWS_WA_TripleHexagon.png

IAMユーザーは人が利用するものに限らず、プログラムが利用する場合もあります。

  • 人が利用する場合は、マネジメントコンソールへログインするためのパスワードをします。
  • プログラムが利用する場合は、アクセスキー・シークレットアクセスキーを利用してプログラムからAWSリソースにアクセスします。

AWSマネジメントコンソール
Polaris Console Home.6f773790a19ed7c9a37fcfeddb09076cc52a44e8.png

アクセスキーを利用するとどこからでもAWSのリソースの操作が可能となります。
アクセスキーが悪意のある他人に流出して、知らない間に数万〜数十万の請求が来たといった話もよく見かけます。
アクセスキーなんか流出しないだろうと思われるかもしれませんが、よく聞く原因として、
アクセスキーをプログラムのコードにベタ書きして、gitの公開されているリポジトリに上げるといったケースが多いようです。
こうならないように、自分は大丈夫とは思わず日頃から本当に公開していいコードかということを気を付けましょう。

IAMグループ

複数のIAMユーザーをまとめ、管理しやすくするためのものです。
IAMユーザーはそれぞれに認証情報を持っているが、IAMグループは正式な認証情報ではありません。

IAMポリシー

AWSリソースを操作できる権限を表したものです。
下記の画像のようにJSON形式の設定ファイルで記述されます。
スクリーンショット 2021-03-27 1.58.14.png
認証主体(Identity)にアタッチして利用します。
IAMポリシーには管理ポリシーとインラインポリシーがあります。

  • 管理ポリシー
    • 管理ポリシーはIAMユーザーやIAMロールにアタッチして利用する独立したIAMのポリシー機能です。
    • 管理ポリシーには更にAWS管理ポリシーとカスタマー管理ポリシーに分かれます。
      • AWS管理ポリシー
        • あらかじめAWS側で用意されているポリシーです。
        • フルアクセス権限や、サービス毎のリードオンリー権限等が用意されています。
        • AWS側で管理されているポリシーのため、サービス追加・更新に伴い自動でポリシーが更新されることがあります。
      • カスタマー管理ポリシー
        • ユーザー側で自由に作成・設定ができるポリシーです。
        • 細かい設定を行う場合には、こちらのポリシーを利用しましょう。
  • インラインポリシー
    • 特定のIAMユーザー、IAMグループ、IAMロールに直接付与するポリシーです。
    • 基本的には管理ポリシーを利用しますが、特定のユーザーにのみ権限を付与したい場合はインラインポリシーを使います。

IAMロール

IAMポリシーをアタッチして使用します。
IAMロールは複数のIAMポリシーをまとめてアタッチし、権限管理を行います。
スイッチロールという機能を利用することで、別アカウントのAWSリソースの利用が可能となります。

IAM関連の用語について

・アイデンティティ(Identity、ID)
AWSリソースの内、IAMポリシーを割り当てる事ができるもの。
identity.png

・エンティティ
AWSが認証に利用するリソース

・プリンシパル
AWSリソースにリクエストを出すもの
(IAMグループは正式なプリンシパルではない。)
prin_ent.png

参考資料

RDS

マネージド型データベースサービス
上記、「クラウドコンピューティングのサービス形態」の図のPaasが該当します。
利用するデータベースのアプリケーション・データのみの管理で利用することができます。

下記にRDSの特徴を一部抜粋して記載致します。

選べるデータベースエンジン

RDSでは利用可能なデータベースエンジンが用意されており、ケースに合わせて適切なデータベースエンジンを選択することができます。
AWSが提供しているAuroraを始め、オープンソースのMySQLや商用であるORACLEなども選択可能です。

スクリーンショット 2021-03-29 17.53.31.png

AWSでは、MySQLやPostgreSQLと互換性があり、MySQLの5倍のスループットが実現可能なAuroraを推奨しています。

マスター - スレーブ構成

マスター - スレーブ構成は、メインで利用するマスターのインスタンスとサブ的な扱いのスレーブを別のAZへ配置する構成です。
マスターのデータを更新した際に、リアルタイムで更新内容をスレーブへ複製(レプリケーション)します。
また、RDSへのアクセスをIPアドレスではなく、エンドポイントでアクセスすることで、マスターに障害を検知した場合でも接続先を自動的にスレーブの方へ更新されます。
この構成を取ることで可用性を高めることができます。
master-slave.png

リードレプリカ

リードレプリカは、参照・読み込み用のインスタンスと、更新のインスタンスを分けることで、マスターへの負荷を軽減させようという構成です。
read_replica.png

その他

スナップショット

定期スナップショットや、手動でのスナップショットを取得することにより、データを保護します。

パッチ当て機能

時間指定をしてパッチを当てる時間をコントロールし、自動でパッチを適用できます。

パラメータ設定

パラメータグループを使って設定値を変える事ができます。

あとがき

AWSの基本的なサービスについて、ざっくり書くつもりでしたが、思っていた以上に長くなってしまいました。
今回記載したサービスについても、まだまだ書ききれていない機能やサービスがあります。
まだ知らない機能等については、構築・削除が簡単にできるというクラウドサービスの特徴を活かし、学んでいきたいと思います。

他サービスや、今回記載したサービスについても別途記事を書いていきたいと思いますので、間違っている点等がございましたらご指摘いただけますと幸いです。
ここまで読んでいただき、ありがとうございました。

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

室内の温度と湿度をDynamoDBに書き込む

HiLetgo ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモードの記事で ESP32ボードの動作確認ができました。今度は、室内の温度と湿度をAWS IoTを使って、DynamoDBに書き込んでみました。温度と湿度の取得にはDHT22センサを使用しました。

MySokuteiESP32.png

Building an AWS IoT Core device using AWS Serverless and an ESP32の記事を参考に、

  • ESP32から室温と湿度をパブリッシュする機能を追加
  • 外部から送信された任意のメッセージをESP32でサブスクライブする機能は省略

しました。

なお、AWSアカウントは開設済みで、AWSコンソールには AdministratorAccess のポリシーがアタッチされたIAMユーザでログインしていることが前提です。使用する Serverless Application Repository の lambda-iot-rule でデプロイされる DynamoDB は、Read/write capacity mode が On-demand になっているため、FreeTier 対象外と思われます(AWS料金を確認のこと)。

IoTデバイスの作成

  1. AWSコンソールの AWS IoTManage > Things を開き、Create > Create a single thing を選ぶ。
  2. MySokuteiESP32 と Name フィールドに入力し、他はデフォルトのままにして Nextを選ぶ。
  3. Create certificateを選ぶ。ESP32での接続に a certificate for this thing、a private key、Amazon Root CA1 のダウンロードが必要。ダウンロードしたらセキュアな場所に保存しておく。
  4. ActivateAttach a policy をクリックする。
  5. ポリシーの追加はスキップして、Register Thing をクリックする。
  6. AWS IoT のサイドメニューから Secure > Policies を選び、Create をクリックする。
  7. SokuteiPolicyName フィールドに入力し、Advanced mode を選ぶ。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "iot:Connect",
          "Resource": "arn:aws:iot:REGION:ACCOUNT_ID:client/MySokuteiESP32"
        },
        {
          "Effect": "Allow",
          "Action": "iot:Publish",
          "Resource": "arn:aws:iot:REGION:ACCOUNT_ID:topic/esp32/pub"
        }
      ]
    }
    
  8. REGION には使っているリージョン名を入れる(東京リージョンなら、ap-northeast-1)。リージョン名は、AWSコンソールの右上で確認できる。

  9. ACCOUNT_ID を自分のものに変更する。Account Settings で確認できる。

  10. Create をクリックする。

  11. AWS IoT のサイドメニューから Secure > Certificates を選ぶ。そして、いま作成した証明書を選び、Actions > Attach policy を選ぶ。

  12. SokuteiPolicy にチェックを入れて、Attatch をクリックする。

ここまででESP32をAWS IoTに接続するためのAWSコンソールでの設定が完了。トピック esp32/pub にパブリッシュが可能である。

Arduino IDEの設定

  1. Arduino IDEを起動する。
  2. スケッチ > ライブラリをインクルード > ライブラリを管理 を選ぶ。
  3. MQTT を検索し、Joel Gaehwiler の最新バージョンをインストールする。
  4. 同様に ArduinoJson もインストールする。

ESP32の設定

  1. Arduino IDE で ファイル > 新規ファイル を選ぶ。
  2. 新規タブ を選び、新規ファイルの名前secrets.h を入力し、OKをクリックする。
  3. 以下の secrets ファイルをペーストする。

    #include <pgmspace.h>
    #define SECRETS
    #define THINGNAME ""
    
    const char WIFI_SSID[] = "";
    const char WIFI_PASSWORD[] = "";
    const char AWS_IOT_ENDPOINT[] = "xxxxx.amazonaws.com";
    
    // 証明書
    static const char AWS_CERT_CRT[] PROGMEM = R"CRT(
    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    )CRT";
    
    // プライベートキー
    static const char AWS_CERT_PRIVATE[] PROGMEM = R"PRK(
    -----BEGIN RSA PRIVATE KEY-----
    -----END RSA PRIVATE KEY-----
    )PRK";
    
    // ルートCA証明書
    static const char AWS_CERT_CA[] PROGMEM = R"RCA(
    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    )RCA";
    
  4. THINGNAMEMySokuteiESP32 を設定する。

  5. Wifiに接続するため、SSIDPASSWORD を設定する。

  6. AWS_IOT_ENDPOINT は、AWS IoT のサイドメニューから Settings のページで確認できる。

  7. 証明書、プライベートキー、ルートCA証明書をそれぞれ secrets.h ファイルに書き込む。

  8. メインスケッチのタブを開き、以下のコードをペーストする。ファイル > 保存 を選んで、プロジェクト名を設定して保存する。

#include "secrets.h"
#include <WiFiClientSecure.h>
#include <MQTTClient.h>
#include <ArduinoJson.h>
#include "WiFi.h"

// ESP32からパブリッシュするMQTTトピック
#define AWS_IOT_PUBLISH_TOPIC   "esp32/pub"

WiFiClientSecure net = WiFiClientSecure();
MQTTClient client = MQTTClient(256);

void connectAWS()
{
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);

  Serial.println("Wi-Fiに接続中..");

  while (WiFi.status() != WL_CONNECTED){
    delay(500);
    Serial.print(".");
  }

  // AWS IoTの認証情報を使用するようにWiFiClientSecureを設定
  net.setCACert(AWS_CERT_CA);
  net.setCertificate(AWS_CERT_CRT);
  net.setPrivateKey(AWS_CERT_PRIVATE);

  // AWSエンドポイントのMQTTブローカーに接続
  client.begin(AWS_IOT_ENDPOINT, 8883, net);

  Serial.print("AWS IoTに接続中..");

  while (!client.connect(THINGNAME)) {
    Serial.print(".");
    delay(100);
  }

  if(!client.connected()){
    Serial.println("AWS IoTがタイムアウトしました!");
    return;
  }

  Serial.println("AWS IoTに接続しました!");
}

void publishMessage()
{
  StaticJsonDocument<200> doc;
  doc["time"] = millis();
  doc["temp"] = "20.1";
  doc["hum"] = "60.5";
  char jsonBuffer[512];
  serializeJson(doc, jsonBuffer); // JSON形式のデータを生成

  client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
}

void setup() {
  Serial.begin(9600);
  connectAWS();
}

void loop() {
  publishMessage();
  client.loop();
  delay(10000);
}

ESP32にプログラムを書き込む

こちらの記事を参照

lambda-iot-rule AWS SARアプリケーションのデプロイ

ここまででAWS IoTに接続できるようになったので、AWS Serverless Application Repository のアプリケーションをデプロイする。

  1. AWSコンソールの AWS Serverless Application Repository のアプリケーション lambda-iot-rule のページで AWS IoT デバイスのリージョンと同じリージョンになっていることを確認する。
  2. Deploy をクリックする。
  3. Application settings で、SubscribeTopicesp32/pub を入力する。PublishTopic は使わないため、そのままでOK。
  4. "I acknowledge that this app creates custom IAM roles." にチェックして、Deploy をクリックする。
  5. Deployments タブを開き、Deployment historyStatus が "Create complete" となればデプロイ完了。

デバイスからパブリッシュされたデータの確認

  1. AWSコンソールの Services から DynamoDB を開く。
  2. サイドメニューの Tables から作成されたテーブルを選ぶ。
  3. Itemsタブを選ぶと、デバイスから送信されたデータが payload と timestamp が記録されていることが確認できる。

室内の気温と湿度の記録

温湿度センサ DHT11 on arduino-esp32を参考に温度センサーとESP32を接続し、温度と湿度が取得できることを確認しておきます。ここでは DHT11の代わりにDHT22を使用し、DHT22のOUTは16番ピンに接続しました。

  1. 先頭の #include 行の後ろに次のコードを追加する。

    #include "DHTesp.h"
    #define DHTPIN 16
    DHTesp dht;
    
  2. publishMessage() 関数を次のコードに置き換える。

    void publishMessage()
    {
      TempAndHumidity newValues = dht.getTempAndHumidity();
      if (dht.getStatus() != 0) {
        Serial.println("DHT22 error status: " + String(dht.getStatusString()));
      }
      float temp = newValues.temperature;
      float hemi = newValues.humidity;
      Serial.print(temp);
      Serial.print(" ");
      Serial.println(hemi);
    
      StaticJsonDocument<200> doc;
      doc["time"] = millis();
      doc["temp"] = temp;
      doc["hum"] = hemi;
      char jsonBuffer[512];
      serializeJson(doc, jsonBuffer); // JSON形式のデータを生成
    
      client.publish(AWS_IOT_PUBLISH_TOPIC, jsonBuffer);
    }
    
  3. setup() 関数を次のコードに置き換える。

    void setup() {
      Serial.begin(9600);
      dht.setup(DHTPIN,DHTesp::DHT22);
      connectAWS();
    }
    
  4. マイコンに書き込む をクリックする。

  5. 書き込みが完了すれば、DynamoDB の payload に現在の温度と湿度が10秒毎に書き込まれる。



以上のように、ESP32 を AWS IoT に接続して、DHT22を使って測定した温度・湿度を DynamoDB に書き込むということが、とても簡単にできることが分かりました。

参考

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

AWSソリューションアーキテクト - プロフェッショナルの勉強方法について書いていきます

はじめに

少し前の話になりますが、ソリューションアーキテクト - プロフェッショナル(SA-Pro)に合格したので記憶が薄れる前に勉強方法をメモっておきたいと思います。
受験の動機なんかは以下の記事にも書いていますので、もし興味がある方はご覧ください。

ちなみに以下に記載している内容は、あくまで私が試行錯誤しつつ実践したものとなります。勉強方法は千差万別なので、人によって合う合わないがあると思いますので予めご了承ください。

勉強期間

2020年の2月にソリューションアーキテクト - アソシエイトに合格し、その後6月にSA-Proを取得しました。期間的には4か月間くらありましたが、この間ずっと集中して勉強していたわけでもないので賞味1か月半~2か月くらいかと思います。
私の場合色々あって間延びしてしまいましたが、ズルズルいくと勉強自体が苦痛になってしまうので、短期的に集中して早く成果を出していくほうがモチベーションを保てると思います。

SA-Pro勉強方法

以下、私が実践した勉強方法について記載していきます。

ソリューションアーキテクト - アソシエイトの取得

SA-Proを受ける前提として、アソシエイトレベルの知識は必須となります。アソシエイトであれば市販の対策本も充実してるので、しっかり読み込み、巻末の問題集を解けば合格レベルの知識は身につくはずです。まずは取ってしまいましょう。
ちなみに私が読んだ本はこちらです。上の方はいい感じだったので3周読みました。

ホワイトペーパーを読む

アソシエイトが取れればAWS関連の基礎知識が得られますが、SA-Proとなるとそれ以上に広範囲かつ深い知識を要求されます。またアソシエイトと異なり対策本なども(当時は)なかったので、足りない知識を補うためにまずAWSのホワイトペーパーを読み込みました。とはいえホワイトペーパーは量が膨大で何が試験に出て何が出ないのかわかりにくいため、色々探して以下のサイトに行きつきました。

英語のサイトですが、試験に必要なホワイトペーパーがいい感じにまとまってます。すばらしいです。Chromeならブラウザの翻訳機能も使えるので問題ありません。ページ末尾に感謝のコメントが連なってるあたり、受験にあたってこのページを参考にされている方も多いようです。ほぼ海外ですが。
私は暗記するつもりでこのホワイトペーパーを読み込みましたが、今になって思うとここに時間をかけすぎる必要はなかったように思います。深い知識はこの後つけていくことになるので、この時点では斜め読みくらいの気持ちでもよいのかなあと。なにより分量が多いので、興味がある分野であればともかく、そうでない個所を真面目に読んでると気が萎えてしまいます。私は若干萎えました。とりあえずこの段階では、まずはこういうサービスもあるんだな、くらいの感覚でよいかと思います。

深く学習する - ①問題集を解く

前述の通りSA-Proには体系だった学習本が存在しませんが、問題集はわりと販売されていたりするので、それらを購入してひたすら解きまくるのが合格の近道かと思います。たくさん問題を解いて実戦ベースで足りない知識を埋めていく感じです。
私の場合は色々調べた結果、以下Udemyの問題集に行きつきました。個人的には上の方がおすすめです。問題の解説も充実しておりレビュー評価も非常に高いです。英語ですが、前述と同じくChromeの翻訳機能を使えば問題ないかと。機械翻訳の悪文にも慣れることができます。

深く学習する - ②分からなかった問題を調べ倒す

上記の問題集を解いて、分からなかった個所の解説を読み込みます。勉強の初期段階では解説の意味すら分からないケースもあるので、この場合は当該サービスのBlackBeltを見たり、ホワイトペーパーやFAQを探して読み込んだりするのもよいかと。クラスメソッドさんのブログにも大変お世話になりました。
最初のうちは理解度が浅く1つ問題を解く度に調べて暗記を繰り返すので、1問につき30分以上かかるケースもあったと思います。全然進まないので心が折れそうになりますが、めげずに問題を解き続けていれば、だんだん知識量が増えてきてコツもつかめてくるので徐々に楽になってくるはずです。

BlackBeltのリンクを以下に貼っておきます。受験勉強において一番参考になりました。PDFと動画版がありますが、PDFを見ても意味が分からない場合、動画を見ればすっきり理解できることが多いです。時間があれば動画を視聴することをお勧めします。

深く学習する - ③分からなかった個所をノートに書き出し、繰り返し覚える

人の記憶は薄れやすいです。私の場合、最初は「メモなんか取らなくていいっしょ」と気楽に構えて一通り問題集を解き、2周目に突入してから全然解けずに泣けてきたことを覚えています。
SA-Proはともかく出題範囲が広いので、1周しただけで全て覚えきるのは難しいです。問題集の2周目以降を効率的に進めるためにも、上記②で苦労して調べた内容は逐一ノートに取った方がよいと思います。そして定期的にノートを見返して暗記することで、最終的にトータルの学習効率を上げることができると思います。
私の場合はSA-Proだけでノート1冊分になりました。12冠では全部で4冊ほどです。人によってはノートPCやタブレットを使ったり、マインドマップ等のツールを活用しているケースもあるようなので、この辺りは自分に合ったスタイルを採用するのがいいのではと思います。

上記①~③をひたすら繰り返す

あとはひたすら①~③を繰り返します。これを1~2か月続ければ合格ラインに達すると思います。1日時1時間の勉強でだいたい30~60時間くらいでしょうか。ほかの人のブログを見ても、かけている時間はそれくらいではないかという気がします。
受験の目安ですが、上記で紹介した問題であれば「90分で75問、正解率8~9割」で解けるようになればOKかと。私の場合は大体3周くらいやりました。

模試を受ける

本番の雰囲気を把握するためにも事前に模試を受けておいた方がよいと思います。アソシエイトに合格すれば特典としてAWSの模試を無料で受けられるチケットを入手できるので、このタイミングで使ってしまいましょう。
上記の通り勉強していれば模試でも合格ラインに達している可能性が高いですが、ダメだった場合は再勉強しましょう。あと、模試のキャプチャを取っておいて繰り返し解くのも重要です。
以上をこなせば大体の準備はできていると思いますので、問題なければ本番の試験を受験しましょう。

本番試験え必要な準備と心構え

こうした方がよかったな、というとこも含めて覚えてる限り書いてみます。

  • この試験はとにかく長文の問題が大量に出るので、いかにそれに対応できるかがポイントになります。単純な暗記だけでは合格できません。いかに問題と選択肢を早く読み、出題者の意図を予測できるかが勝負になります。また問題文は機械翻訳なので、悪文にも慣れておく必要もあります。練習問題を解くときはスピードを意識しましょう。(特に2~3周目)
  • 問題の選択肢は「ほぼ書かれていることが同じで、ごく一部だけ違う」ようなケースが非常に多いので、目Diff力は必須です。練習問題を解くときに意識して鍛えましょう。目Diff力が上がれば問題を解くスピードも格段に上がります。
  • 前日は早めに寝てしっかりと睡眠をとりましょう。大量の長文問題を3時間説き続けるのはとてつもなくしんどいです。寝不足の状態では集中力が30分も持たないので、ちゃんと寝ましょう。
  • 試験中は30問くらい解いたら一度目をつぶって深呼吸しましょう。消耗した集中力が若干回復します。
  • 問題を解く際にはできるだけ2択まで絞り込みましょう。2択までいって分からなかったらあとは直感で。3択でもOKです。
  • 気分の問題も大きいと思いますが、AWS試験は前半に難しい問題が集まっている気がします。もし前半の問題で躓いたとしても焦らず、それっぽい回答を選んでさっさと次に進んでしまいましょう。自分の場合は1回目の試験で見事にこれに躓いて時間を食ってしまい、結局最後まで取り戻せませんでした。2回目はそんなもんだと割り切り、解けない問題はさっさと飛ばしたのでその辺もよかったのではと思ってます。ただし、分からないなりにそれっぽい選択肢を選んでおくのは大事です。
  • 試験当日は仕事を休みにしましょう。できるだけ余計なことを考えずにすむ状況にしないと集中力が続きません。
  • 試験の後には予定を入れないようにしましょう。試験後は消耗しきってるので何しても楽しめませんし、仕事する気なんか微塵も起きません。この日はビール飲んでさっさと寝ましょう。
  • あと、アソシエイトに受かった際に本番試験の半額チケットも発行されてます。忘れずに使いましょう。

終わりに

というわけで色々と覚えていることを書かせていただきました。
SA-ProはAWS関連のサービスについて問われることはもちろんですが、AWS以外にも専門的な知識を身につけないと合格することが難しいです。受かれば最高ですが、そうでなくても勉強を通して培った知識は必ず業務に役立つはずなので、皆さんももし興味があればチャレンジしてもらえると嬉しいです。AWSは知れば知るほど楽しいですよ。

今回の記事が誰かのお役に立てると幸いです。

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

Amazon SageMakerで実現する機械学習モデルの監視技術

初版: 2021年3月29日
著者: 株式会社日立製作所 橋本恭佑、Nguyen Ba Hung

はじめに

AI技術への注目の高まりに伴い、機械学習技術をビジネスへ適用するニーズが増えています。
ビジネスに機械学習技術を用いる場合、企業はまず業務に関係するデータを用いて機械学習モデルを作成します。
このとき利用されるデータは特定の時点より前のデータであり、時間が経過しても変化しません。

一方で、実際の業務で利用されるデータは時間の経過とともに変化します。
作成した機械学習モデルを業務へ適用してしばらくすると、データの傾向が変化し、作成した機械学習モデルの精度が低下したり、性別や住所の様な特定のデータに偏った推論が行われる現象が起こります。

前者の現象はデータドリフト、後者の現象はバイアスと呼ばれ、機械学習モデルをビジネスへ適用するSEにとって、データドリフトやバイアスなどの発生を迅速に検知することは、
機械学習モデルをビジネスへ効果的に適用する上で極めて重要といえます。

本投稿では、機械学習モデルをビジネスへ適用するSEを対象として、機械学習モデル及びデータの傾向の監視技術を解説し、
AWSのマネージドサービスであるAmazon SageMakerによって、これらの監視技術を利用可能になることを示します。
次回以降の投稿では米国の電話会社の顧客解約予測を題材として、
監視技術(精度の可視化、データ品質監視、モデルの説明可能性、バイアス監視)について実機検証した結果を紹介します。

AWSを利用した機械学習モデルの監視の概要

機械学習モデルの監視手法

図1は機械学習モデル構築のライフサイクルを示しています。機械学習モデル構築のライフサイクルは、データの生成、モデルの訓練、モデルのデプロイの3パートから構成されます。
本投稿で扱う機械学習モデル及びデータの傾向の監視技術は、モデルのデプロイを実行した後に、機械学習モデルのパフォーマンスを監視し評価する部分に相当します。

fig01.png

図1: 機械学習モデル作成のライフサイクル(出典: AWSホームページ, https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-mlconcepts.html)

機械学習モデルの監視には、図2に示す4つの手法があります。図2は携帯電話会社の顧客の解約率を予測する機械学習モデルを例として、説明変数を顧客の特性(契約月数やプランなど)、目的変数を解約の有無として示しています。

fig02.png

図2: 機械学習モデルの監視手法

① 精度の可視化

推論結果と正解ラベルを比較し、正答率などを算出します。精度を評価する指標の例としては、正答率や再現率、F値があります。

②データ品質監視

データドリフトが起こっていないかを監視します。次の3つの方法があるといわれています1

  1. 機械学習モデルの誤答率変化の検知: 精度の変化をデータドリフトとして検知します。
  2. データの分布変化の検出: 学習用データの分布と推論用データの分布の違いをデータドリフトとして検知します。
  3. 多重仮説検定の実行: データドリフトが起こっている場合に、こういう試行をするとこのくらいの確率でこういう結果になる、といった仮説を立てて検定を実施し、仮説を満たす場合にデータドリフトとして検知します。

③ 説明性の監視

推論用データと推論結果を比較して、機械学習モデルの推論結果の根拠を監視します。次の3つのアプローチがあるといわれています2

  1. Deep Explanation: 説明可能な説明変数を学習する様に、深層学習技術を作り変える。
  2. Interpretable Models: より構造的で、解釈しやすく、因果関係がわかりやすいモデルを利用する。
  3. Model Induction: モデルの入出力を推論するモデルを利用する。

④ バイアスの監視

推論用データと推論結果を比較して、推論結果に偏りがないかを監視します。

Amazon SageMakerが提供する機械学習モデルの監視手法

Amazon SageMaker Model Monitor

Amazon SageMaker Model Monitor は、本番環境におけるAmazon SageMakerの機械学習モデルと推論データの品質を監視します。
Amazon SageMaker Model Monitor を使用すると、モデルの品質変化に関するアラートを設定できます。
変化を検出することで、モデルの再学習や、システムの監査、データ品質の問題の修正などを決定できます。図3にSageMaker Model Monitorの概略図を示します。図3の緑色のバケツはS3ストレージを示しています。

fig03.png

図3: Amazon SageMaker Model Monitor(出典: AWSホームページ, https://docs.aws.amazon.com/sagemaker/latest/dg/model-monitor.html)

Amazon SageMaker Model Monitorは、ベースライン処理ジョブ(Baseline Processing Job)とスケジュールされた監視ジョブ(Monitoring Job)の2つのジョブで構成され、それぞれが学習用データと推論用データを利用します。
ベースライン処理ジョブは、学習用データを元に、ベースライン統計(データの欠損、平均、最小、最大、標準偏差など、学習用データに関する簡単な統計値)と制約条件(特徴量の型や値の範囲、データの形式など)を作成します。

その後、スケジュールされた監視ジョブは定期的(毎時、毎日などの事前定義された期間)にベースライン統計および制約条件と推論用データとを比較し、推論用データの統計値と、推論用データに含まれる違反値を抽出します。
抽出した結果はAmazon CloudWatch(図3の中央左のピンク色のアイコン)とAWS S3ストレージ(図3の中央右の緑色のバケツ)へ転送されます。
最後に、しきい値などのあらかじめ定めた基準に基づいて、Amazon SageMaker Model Monitorの監視結果が顧客や開発者に送信されます。

Amazon SageMaker Clarify

Amazon SageMaker Clarify(Clarify)は、説明変数の推論結果への寄与度を算出し可視化します。
また、特定の説明変数に関する正解ラベルや推論結果の偏りが、訓練用データや機械学習モデルに含まれることを検知します。
Clarifyによって、説明性の監視や、バイアスの監視が可能になります。

Amazon SageMaker Studio

Amazon SageMaker Studio(Studio)は、AWSにおける機械学習のための統合開発環境です。
図1のライフサイクルをAWSマネジメントコンソール画面の様にウェブベースのインターフェース上で行うことができ、SageMaker Studio Notebookを呼び出して機械学習モデルの精度を可視化することや、Model MonitorやClarifyが出力したレポートを確認することができます。

Model Monitor, Clarify, Studioを組み合わせることで、4つの監視技術を実現できます。

①: 精度の可視化(Model MonitorとStudio): 推論結果と正解ラベルを比較して精度などを算出し可視化します。

②: データ品質監視(Model MonitorとStudio): 推論用データの分布と学習用データの分布を比較します。

③: 説明可能性の可視化(ClarifyとStudio): SHapley Additive exPlanations(SHAP)3を使用して、機械学習モデルの推論結果がどの説明変数により強く依存するかを可視化します。

④: バイアスの監視(ClarifyとStudio): 特定の説明変数に対する機械学習モデルの推論結果の偏りを、複数のバイアスメトリックを算出して可視化します。バイアスメトリックには、KLダイバージェンス(2つの正規分布の類似度を定量化する指標)などがあります。

おわりに

今回の投稿では、機械学習モデルの監視技術の概要と、Amazon SageMakerで実現できる監視技術の概要を紹介しました。
次回以降の投稿では、米国の電話会社の顧客解約予測を題材として、Amazon SageMakerを利用して機械学習モデルの精度の可視化とデータ品質監視を実証した例を紹介します。

注釈


  1. Jie Lu, et al., ”Learning under Concept Drift: A Review”, IEEE Transaction on Knowledge and Data Engineering, 2019.  

  2. DARPA, “Explainable Artificial, Intelligence”, https://www.darpa.mil/program/explainable-artificial-intelligence  

  3. Lundberg, S.M. and Lee, S.I., "A Unified Approach to Interpreting Model Predictions", 31st Conference on Neural Information Processing Systems (NIPS 2017), pp. 4765-4774. 

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

AWS Amplifyの認証情報を他のAWSサービスのSDKで流用した[Swift Storyboard]

AWS Amplifyを使うとモバイルアプリで簡単に認証機能を搭載できますが、Amplifyの対応していないAWSサービスを使わなければならない場面があったのでメモ。
AWS歴半年の初学者の備忘録ですので、誤り等あればご指摘いただけると幸いです。

前提

  • Amplify CLIでプロジェクトに認証機能を追加している(参考:AWS AmplifyによるiOSアプリ開発入門(Part1)
  • 対応するIDプールのIAMロールに必要なポリシーをアタッチしている
    具体的には amplify-xxxx-yyyy-zzzz-authRole-idp のようなロール名です

実装

認証が必要なSDKの直前で以下を追記

let credentialsProvider = AWSMobileClient.default().getCredentialsProvider()
let configuration = AWSServiceConfiguration(region:.APNortheast1, credentialsProvider:credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = configuration

動かないときは

  • IDプールに対応するIAMロールで実行したいアクションが許可されているかを確認する。
  • AWSMobileClient.sharedInstance()~としている箇所があればAWSMobileClient.default()~と変更する。
    前者のメソッドは今後は後者に移行されていくようです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS SAP (Solution Architect Professional) 受験記

はじめに

_s__o_ です。

ちょうど 1 年ぐらい前に AWS SAP (AWS ソリューションアーキテクチャープロフェッショナル) 試験を受験したので、他の方の今後の参考になればと、記録を残します。
※2020 年の受験記のため、2021 年 3 月現在の試験制度と内容が乖離している可能性があります。あらかじめ、ご了承ください。

AWS Solution Architect Professional

受験の背景 (動機)

しばらく AWS から離れているので、記憶の気化を防ぐ目的で、受験を決意しました。

AWS SAP の特徴

下記のサンプル問題をご参照ください (英語)。
サンプル問題
※一部邦訳したものは、このサイトに記載されています。

……目を通してもらえば分かると思いますが、選択肢・問題文ともに、大量です。下手をすれば、各選択肢で 3~4 行、問題文で 10 行の文章量に及びます。

その問題を 180 分以内に 75 問解きます。約 3 時間です。
※大学受験も含めて、自分が経験してきた中で、最長の試験でした。

さらには、求められる正答率は「75 %」です。旧試験では「65 %」だったようですが、何年か前に仕組みがあがって、「75 %」まで引き上げられたらしいです。

そのため、求められるのは、知識は勿論ですが、強い忍耐力と集中力です。
※実際、本番試験中は何度か心が折れそうになりました。。。

勉強期間

約 3 ヶ月です。当時 PM をやっていた案件は AWS と関係がなかったので、完全に自己研鑽です。

勉強材料 (メイン)

  • AWS WEB 問題集で学習しよう (以下、koiwaclub) (リンク)
  • Udemy の問題集 (リンク)

双方とも Web 問題集です (有料)。

「koiwaclub」は 7 問で構成されるセクションを、48 セクション (2020 年 2 月時点) 解いていきます。各問題毎に正誤 & 解説が表示されるので、時間が無いときにさっとやるのは便利です。

「Udemy」の方は本番試験のように 75 問を 180 分で解くので、本番の雰囲気になれるという意味でも有用だとあと思います。あと、すべての受験記録が残るので、後で見返したい場合に便利でした。ちなみに全部英語ですが、Google 翻訳でまったく不自由なく使えました。

本番試験でのデジャブ感で言えば「koiwaclub」の方がよく、問題・解説・ツールの質で言うと「Udemy」がよかったです。総問題数としては、上記 2 つで 650 問近くを解きました。

勉強材料 (サブ)

「試験のデジタルトレーニング」は AWS 公式の無料トレーニングで、設問に対する解答アプローチが懇切丁寧に説明されています。解き方のイメージアップにつながるので、このトレーニングは視聴しておいたほうがいいです。

「AWS Black Belt」は、こちらも AWS の公式ですね。Youtube のチャンネルを登録して、いろんなテーマを流しで見ていました。

「Jayendra's Blog」は海外の有志のブログで、学習すべきポイントなどがよくまとまっていて分かりやすかったです。

試験

想像の 1.5 倍ぐらい難しかったです。「koiwaclub」や「Udemy」で出てきた内容よりもさらに捻った問題 (*1) がたくさん出てきました。勉強教材の丸暗記では対応できず、その場その場でしっかりと考えていく必要がありました。

あと、日本語訳が壊滅的でした。「を」が「お」になっていたりとか、誤変換 (例 : 「と置換」→「土地勘」) とか、本当に公式試験として世に出していいのかを疑うレベルでした。ですので、本番の際は日本語 ⇔ 英語をちょこちょこ切替ながら問題を解いてました。

試験結果は 777 点/1000 点でギリギリ合格。あとで試験結果を見て、ヒヤリとしました。。。

(*1) 捻った問題の一例
「500 Mbps の DX 接続、1 Gbps の ISP 接続 (利用可能帯域 100%) の回線を持つ DC がある。この DC から 20 TB のデータを AWS に移行する場合、最もコスト効率がよく、且つ、最短で運べる方法を選べ。
(A) Snowball
(B) DX 経由でデータ転送
(C) S3 Transfer Acceleration
→ 80 TB とかなら文句なしに「(A)」ですが、数字がやらしく設定されていたため、今回は「(B)」を選択しました (500 Mbps、20 TB なら 3~4 日で転送可能……なはず)。

総費用 (ざっくり)

公式模擬試験 : 0 円 (クーポン利用)
学習サイト (koiwaclub) : 5,000 円
学習サイト (Udemy) : 1,500 円 (クーポン利用)
試験 : 15,000 円 (クーポン利用)
計 : 21,500 円

※クーポンをフル活用したので、AWS SAA よりも安く済みました。

学習や試験の所感

よく出るサービス

登場する AWS サービスにばらつきがありました (AWS の好み?)。直感的なランキングは下記のイメージです。よく出るサービスについては、BlackBelt などで深掘りをしておいた方がよいと思います。

  1. CloudFront
  2. S3
  3. DynamoDB
  4. Kinesis
  5. API Gateway

特に CloudFront は頻出中の頻出なので、基本機能は勿論、細かな仕様なども押さえておいた方が良いと感じました。

副次効果

試験を通して、ほんのりとアーキテクトの考え方・視点 (「要求」と「要件」から最適構成を考える、みたいな) も少し養うことができた気がします。さすが、「AWS ソリューションアーキテクチャー」と銘打つだけはありますね。

あと、SQS のおかげで、「疎結合・密結合」の概念への理解が深まりました。この理解は、現在推進中の Prj の運用スクリプト設計に役立ってたりしてます。

今後

しばらく AWS 系の試験はもういいかなと。満腹です。。。
※合格特典のクーポンは、「CLF-C01」を受験予定の妻に譲渡しました。

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

IAM Access Analyzer とは

勉強前イメージ

IAMのアクセスした分析見れる的な?

調査

IAM Access Analyzer とは

リソースのポリシーを確認して、意図せぬ公開設定などがされていないか
検出し、可視化する機能になります。

対応しているリソース

  • s3
  • IAMロール
  • KMSキー
  • lambda関数・レイヤー
  • SQSキュー
  • Secrets Managerシークレット

※2021/03/29時点
詳細は AWS Identity and Access Management のユーザガイド をご確認ください

設定方法

  • マネジメントコンソールから確認

IAM > アクセスレポート > Access Analyzer から設定することが出来ます

2021-03-29 IAM Management Console - Google Chrome 2021-03-29 15.44.10.png

  • 設定内容

以下が設定内容になります。
名前だけ指定するだけでアナライザーを作成できます。

2021-03-29 IAM Management Console - Google Chrome 2021-03-29 15.57.48.png

費用

IAM Access Analyzer の利用費用は、追加料金無しに使用できるので
設定し、確認するのが良いかと思います。

注意点

  • サポートされているリソースが限定される

すべてのリソースがサポートされているわけではないので、
これを有効にするだけで大丈夫、とはならないです

  • リージョン単位の設定

複数リージョン利用する際は、リージョンごとに設定を有効にする必要があります。

勉強後イメージ

なんかAWS config とか似たようなことしてなかったっけ・・?
また今度気が向いたら勉強します。
とりあえずそんな機能があるってことを知った。

参考

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

WordPressの引っ越し(CentOS7→Amazon Linux 2)

概要

個人の備忘録メインのため、不備が多いかと思います。よろしければご指摘ください。
これまで自宅サーバー(CentOS7)でWordPressのブログを運営してきましたが、EC2に引っ越ししてみます。
ついでにWebサーバーをApacheからNginxに変更してみます(ただの興味)。

EC2

インスタンスの起動、Elastic IPの割り当て、セキュリティグループ設定は割愛します。

初期設定

基本、ルート権限で作業します。

$ sudo -s

1. ホスト名の変更

# vi /etc/hostname

2. タイムゾーンの設定

# rm -f /etc/localtime; ln -sf /usr/share/zoneinfo/Japan /etc/localtime
# vi /etc/sysconfig/clock
ZONE="UTC"のUTCをAsia/Tokyoに変更

3. 日本語対応

# vi /etc/sysconfig/i18n
LANG=en_US.UTF-8のen_US.UTF-8をja_JP.UTF-8に変更
# source /etc/sysconfig/i18n

4. 再起動

# reboot

参考URL
https://qiita.com/2no553/items/e166c00790c3397acf2d
http://mktktmr.hatenablog.jp/entry/2016/12/07/154736

Nginx、PHPインストール

# amazon-linux-extras
…
 38  nginx1                   available    [ =stable ]
…
 42  php7.4                   available    [ =stable ]
…
# amazon-linux-extras install nginx1 php7.4
…
# systemctl start nginx
# systemctl enable nginx
…
# yum install php-mbstring

MariaDBインストール

1. yumでインストール

# yum install mariadb-server

2. 文字コード設定

# vi /etc/my.cnf.d/server.cnf
…
[mysqld]
character-set-server = utf8 ← 追記
…

3. 起動

# systemctl start mariadb
# systemctl enable mariadb

4. 初期設定

# mysql_secure_installation
…
Enter current password for root (enter for none): ← 空Enter
…
Set root password? [Y/n] ← 空Enter
New password: ← rootパスワード
Re-enter new password: ← rootパスワード
…
Remove anonymous users? [Y/n] ← 空Enter
…
Disallow root login remotely? [Y/n] ← 空Enter
…
Remove test database and access to it? [Y/n] ← 空Enter
…
Reload privilege tables now? [Y/n] ← 空Enter
…

参考URL
https://centossrv.com/mariadb.shtml

WordPress用の設定

MariaDB

以下の設定とする。
データベース名:wordpress
ユーザー名:wordpress

# mysql -u root -p
> create database wordpress;
> grant all privileges on wordpress.* to wordpress@localhost identified by '(任意のパスワード)';

PHP-FPM

# vi /etc/php-fpm.d/www.conf
…
user = nginx ← apacheから変更
group = nginx ← 〃
…
# systemctl restart php-fpm
# systemctl enable php-fpm

旧サーバーからのデータ移動

1. 旧サーバー処理

旧サーバーのディレクトリは以下にある。
/var/www/wordpress

### WordPress ###
# cd /var/www
# tar cvf wordpress.tar.gz wordpress
# mv wordpress.tar.gz (ユーザーのホームディレクトリ)

### MariaDB ###
# mysqldump wordpress -u wordpress -p > dump.sql

2. 新サーバー処理

新サーバーのディレクトリは以下にする。
/usr/share/nginx/html/blog

### データコピー ###
# sftp (ユーザー名)@(旧サーバーのアドレス)
> get wordpress.tar.gz
> get dump.sql
> quit

### WordPress ###
# tar zxvf wordpress.tar.gz
# mv wordpress /usr/share/nginx/html/blog
# chown -R nginx. /usr/share/nginx/html/blog

### MariaDB ###
# mysql -u wordpress -p -D wordpress < dump.sql

HTTPS対応

Let's Encrypt導入

# amazon-linux-extras install epel
# yum install certbot-nginx
# certbot --nginx
…
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): ← メールアドレスを入力してEnter
…
(Y)es/(N)o: ← 1回目ライセンス関連:Yを入力してEnter
…
(Y)es/(N)o: ← 2回目メールアドレスの共有:YかNを入力してEnter
…
name(s) (comma and/or space separated)  (Enter 'c' to cancel): fugiters.net ← ホスト名を入力してEnter
…

参考URL
https://qiita.com/ntm718/items/37d1d0a7de2d1edb4e7c

Nginx設定

設定ファイル(/etc/nginx/nginx.conf)の「Settings for a TLS enabled server.」の下の設定をコメントを外し、

# vi /etc/nginx/nginx.conf
…
    server {
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  fugiters.net; ← ホスト名
        root         /usr/share/nginx/html;

        ssl_certificate "/etc/letsencrypt/live/fugiters.net/cert.pem"; ← 証明書
        ssl_certificate_key "/etc/letsencrypt/live/fugiters.net/privkey.pem"; ← 秘密鍵
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;
#        ssl_ciphers PROFILE=SYSTEM; ← 不明
        ssl_prefer_server_ciphers on;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf; ← これが無いとPHP動かず(ここでハマった)

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
…
# systemctl restart nginx

参考URL

https://ja.wordpress.org/support/article/nginx/
https://note.com/hiroki_hachisuka/n/nc1d5342c3a9b

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

AWSで「●●ができないんですが!」って言われたときに気にするところ

良く障害調査とか起きた時に
”この辺怪しいな”って経験則に基づくアレ、あるじゃないですか
備忘(まあ忘れないけど)のために書いておこうかなと。

なんかわからないけど「つながりません!」って言われる

  1. SG
  2. ネットワークACL
  3. ルートテーブル
  4. 接続先のインスタンスが起動してない

だいたいこの辺。ほとんど1。

その次に多いのが4。
いつも動いてる時間に止まってたりすると…仕方ない。

「S3にアクセスできません!」って言われる

  1. そもそもSG
  2. IAMポリシー
  3. S3のバケットポリシー

VPC エンドポイントがS3とDynamoDBはGatewayタイプなので
443のpl-XXXXみたいなのを追加しなきゃいけない。
(私もたまに忘れます。)

2と3に関しても誤記載はよく耳にします。
s3://test-bucket/"*"  最後の"*"忘れはよく聞く。

あとはのちのち編集します

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

「AWS 認定データアナリティクス 専門知識」 取得に向けた学習まとめ

はじめに

先日、AWS 認定データアナリティクス 専門知識の認定試験を受験し、無事合格しました。自分が実施した学習の流れとそれぞれの概要について、実施した順に記載をしています。「データアナリティクス 専門知識」に限らず、他の認定試験を受ける際に参考になる部分もあるかと思うので、良かったら読んでみてください。

受験目的

  • 数ヶ月前にデータ分析やデータ活用をメインとして扱う会社に転職。
  • データ分析に関わるAWSサービスを体系的に学ぶべく、本認定試験を受験することに。

前提

  • ソリューションアーキテクト・アソシエイトの資格は取得しており、AWSのサービスの基本は把握済。
  • テスト範囲のサービスの中には、自分が関わっているPJの中で使われているものもあったが、ゼロからの構築、設定経験はほぼ無し。

学習手順

試験ガイド

まずはこの認定試験の試験内容を把握しましょう。試験の出題形式や、分野及び観点が記載されています。

「AWS 認定試験に備える」ページ

  • https://aws.amazon.com/jp/certification/certification-prep/
  • AWSの各認定試験ごとに、学習すべきリソースへのリンクをまとめてくれています。
  • こちらの「データ分析 – 専門知識」項目における「AWSホワイトペーパーと、よくある質問を読む」を見ると、認定試験の出題対象となるサービスの一覧を確認することができます。
    • 試験対象となるサービスについて、明示的に記載がある箇所はここ以外にないようなので(少なくとも私は見つけられませんでした)、ぜひ確認してみてください。

書籍

  • 図解即戦力 ビッグデータ分析のシステムと開発がこれ1冊でしっかりわかる教科書
    • https://www.amazon.co.jp/dp/429710881X
    • ビッグデータ分析システムを構成する要素にどういったものがあるのか、概要を掴む上で非常に役立つ書籍かと思います。
  • AWSで始めるデータレイク
    • https://www.amazon.co.jp/dp/491031301X
    • こちらはよりAWSサービスに特化した書籍になります。各サービスの具体的なユースケースや利用手順が平易な文章で書かれていて、概要を理解するのにもってこいな書籍かと思います。
    • AWSの中の人が書いている点と、最近出版されている点(2021/03/29執筆時点)からも、信頼のおける学習教材だと思います。

サンプル問題

公式ドキュメント

  • やはり一番大事なのは公式ドキュメントです。当たり前ですが、ここの記載が認定試験における正解となります。各種サービスの公式ドキュメントに一通り目を通しましょう。
  • 基本的には日本語訳が整備されていますが、たまに不自然な表現に出くわすことがあります(目的語や主語が文末に突然現れるようなものなど。読んだことある方は分かっていただけるはずw)。英語が得意な方は英語の方が読みやすい部分もあるかもしれないです。
    • ちなみに試験問題自体も日本語版が提供されているんですが、1, 2問ほど日本語訳が分かりづらいものがありました。英語の問題文も表示可能なので、不安に思った際にはそちらも試しに見てみるのもおすすめです。
  • 公式ドキュメントに簡単なチュートリアルがあるサービスもあります。触ってみることで、各種設定値の意味や設定タイミングなどを一気に理解しやすくなると思います。業務の中で触ったことのないサービスについては一度は触れてみることを強くおすすめします。
    • ただし、課金には重々気をつけてください。笑 ものによっては無料利用枠のない場合があります。チュートリアルが終わってその後使わない場合はすぐにリソースを削除して、課金金額を最小限に抑えましょう。

クラウドサービス活用資料集

ブログ

  • AWSのサービスに関する情報は公式以外にもWeb上に沢山あります。より具体的な利用事例や、触ってみた的な記事を見て、実利用のイメージを膨らますことができるかと思います。特にクラスメソッドさんが運営されているDevelopersIOは記事の速報性も高く、記事数も多いため、学習の上で非常に役立つソースの一つかなと思います(私はとてもお世話になりました、、!

模擬試験

  • AWS公式が提供している20問の模擬試験の受験が可能です。
  • この時点で理解度不足を痛感する可能性もあるので、本試験受験日からある程度余裕を持たせて受験することをおすすめします。
  • 過去にAWS関連の認定試験に合格している場合は、一度だけ模擬試験を無料で受験することができます。ぜひ活用してみてください。
  • 注意点: 模擬試験の受験を終了した後、確認できるのは点数のみです。各問題の正誤及び正答は確認できませんのでご注意ください。

よくある質問

  • 実際に出た問題の中には、このよくある質問から出ていたものもありました。理解を深めるためにも役立つかと思うので、こちらにも目を通してみることをおすすめします。

受験を終えての感想

  • 当たり前ではありますが、データ分析に関わる各AWSサービスの概要とユースケース、パフォーマンスやセキュリティ面での勘所を体系的に学ぶことができました。当初の目的は達成できたかなと思います。
  • 副次的なところで言うと、業務の中で不明点が出てきた時に、公式ドキュメントを抵抗なく読む習慣がつき、また理解するスピードも上がった気がします。
  • まだ業務で使用していないサービスについては、深いところまで理解しきれていない部分も多少あるとは思います。その点については、社内で機会があれば積極的に挑戦して、知識を実践に結びつけていきたいと思います。
  • AWSでしっかり基礎を身につけておけば、仮に他のクラウドを使うことになっても、キャッチアップしやすいんじゃないかなとは思っているので、適度に復習もしつつ、業務でも活用しつつ、さらなる知識の定着に努めたいなと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「AWS 認定データアナリティクス 専門知識」 認定取得に向けた学習記録

はじめに

先日、AWS 認定データアナリティクス 専門知識の認定試験を受験し、無事合格しました。自分が実施した学習の流れとそれぞれの概要について、実施した順に記載をしています。「データアナリティクス 専門知識」に限らず、他の認定試験を受ける際に参考になる部分もあるかと思うので、良かったら読んでみてください。

受験目的

  • 数ヶ月前にデータ分析やデータ活用をメインとして扱う会社に転職。
  • データ分析に関わるAWSサービスを体系的に学ぶべく、本認定試験を受験することに。

前提

  • ソリューションアーキテクト・アソシエイトの資格は取得しており、AWSのサービスの基本は把握済。
  • テスト範囲のサービスの中には、自分が関わっているPJの中で使われているものもあったが、ゼロからの構築、設定経験はほぼ無し。

学習手順

試験ガイド

まずはこの認定試験の試験内容を把握しましょう。試験の出題形式や、分野及び観点が記載されています。

「AWS 認定試験に備える」ページ

  • https://aws.amazon.com/jp/certification/certification-prep/
  • AWSの各認定試験ごとに、学習すべきリソースへのリンクをまとめてくれています。
  • こちらの「データ分析 – 専門知識」項目における「AWSホワイトペーパーと、よくある質問を読む」を見ると、認定試験の出題対象となるサービスの一覧を確認することができます。
    • 試験対象となるサービスについて、明示的に記載がある箇所はここ以外にないようなので(少なくとも私は見つけられませんでした)、ぜひ確認してみてください。

書籍

  • 図解即戦力 ビッグデータ分析のシステムと開発がこれ1冊でしっかりわかる教科書
    • https://www.amazon.co.jp/dp/429710881X
    • ビッグデータ分析システムを構成する要素にどういったものがあるのか、概要を掴む上で非常に役立つ書籍かと思います。
  • AWSで始めるデータレイク
    • https://www.amazon.co.jp/dp/491031301X
    • こちらはよりAWSサービスに特化した書籍になります。各サービスの具体的なユースケースや利用手順が平易な文章で書かれていて、概要を理解するのにもってこいな書籍かと思います。
    • AWSの中の人が書いている点と、最近出版されている点(2021/03/29執筆時点)からも、信頼のおける学習教材だと思います。

サンプル問題

公式ドキュメント

  • やはり一番大事なのは公式ドキュメントです。当たり前ですが、ここの記載が認定試験における正解となります。各種サービスの公式ドキュメントに一通り目を通しましょう。
  • 基本的には日本語訳が整備されていますが、たまに不自然な表現に出くわすことがあります(目的語や主語が文末に突然現れるようなものなど。読んだことある方は分かっていただけるはずw)。英語が得意な方は英語の方が読みやすい部分もあるかもしれないです。
    • ちなみに試験問題自体も日本語版が提供されているんですが、1, 2問ほど日本語訳が分かりづらいものがありました。英語の問題文も表示可能なので、不安に思った際にはそちらも試しに見てみるのもおすすめです。
  • 公式ドキュメントに簡単なチュートリアルがあるサービスもあります。触ってみることで、各種設定値の意味や設定タイミングなどを一気に理解しやすくなると思います。業務の中で触ったことのないサービスについては一度は触れてみることを強くおすすめします。
    • ただし、課金には重々気をつけてください。笑 ものによっては無料利用枠のない場合があります。チュートリアルが終わってその後使わない場合はすぐにリソースを削除して、課金金額を最小限に抑えましょう。

クラウドサービス活用資料集

ブログ

  • AWSのサービスに関する情報は公式以外にもWeb上に沢山あります。より具体的な利用事例や、触ってみた的な記事を見て、実利用のイメージを膨らますことができるかと思います。特にクラスメソッドさんが運営されているDevelopersIOは記事の速報性も高く、記事数も多いため、学習の上で非常に役立つソースの一つかなと思います(私はとてもお世話になりました、、!

模擬試験

  • AWS公式が提供している20問の模擬試験の受験が可能です。
  • この時点で理解度不足を痛感する可能性もあるので、本試験受験日からある程度余裕を持たせて受験することをおすすめします。
  • 過去にAWS関連の認定試験に合格している場合は、一度だけ模擬試験を無料で受験することができます。ぜひ活用してみてください。
  • 注意点: 模擬試験の受験を終了した後、確認できるのは点数のみです。各問題の正誤及び正答は確認できませんのでご注意ください。

よくある質問

  • 実際に出た問題の中には、このよくある質問から出ていたものもありました。理解を深めるためにも役立つかと思うので、こちらにも目を通してみることをおすすめします。

受験を終えての感想

  • 当たり前ではありますが、データ分析に関わる各AWSサービスの概要とユースケース、パフォーマンスやセキュリティ面での勘所を体系的に学ぶことができました。当初の目的は達成できたかなと思います。
  • 副次的なところで言うと、業務の中で不明点が出てきた時に、公式ドキュメントを抵抗なく読む習慣がつき、また理解するスピードも上がった気がします。
  • まだ業務で使用していないサービスについては、深いところまで理解しきれていない部分も多少あるとは思います。その点については、社内で機会があれば積極的に挑戦して、知識を実践に結びつけていきたいと思います。
  • AWSでしっかり基礎を身につけておけば、仮に他のクラウドを使うことになっても、キャッチアップしやすいんじゃないかなとは思っているので、適度に復習もしつつ、業務でも活用しつつ、さらなる知識の定着に努めたいなと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWSでControl Towerを使わずにマルチアカウントを実装してみた(④GuardDuty編)

はじめに

前回記載した①概要編、②Organizations編、③CloudTrail編の続きとなります。今回はOrganizations内の全アカウント、全リージョンに対しGuardDutyを有効化する方法を記載します。
今回の前提となるマルチアカウント環境の全体的な構成や、GuardDutyで何ができるか?については以下の概要編を参照ください。

全体構成

概要図はこんな感じです。Organizations内に複数のアカウントがありますが、これらのアカウントのGuradDutyを有効化します。さらに、全リージョンに対してGuardDutyを適用します。

010_kouseizu.png

対応手順

以下、対応手順を記載します。Organizationsコンソールは現時点では画面デザインが新しいものと古いものの両方を使えますが、今回は新しい方を使っていきます。

GuardDutyの委任(東京リージョン)

まずはOrganizationsのメンバーアカウント(セキュリティアカウント)に対し、GuardDutyの権限を委任します。これにより、セキュリティアカウントで組織内のGuardDutyをコントロールできるようになります。以降の手順は管理アカウントで実施します。

管理アカウントでコンソールにログイン後、東京リージョンに切り替えます。続いてGuardDutyコンソールを開きます。画面内の「今すぐ始める」をクリックします。
020.png

下記の画面が表示されるので、「委任された管理者アカウントID」にセキュリティアカウントのID(12桁の数字)を入力します。
030.png

管理者の委任が完了しました。
040.png

GuardDuty有効化(東京リージョン)

ここからは委任先のセキュリティアカウントで操作を行います。
セキュリティアカウントのAWSコンソールへログイン後、東京リージョンへ切り替えます。続いてGuardDutyコンソールを開き、左メニューの「設定→アカウント」をクリックします。画面上部に青いバーが出ていますので、「有効化」ボタンをクリックします。
050.png

無事有効化されました。この時点で、選択されている1リージョン(ここでは東京)に対し、Organizations内の全アカウントのGuardDutyが有効になります。
060.png

GuardDutyの委任(その他リージョン)

さて、この時点では東京リージョン以外のGuardDutyは無効化されている状態です。上でやったのと同じことを繰り返してもよいですが、ここでは委任操作をCLIで実施したいと思います。
最近CloudShellという便利なサービスが出たのでこれを利用してみます。管理アカウントでAWSコンソールを開き、とりあえず東京リージョンを選択した状態でCloudShellコンソールを起動します。
※下記は検索窓に「CloudShell」と打った状態です
070.png

しばらく経つと以下の画面が表示されます。恐らくですが、裏で何がしかのコンテナが割り当てられて起動しているものと思われます。このコンソール上でAWS CLIの実行が可能です。ブラウザ上でCLI操作まで完結してしまうとは、何とも素晴らしい時代になったものです。。
080.png

というわけで全リージョン分の委任コマンドを実行します。委任先のアカウントIDには12桁の数字を入力してください。また下記のコマンドは東京リージョンも含めていますので、必要に応じ外してください。

aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "ap-northeast-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "ap-northeast-2"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "ap-northeast-3"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "ap-south-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "ap-southeast-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "ap-southeast-2"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "ca-central-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "eu-central-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "eu-north-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "eu-west-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "eu-west-2"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "eu-west-3"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "sa-east-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "us-east-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "us-east-2"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "us-west-1"
aws guardduty enable-organization-admin-account --admin-account-id 委任先のアカウントID --region "us-west-2"

GuardDuty有効化(その他リージョン)

セキュリティアカウントのAWSコンソールへログイン後、上記東京リージョンで対応したのと同じ要領で、画面からGuardDutyを有効化していきます。手順は全く同じなので割愛します。

最後に

無事全リージョン、全アカウントでGuardDutyを有効化することができました。次回はAWS Configの有効化方法について書ければと思っています。

今回の記事が誰かのお役に立てると幸いです。

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

コンテナLambdaをデプロイしてみた(躓いたポイントとリソース削除)

はじめに

AWS builders-flashにコンテナLambdaの記事が出ていたので試してみました。
躓いたポイントと試した後に実行したリソース削除コマンドだけ書いておきます。

躓いたポイント

awscli 2.1.6 未満だとコマンド実行エラーになる

aws lambda create-function \
--function-name func1-container \
--package-type Image \
--code ImageUri=\${ACCOUNTID}.dkr.ecr.\${REGION}.amazonaws.com/func1@\${DIGEST} \
--role ${ROLE_ARN}

コンテナLambdaは新しくサポートされた機能なので、バージョンは最新化すべきですね。

2.1.5と2.1.6の必須パラメータの違い
bash
#必須項目が変わっているので、2.1.5以前でコンテナLambda作成コマンドを叩くとエラーになります

docker run --rm -ti -v ~/.aws:/root/.aws amazon/aws-cli:2.1.5 lambda create-function help
#コマンド結果抜粋
SYNOPSIS
    create-function
  --function-name <value>
  --runtime <value>
  --role <value>
  --handler <value>
  [--code <value>]
  [--description <value>]

docker run --rm -ti -v ~/.aws:/root/.aws amazon/aws-cli:2.1.6 lambda create-function help
#コマンド結果抜粋
SYNOPSIS
    create-function
  --function-name <value>
  [--runtime <value>]
  --role <value>
  [--handler <value>]
  [--code <value>]
  [--description <value>]

amazon/aws-cliでawsコマンドを実行していると環境変数が正しくセットされない

REGION=\$(aws configure get region)
ACCOUNTID=\$(aws sts get-caller-identity --output text --query Account)

amazon/aws-cliを利用した場合としない場合で出力結果が違うよう。

ローカルのawscliとamazon/aws-cliの出力結果の違い
bash
#amazon/aws-cliを利用すると余計な内容が出力されているので、amazon/aws-cliの実行結果を直接環境変数に入れると、環境変数を使う際にコマンド実行エラーが起きる
#amazon/aws-cliを使ってもよいやり方があるのかも知れないですが、今回はローカルにawscliを入れて実行しました。

alias aws
#aliasがない状態
aws sts get-caller-identity --output text --query Account | cat -e
#コマンド結果
XXXXXXXXXXXX$

alias aws='docker run --rm -ti -v ~/.aws:/root/.aws amazon/aws-cli:2.1.32'
aws sts get-caller-identity --output text --query Account | cat -e
#コマンド結果
^[[?1h^[=^MXXXXXXXXXXXX^[[m^M$
^M^[[K^[[?1l^[>%

IAMRoleのポリシー不足で権限エラー

できるだけ最小権限で実行したく、ポリシーを見直しました。

今回設定したポリシー
bash
"ecr:BatchCheckLayerAvailability"
"ecr:BatchDeleteImage"
"ecr:CompleteLayerUpload"
"ecr:CreateRepository"
"ecr:DeleteRepository"
"ecr:GetRepositoryPolicy"
"ecr:InitiateLayerUpload"
"ecr:ListImages"
"ecr:PutImage"
"ecr:SetRepositoryPolicy"
"ecr:UploadLayerPart"
"iam:CreateRole"
"iam:DeleteRole"
"iam:PassRole"
"lambda:CreateFunction"
"lambda:DeleteFunction"
"lambda:InvokeFunction"

コンテナLambdaをデプロイしてみる

ここはAWS builders-flashと同じなので、ここには記載しません。

不要リソースを削除

試したあとはリソース削除しておきたいので削除コマンドを記載。

bash
aws lambda delete-function --function-name func1
aws lambda delete-function --function-name func1-container
aws ecr delete-repository --repository-name func1 --force
aws iam delete-role --role-name lambda-ex
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TerraformでAWS RDSのDBユーザを管理する

はじめに

MySQLやPostgreSQLのユーザをTerraformで管理するときの備忘録としてこの記事を残します。

前提条件

基盤はAWS、DBはPostgreSQLでDBがいるネットワークは内部ネットワークでインターネットのアクセスがないです。TerraformはローカルPC(Mac)から実行するものとします。

実行方法

Terraform

こちらのPostgreSQL用のTerraform providerを使い実行します。

provider "postgresql" {
  scheme   = "awspostgres" # AWSを使う場合はこれを指定
  host     = var.db_host
  username = "postgres"
  port     = 5432
  password = var.db_password

  superuser = false
}

バージョンはこのように指定します。

  required_providers {
    postgresql = {
      source  = "cyrilgdn/postgresql"
      version = "1.11.2"
    }
  }

PostgreSQLのユーザを追加します。

resource "postgresql_role" "my_role" {
  name     = "my_role"
  login    = true
  password = var.my_role_password
}

resource "postgresql_grant" "readonly_my_role" {
  database    = "test_db"
  role        = postgresql_role.my_role.name
  schema      = "public"
  object_type = "table"
  privileges  = ["SELECT"]
}

ローカル

ローカルから直接PostgreSQLを触ることはできないので、踏み台サーバを経由してSSHトンネリングすることで、アクセスします。
image.png

sshトンネリング用のコマンドを実行します。

# ssh -N -L [ローカル側で転送に使用するPort(10000〜60000)]:[DBのHostName]:[DBが解放しているPort] -i [IdentityFile(秘密鍵のパス)] -p [踏み台が解放しているPort] [踏み台のUser]@[踏み台のHostName]

ssh -N -L 5432:test_db.XXX.ap-northeast-1.rds.amazonaws.com:5432 -i ~/.ssh/bastion.pem -p 22 ec2-user@XXX

後述するSSL証明書エラーになるので、ホストを偽装します。
/etc/hostslocalhost 127.0.0.1 test_db.XXX.ap-northeast-1.rds.amazonaws.com を追加してください。

これでTerraformを実行するとPostgreSQLへのユーザ追加ができます。

Tips

SSL証明書エラー

上記に記載されているsshトンネリングコマンドを実行し、

ssh -N -L 5432:test_db.XXX.ap-northeast-1.rds.amazonaws.com:5432 -i ~/.ssh/bastion.pem -p 22 ec2-user@XXX

sshトンネリングで localhost5432ポートにアクセスするとPostgreSQLにアクセスできるようになったので、Terraformのproviderのhost名を locahostに指定して、Terraformを実行させます。

provider "postgresql" {
  scheme   = "awspostgres" # AWSを使う場合はこれを指定
  host     = "localhost"
  username = "postgres"
  port     = 5432
  password = var.db_password

  superuser = false
}

そうすると、SSL証明書の確認でホスト名が異なるとエラーが出てしまいます。

Error: error detecting capabilities: error PostgreSQL version: x509: certificate is valid for stg-knew-rds.coh5dxpjppgc.ap-northeast-1.rds.amazonaws.com, not localhost

セッションマネージャーを使ったポートフォワード

セッションマネージャーを使ってポートフォワードができないかと調べたが、
結局ポートフォワードはできなかった。

cf. https://dev.classmethod.jp/articles/port-forwarding-using-aws-system-manager-sessions-manager/

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

ChaliceとCloud9の連携方法について記載してみます(AWS)

はじめに

みなさんChaliceはご存知でしょうか?AWSでサーバレスアプリケーションを構築する際に、爆速の開発効率を誇るフレームワークです。
今回はこのChaliceを使い、AWS謹製のIDEであるCloud9上で開発を行うための手順について記載したい思います。

Chaliceとは何か?

上にも記載していますが、ChaliceはAWSが開発したサーバレスアプリケーション向けのフレームワークです。Python向けのライブラリとして提供されており、pipでインストールができます。
サーバレスフレームワークと言えばSAMやAmplifyなんかもありそれぞれ一長一短ありますが、こと開発効率においてはChaliceの右に出るものはいないと思います。(たぶん。。)
Chaliceはコマンド一発でAPI Gateway + Lambdaの環境を構築できてしまう優れものです。ゴチャゴチャ書く前にまずはサンプルコードを見て頂きましょう。

from chalice import Chalice
app = Chalice(app_name='example')

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

Chaliceでプロジェクトを作成した際に自動生成される、HELLO WORLD用のサンプルアプリケーションです。エンドポイント(/)にアクセスすると簡単なJSONを返してくれます。
このアプリケーションのデプロイ方法ですが、以下の通りコマンド一発でできてしまいます。(Linuxコンソールでの例です)

$ chalice deploy

これだけで必要なLambda関数だけでなく、API Gatewayまで勝手に作ってくれます。感激です。
エンドポイントを複数切りたい場合はこんな感じに書きます。

from chalice import Chalice
app = Chalice(app_name='example')

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

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

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

これだけで /、 /hoge、 /fuga という3つのエンドポイントが作れてしまいます。最高。。
というわけで、Chaliceに興味を持たれて詳しく知りたくなった方は以下AWSのBlackBeltをご覧ください。できれば動画で見るのがよいと思います。理解度が全然違いますので。

Cloud9とは何か?

AWS謹製の統合開発環境(IDE)です。ブラウザ上で動き、AWSコンソールにログインするだけで使えてしまうので場所を選ばずに開発を行うことができます。ブラウザさえあれば何とかなるので端末も問いません。スタバでコーヒー片手にiPadで優雅にコーディング、なんてこともできてしまいます。
詳細については言わずもがなのBlackBeltを参照ください。動画も貼っておきます。

Cloud9上でChaliceを動かしてしまおう

そんな素敵なChaliceとCloud9ですので、当然連携して使いたくなります。というわけで以下、手順をしたためていきたいと思います。
ちなみにこの手順はChalice + Cloud9でシステム開発案件を行った2020年7月頃の情報に基づいており、さらにPython初心者(Java屋)の私が知識ゼロから手探りで調べて対応したものです。間違ってるよ! とか もっといいやり方あるよ! とかあればお気軽にご指摘頂けると助かります。

Cloud9環境の作成

まずはCloud9環境を作成します。トップメニューからCloud9コンソールに遷移し、画面上の「Create environment」をクリックしてあとはポチポチするだけです。最初に決める名前以外は全てデフォルトでもOKなので、ここで何か迷うことはないと思います。
Cloud9環境を立ち上げると、内部的には専用のEC2インスタンスが割り当てられ、このインスタンス上でCloud9が実行されることになります。

Cloud9用のロール作成と付与

Cloud9にはAMTCという機能が用意されており、デフォルトでONになっています。AMTCにより、AWSコンソールにログインしたユーザと概ね同じ権限がCloud9(のEC2)に与えられるため便利なのですが、全権限が付与されるわけではなく、IAMなどの一部については制限がかかるようです。
この状態ではChaliceが使えないため、AMTCをOFFにして専用のIAMロールをEC2へ割り当てていきたいと思います。

IAMロールの作成

IAMコンソールから新規ロールを作成します。流れは以下の通りです。

  • IAMコンソールにアクセスし、左メニューの「ロール」を選択し、画面内に表示される「ロールの作成」をクリックします。
  • 続いて表示される画面で「信頼されたエンティティの種類」に「AWSサービス」を、「ユースケースの選択」に「EC2」を選択して「次へ」をクリックします。
  • 次の画面でロールを選択します。ここではAdministratorAccessを選択した前提で話を進めますが、必要に応じて権限レベルは見直してください。選択後「次へ」をクリックします。
  • 次の画面でタグを指定します。何も入れなくてOKです。
  • 最後にロール名を指定します。任意の文字列を入力後、「ロールの作成」をクリックすれば終了です。

ロールのEC2へのアタッチ

上記で作成したロールをCloud9用のEC2インスタンスへ割り当てます。流れは以下の通りです。

  • EC2コンソールにアクセスし、左メニューの「インスタンス」を選択します。
  • インスタンス一覧が表示されるので、Cloud9用のEC2を選択し、「右クリック→セキュリティ→IAMロールを変更」を選択します。なおCloud9で生成したインスタンス名には「aws-cloud9-」の接頭語が割り当たるようです。
  • IAMロールの割り当て画面が表示されますので、先ほど作成したロールを選択し、「保存」ボタンをクリックします。

Cloud9でのAMTCを無効化

先程記載した通り、デフォルトONになっているAMTCを無効化します。
Cloud9のコンソールを開き、「アイコン(9の雲マーク)→Preference」を選択します。
010.png

設定画面が開くので、左メニューの「AWS Settings→AWS Resources」を選択。「AWS managed temporary credentials」をOFFにします。
020.png

Cloud9に対し、デフォルトリージョンを設定

AMTCを無効化すると、リージョンの設定もなくなってしまうようなので、以下の手順に従い設定を入れます。
まずは左メニューからトップ階層のディレクトリを右クリックし、「Open Terminal Here」を選択します。これによりCloud9コンソールからEC2インスタンスに対してSSHアクセスできます。超便利。
030.png

コンソールはこんな感じです。
040.png

コンソール上で「aws configure list」を実行します。以下の通り、リージョンの割り当てはありません。

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************V6LL         iam-role    
secret_key     ****************PW2P         iam-role    
    region                <not set>             None    None

設定ファイルの有無を確認します。初期状態であればたぶん存在しないはずです。

$ ll -a ~/.aws/
total 4
drwxr-xr-x  2 ec2-user ec2-user    6 Mar 29 01:52 .
drwx------ 13 ec2-user ec2-user 4096 Mar 29 01:36 ..

というわけで作成します。

$ vi ~/.aws/config
※以下入力して保存(:wq)
[default]
region = ap-northeast-1

$ ll ~/.aws/
total 4
-rw-rw-r-- 1 ec2-user ec2-user 36 Mar 29 02:01 config

$ cat ~/.aws/config 
[default]
region = ap-northeast-1

リージョン設定が完了しましたので、再確認します。ちゃんと入ってくれたようです。

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************V6LL         iam-role    
secret_key     ****************PW2P         iam-role    
    region           ap-northeast-1      config-file    ~/.aws/config

Chaliceのインストール

引き続きCloud9のターミナルで作業していきます。
カレントディレクトリを確認します。/home/ec2-user/environment にいなければ移動してください。

$ pwd
/home/ec2-user/environment

ChaliceをEC2インスタンスへインストールします。

$ sudo pip install chalice
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip install --user` instead.
Collecting chalice
  Downloading https://files.pythonhosted.org/packages/26/de/79e471e7eb590586880b0e90f29742881eb60dffdc2fcb3e340db5f13367/chalice-1.22.3-py2.py3-none-any.whl (384kB)
~~~(略)~~~
Installing collected packages: wcwidth, blessed, readchar, python-editor, inquirer, attrs, click, wheel, typing, mypy-extensions, chalice
Successfully installed attrs-20.3.0 blessed-1.17.6 chalice-1.22.3 click-7.1.2 inquirer-2.7.0 mypy-extensions-0.4.3 python-editor-1.0.4 readchar-2.0.1 typing-3.6.4 wcwidth-0.2.5 wheel-0.36.2

無事インストールされました。続けてChalice用のプロジェクトを作成します。以下のコマンドをコンソール上で実行するだけでOKです。ここでのプロジェクト名はとりあえず helloworld にしました。
 chalice new-project [プロジェクト名]

$ chalice new-project helloworld
Your project has been generated in ./helloworld

プロジェクトができました。フォルダ構成とデフォルトで作成されるサンプルアプリ(app.py)はこんな感じです。
050.png

サンプルアプリをデプロイしてみます。以下の通り、コマンド一発でAPI GatewayとLambdaが自動作成されます。ステキ。。なお、デプロイ前にコンソール上でプロジェクトフォルダへ移動する必要があるのでご注意ください。

$ cd helloworld/
$ chalice deploy
Creating deployment package.
Reusing existing deployment package.
Creating IAM role: helloworld-dev
Creating lambda function: helloworld-dev
Creating Rest API
Resources deployed:
  - Lambda ARN: arn:aws:lambda:ap-northeast-1:123456789:function:helloworld-dev
  - Rest API URL: https://xxxxxx.ap-northeast-1.amazonaws.com/api/

上記結果の最終行にAPIのURLが記載されています。このURLからAPIをキックすることができるので、コンソールからCurlコマンドで試してみます。

$ curl https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/api/
{"hello":"world"}

無事JSONが返却されました。とても楽ちんで素晴らしいですね。
テストが終わったらAPI GatewayとLambdaは消しておきましょう。これもコマンド一発です。

$ chalice delete
Deleting Rest API: xxxxxxxxxx
Deleting function: arn:aws:lambda:ap-northeast-1:123456789:function:helloworld-dev
Deleting IAM role: helloworld-dev

最後に

Cloud9+Chaliceの連携方法と簡単な使い方だけ記載しました。次回以降はもうちょっと踏み込んだ内容を解説できればと思っています。

今回の記事が誰かのお役に立てると幸いです。

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

RDSの自動起動と自動停止スクリプト

RDSは起動しっぱなしだとお金がかかる。

しかし、停止しても7日後に再度起動してしまう。

特に検証用とかで使用しない間が多い場合、いちいち起動したら停止するという運用はかなり面倒。

そのため、検証時以外は、起動したらすぐ停止するというスクリプトを作成して、無駄なコストがかからないようにする。

そこで使用するのが、AWSのLambdaを使う。

Lambdaとは何?

Lambdaと聞いてもわからないので調べた。

AWSの「サーバレスコンピューティングとアプリケーション」と言われる。

これまではPHPやPythonをうごかすためのwebサーバーが必要だったが、Lambdaならサーバーレスのため、サーバーを準備しなくても環境が揃っていると言うことである。

image.png

LambdaはJava、Node.js、C#、Pythonのプログラミング言語に対応しているので、各種「機能」(プログラム)はこの言語で開発すればOK、ということのようです。

「S3にアップされた画像のサムネイル化」で考えると、S3に画像ファイルがアップされるのを監視するためのサーバを用意して、監視し続けるプログラムを用意して、ファイルがアップされたことを検知したら、リサイズする処理を行う必要があったのが、Lambdaならこの「リサイズする処理」だけを作ればOKということ。

今回はこのLambdaを利用し、指定された時間に関数を実行すると言うことを実装し、RDSの起動停止を自動で実施する。

流れ

IAMによるロール(権限)作成

IAMページでロールの作成を実施。

「信用されたエンティティの種類を選択」については、「AWS サービス」を選択。「このロールを使用するサービスを選択」は「Lambda」を選択します。

https://www.t3a.jp/wp-content/uploads/2019/09/rds_auto_start_stop_iam3-1024x480.jpg

Attach(アタッチ)する権限ポリシーは、

・CloudWatchFullAccess

・AmazonRDSFullAccess

Lambdaの設定でStartとStopの関数を作成

Lambdaで関数を作成する。関数はStartとStopの二つ。

スクリプトは下記を登録する。

import boto3

region = 'ap-northeast-1'

instance = 'RDSインスタンス名'
def lambda_handler(event, context):
    rds = boto3.client('rds', region_name=region)
    rds.start_db_instance(DBInstanceIdentifier=instance)
    print('started instance: ' + instance)
import boto3

region = 'ap-northeast-1'

instance = 'RDSインスタンス名'
def lambda_handler(event, context):
    rds = boto3.client('rds', region_name=region)
    rds.stop_db_instance(DBInstanceIdentifier=instance)
    print('stoped instance: ' + instance)

また、関数起動を自動でやるため、cronで動かすようにも設定する。

cronによる起動はトリガーの追加で「CloudWatch Events」を選択する。

〇RDS の起動時間

cron(15 23 */6 * ? *)

〇RDS の停止時間

cron(45 23 0/6 * ? *)

テスト

起動が大丈夫かをテストできる。

失敗したらスクリプトをチェックする。

RDS 自動停止を実装する際の実行時間の考え方

設定に関して少し蛇足になりますが、RDS インスタンスが7日後に再起動する仕様について。

コストを下げる基本的な考え方として、AWS 側のシステムで再起動を発生させないことが良いと思います。

そのため一定時間ごとに RDS を起動して1時間以内に停止命令を送る実装をすれば良いです。

※aws は1時間以内の起動時間は1時間の使用としてコストが計上されるため

そこで今回は6日間隔で1時間以内の起動と停止を繰り返す設定を行っています。

つまり毎月1日、7日、13日、19日、25日、29日にスクリプトを実行します。

参考記事

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

AWS認定セキュリティ(SCS)を取得しました

AWS認定セキュリティ(SCS)を受験し無事合格しました。
資格取得までに参考にしたものを投稿します。

 2021-03-29 8.42.40.jpg

私のAWSの知識

以下の4資格を取得しています。
- クラウドプラクティショナー
- ソリューションアーキテクト
- デベロッパーアソシエイト
- SysOpsアドミニストレータ

業務では、EC2,RDS,Lambda,S3を軽く触っている程度になります。
AWSサービスをガッツリ使うことは基本ありません。

勉強時間

30時間程度だと思います。(1日1時間を1ヶ月)

試験範囲の確認

要点整理から攻略する『AWS認定 セキュリティ-専門知識』を読む

めちゃくちゃ良かったです。
試験で出るサービスがほぼ網羅されていると思います。

サービスに対しての説明は少し不足していると思うので、BlackBeltや公式サイトで補完した方がよいと思います。

チュートリアルのリンクとかもあるので、
実際手を動かして試すことも良いと思います。

公式の模擬試験を受ける

他の試験を合格していたので、無料で受けることができました。
自分の苦手分野や出題傾向の雰囲気を掴むことができると思います。

AWS公式のトレーニング(無料)を受ける

模擬試験や章末問題は必ず理解した方が良いです。
https://www.aws.training/Details/eLearning?id=45684

Black Beltを見る

AWS Black Beltリンク

以下のサービスのは見といたほうがよいと思います。(重要そうな順に並べました)

  • IAM
  • KMS
  • S3
  • CloudWatch
  • AWS Config
  • SystemsManager
  • Cognito
  • CloudFront
  • AWS WAF
  • Trusted Advisor
  • Athena
  • Shiled
  • Detective
  • Lambda
  • GuradDuty
  • Macie
  • CloudTrail
  • Active Directory
  • AD Connector

試験を受けての感想

AWSの裏側の暗号化の扱い方や、セキュアなインフラ構成など、
広く知ることができたので、とても良い試験だと思います。

試験中はそんなに迷う問題も無く、高得点で終えられたの良かったです。

その他、勉強中に重要そうと思ったまとめ

  • KMSのキーポリシー
  • KMSのCMK自動ローテーション
  • KMSのEncryption Context
  • KMSのインポートキー
  • S3のぼーるとロック
  • CloudFrontのルール
  • ALBにアクセスする古いOS(Windows XPとか)の挙動
  • CloudFrontとALBの証明書の設置
  • VPCフローログの見方
  • CloudTrailのデフォルトで保持してくれる期間と、その期間過ぎた後のログの扱い
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SSLの独自ドメイン静的Webサイトを低コストで15分で立ち上げる (Route53 + S3 + CloudFront + AWS Certificate Manager)

こんな人向け

  • VPSよりAWS使うのが好きな人
  • 静的WebサイトなのにわざわざEC2立てて運用している人
  • 現在S3で静的Webサイトを公開しているけどSSLに対応していない人
  • AWS使ってみたいけどハードルが高そうと思っている人
  • そもそもwebサイトをインターネットに公開するのが初めてな人

今回、タイトル通りの構成で静的Webサイトをネット上に公開するやり方を紹介していきます。
高可用性・高耐久性の爆速Webサイトが多分15分くらいでできちゃいます。

この構成は世の中に沢山記事が出ていますが、
独自にハマったこともあるため防備録として記事にすることにしました。

この記事でやらないこと

  • お名前.com等での独自ドメインの取得方法、ネームサーバーの変更方法
  • awsのアカウント作成
  • awsのIAMの設定
  • 各サービスの詳細な説明
  • 各種チューニング

前準備

独自ドメインの取得。
今回はRoute53で取得しました。

本題

以下、順番にやっていきます。

Route53でホストゾーンを作成する(Route53でドメインを取得した場合は省略)

Route53 >> ホストゾーン
に入り「ホストゾーンの作成」をクリックします。

image.png

ドメイン名に取得した独自ドメインを入力し、他はデフォルトのまま「ホストゾーンを作成」を押下。

image.png

このように2件のレコードが入った状態で作成されます。
image.png

Route53でドメインを取得した場合、この状態が自然と出来上がっています。

独自ドメインのネームサーバーをRoute53に向ける

当記事はRoute53でドメイン取得しちゃったので省略しますが、
お名前.com等でドメインを取得している場合、
ドメインの管理画面からネームサーバーを変更する必要があります。
ドメインを取得した会社のデフォルトのネームサーバーになっていると思いますので、
ホストゾーンのNSレコードに表示されている4件のネームサーバーに変更します。

変更のやり方はネットに情報が溢れていますので、
「お名前.com DNS変更」とかでググってください。

S3バケットの作成

実際のコンテンツをいれるバケットを作成します。
S3に入り「バケットの作成」をクリック

image.png

バケット名に独自ドメインを入力
リージョンは日本で運用するなら東京か大阪を選択したいところですが、
初めてのお試し段階では段階ではバージニア北部を選択するのが無難です(※理由は後述)
image.png

他はすべてデフォルトのまま作成します。
S3を静的Webサイトとしてホスティングする場合、
パブリックアクセスを有効にしたりしますが、今回の構成ではパブリックアクセスはブロックのままで大丈夫です(むしろブロックしててください)

S3にファイルをアップロード

作成したバケットを選択して、ページから簡単にアップロードできます

image.png

SSL証明書の作成

CertificateManagerに入り、リージョンをバージニア北部に変更します。
このリージョン変更は必ず行います
S3のバケットが東京や大阪にある場合でも、SSL証明書の作成はバージニア北部で行います。

image.png

パブリック証明書のリクエスト で次へ

image.png

ドメイン名に独自ドメインを。
別名に*.独自ドメインを設定し次へ
今回「www.独自ドメイン」でもアクセスさせたいので別名を追加しています。
*.独自ドメインでも単にwww.独自ドメインでも大丈夫です。

image.png

DNSの検証で次へ

image.png

タグは別にいらないのでそのまま次へ

image.png

そのまま確定とリクエスト

image.png

ここでそのまま続行せずに表示されているドメイン名をクリックします。

image.png

ここでRoute53でのレコード作成をします。
別名が複数ある場合はすべてに対して行います。

image.png

少し待って、このように、お客様によるアクションは必要ありませんと表示されたらラッキーです。
すべてがうまく行っています。
image.png

以下のように追加のアクションが必要ですと表示された場合は、ガイドに従って必要なアクションをしてください。
image.png

ドメイン管理サイトのネームサーバーの変更に時間がかかっている場合もこうなります。
間違っている気がしない場合は少し時間を置いてみましょう。

続行してしばらく待つとこのようにステータスが発行済になります。

image.png

Route53でホストゾーンを見るとCNAMEレコードが追加されています。

CroudFrontの作成

サービス一覧からCloudFrontに入りCreateDistributionをクリック
image.png

以下のように設定します。

Origin Domain Name:作成したs3バケットを選択
Restrict Bucket Access:Yes
Origin Access Identity:Create a New Identity
Grant Read Permissions on Bucket: Yes,Update Bucket Policy
Viewer Protocol Policy:Redirect HTTP to HTTPS
Cache Policy:Managed-ChathingDisabled
Alternate Domain Names(CNAMEs):独自ドメインと、独自ドメインの別名
SSL Certificate:Customを選択し、作成したSSL証明書を選択
Default Root Object:index.html

Origin IDは自動で入ります。

※CloudFrontの売りであるキャッシュをここで無効にしているのは、理由があります。
初めての構築でハマることもあると思います。
他の設定も色んなところを弄って遊んでみることもあると思います。
その時に、キャッシュが効いていたら設定した内容の動きをしているのか、していないのかさっぱりわからない状況になってしまいます。
変にイジって動かなくなって、頑張って戻してやっと成功したと思って時間が立ったらまた動かなくなってる。みたいなこともあるかと思います。
いつぞやのたまたまうまくいっている設定がキャッシュされているパターンですね。

ですので、スタートアップ時はキャッシュを無効にしておいて、運用開始直前でキャッシュを有効にするのがいいです。

image.png
image.png
image.png
image.png

ここで選択するSSL証明書はバージニア北部のリージョンで作成したものしかリストアップされません。
SSL証明書をバージニア北部で作成する必要があったのはこのためです。

Restrict Bucket Accessで作成したアクセスポリシーがs3バケットに反映されていると思います。
見てみましょう。
サービスからS3 -> 作成したバケット -> アクセス許可

image.png

これでS3自体はパブリックアクセスをすべてブロックしていて、静的ウェブサイトホスティングも有効にしていませんが、
CloudFrontからはアクセスできるようになります。

Route53の設定(独自ドメインへのアクセスをCloudFrontに向ける)

作成したホストゾーンに入り、「レコードの作成」をクリック

image.png

以下のように作成

image.png

エイリアスで作成したCloudFrontが選択できるようになっています。

wwwも受ける。CNAMEとかではエイリアスが出てこないのでAレコードでwwwなしを指定してます。

image.png

以上で終わりです。
スムーズにいけばおそらく15分〜30分程度で完了したんではないでしょうか?
独自ドメインでweb上に公開されているか確認しましょう。

大丈夫そうなら運用開始前に忘れずにCloudFrontのキャッシュを有効化してください。
以下のようにキャッシュポリシーを変更します。

image.png
image.png

料金について

それぞれのサービスで従量課金の利用料がかかりますが、
アクセスの少ない個人営業飲食店などのサイトだったらほとんど無料枠でいけちゃうと思います。
行っても月1000円程度?もっと安いか。
アフィリエイト入れているサイトなら仮に運用費が高くついても収入と比べて赤字になることは無いと思います。
ちゃんと試算していませんので気になる方は公式の料金表や試算している方のサイトをご覧ください。

公式の料金表ページを貼っておきます。

certificate-managerは無料です。つまりSSLは無料。

10年前ならコストが高いリッチな構成が今ではただみたいな料金でできます。
時代の進化はすごいですね。

おまけ

CloudFrontのキャッシュクリア方法

Invalidationsからキャッシュを削除したいパスを入力します。
すべて削除するなら /* のように入力します。
image.png

こちらは無料枠がありますが、無料枠を超えるとファイル毎に料金がかかりますのでお気をつけください。
悲しいお話を見つけました。

S3を北部バージニアで作成した理由

詳しくはS3+CloudFrontでS3のURLにリダイレクトされてしまう場合の対処法をご参照ください。

自分も一回ハマりました。

別にすぐ解決できるから好きなリージョンで作ればいいと思いますが、
チュートリアルであまりコケて諦めてほしくないのでS3のリージョンをバージニア北部に指定しました。
SSLがバージニア北部で作成する必要があるので合わせた方がわかり良いかなという思いもあります。

日本での運用では大阪か東京にすると思いますが、
正直CloudFrontが前にいるので別にバージニアでいい気がします。

最後に

簡単でしたか?
S3のホスティング機能でWebサイトを公開している方は沢山いると思いますが
S3ってsslつけれないんですよね。
最近のブラウザはsslじゃないとすぐ煽ってくるのでSSL化が当たり前の時代になっています。
この機会にチャレンジしてみてはいかがでしょうか。

気に入った所

・すごい構成なのに安い
・簡単(いらんことしてハマらなければ)

気に入らない所

・www有りはwww無しにリダイレクトしたいけど、このままの構成ではできない
・S3へのアップロードが昔ながらのFTPで上げているみたいでなんかいやだしめんどくさい(上げ漏れとか起きそう)
 でもWebデザイナーさんにも使えるようになってほしい構成なのでAWS CLIを使わせるのは気が引ける

このあたりは解決策がありますのでまた記事をあげようと思います。

その他

モザイク処理が面倒くさかった。次はしない(かも)

特に参考にさせていただきました。

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

SAMでSlack通知Lambdaをデプロイ

はじめに

AWS Lambda Container Image Support や EventBridgeのcron設定、Secrets Managerからシークレット情報の取得を試してみたかったので、以下のような構成図で一気に試してみます。

構成図

  • SAMでSlackにメッセージを通知するLambdaをデプロイする
  • Lambdaはイメージ化してECRで管理する
  • LambdaはEventBridgeで定期実行する
  • SlackのWebhook URLをSecrets Managerで管理する

sam.png

手順

  1. ECRにリポジトリを作成しておく
  2. Secrets ManagerにSlackのWebhook URLを設定する
  3. sam initでテンプレート作成
  4. template.yamlの修正
  5. Slackにメッセージ通知するLambda関数を作成
  6. デプロイ
  7. テスト

1. ECRにリポジトリを作成しておく

イメージのプッシュ先のリポジトリを事前に登録しておきます。
screencapture-ap-northeast-1-console-aws-amazon-ecr-repositories-private-901071604628-notify-slack-edit-2021-03-29-02_14_19.png

2. Secrets ManagerにSlackのWebhook URLを設定する

SlackのWebhook URLをSecrets Managerに登録します。
スクリーンショット_2021-03-29_2_18_58(3).png

設定が完了すると、シークレット情報取得のサンプルコードが確認できるので、後でこれをベースにLambda関数を実装します。
スクリーンショット 2021-03-29 2.24.31(3).png

3. sam initでテンプレート作成

事前準備ができたので、次はSAMのテンプレートを作成していきます。

適当にディレクトリを作成し、$ sam init を実行します。

$ sam init
Which template source would you like to use?
    1 - AWS Quick Start Templates
    2 - Custom Template Location
Choice: 1
What package type would you like to use?
    1 - Zip (artifact is a zip uploaded to S3)
    2 - Image (artifact is an image uploaded to an ECR image repository)
Package type: 2

Which base image would you like to use?
    1 - amazon/nodejs14.x-base
    2 - amazon/nodejs12.x-base
    3 - amazon/nodejs10.x-base
    4 - amazon/python3.8-base
    5 - amazon/python3.7-base
    6 - amazon/python3.6-base
    7 - amazon/python2.7-base
    8 - amazon/ruby2.7-base
    9 - amazon/ruby2.5-base
    10 - amazon/go1.x-base
    11 - amazon/java11-base
    12 - amazon/java8.al2-base
    13 - amazon/java8-base
    14 - amazon/dotnet5.0-base
    15 - amazon/dotnetcore3.1-base
    16 - amazon/dotnetcore2.1-base
Base image: 10

Project name [sam-app]: notification

Cloning app templates from https://github.com/aws/aws-sam-cli-app-templates

    -----------------------
    Generating application:
    -----------------------
    Name: notification
    Base Image: amazon/go1.x-base
    Dependency Manager: mod
    Output Directory: .

    Next steps can be found in the README file at ./notification/README.md

先ほど作成したECRにイメージをプッシュしたいので、 What package type would you like to use?2 - Image (artifact is an image uploaded to an ECR image repository) を選択します。
ランタイムについては、goを選択しました。

$ sam init 実行後のディレクトリ構成は以下です。(notificationディレクトリを作成し、その配下で $ sam init を実行しています。)

notification/
├── README.md
├── samconfig.toml
├── hello-world
│   ├── Dockerfile
│   ├── go.mod
│   ├── go.sum
│   ├── main.go
│   └── main_test.go
└── template.yaml

package typeにimageを選択したため、Dockerfileが作成されています。
中身は以下のようになっています。

Dockerfile
FROM golang:1.14 as build-image

WORKDIR /go/src
COPY go.mod main.go ./

RUN go build -o ../bin

FROM public.ecr.aws/lambda/go:1

COPY --from=build-image /go/bin/ /var/task/

# Command can be overwritten by providing a different command in the template directly.
CMD ["hello-world"]

4. template.yamlの修正

次に、$ sam init で作成されたtemplate.yamlに修正を加え、以下のようになりました。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: notify slack

Globals:
  Function:
    Timeout: 5

Resources:
  SlackRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        - PolicyName: "GetSecretsPolicy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                  - "secretsmanager:GetSecretValue"
                Resource: "*"
  SlackFunction:
    Type: AWS::Serverless::Function
    Properties:
      Role: !GetAtt SlackRole.Arn
      PackageType: Image
      Events:
        Notification:
          Type: Schedule
          Properties:
            Schedule: cron(0 0 * * ? *) # JST 9:00
    Metadata:
      DockerTag: go1.x-v1
      DockerContext: ./slack
      Dockerfile: Dockerfile

Outputs:
  SlackFunction:
    Description: "Notify Slack Lambda Function ARN"
    Value: !GetAtt SlackFunction.Arn
  SlackFunctionIamRole:
    Description: "Implicit IAM Role created for Slack function"
    Value: !GetAtt SlackRole.Arn

大きな修正点としては以下です。

  • Role
  • 実行スケジュール

Role
デフォルトで生成されるCloudWatch用のポリシーに、 Secrets Managerからシークレット情報取得用のsecretsmanager:GetSecretValueを加えたロールを作成します。
(ロールの設定をここで記述しない場合、デフォルトでLambda実行に必要なロールが付与されます。)

Resources:
  SlackRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: lambda.amazonaws.com
            Action: "sts:AssumeRole"
      Policies:
        - PolicyName: "GetSecretsPolicy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: Allow
                Action:
                  - "logs:CreateLogGroup"
                  - "logs:CreateLogStream"
                  - "logs:PutLogEvents"
                  - "secretsmanager:GetSecretValue"
                Resource: "*"
  SlackFunction:
    Type: AWS::Serverless::Function
    Properties:
      Role: !GetAtt SlackRole.Arn

実行スケジュール

EventBridgeのスケジュールをトリガーにしたいので、以下のように設定します。

Events:
  Notification:
    Type: Schedule
    Properties:
      Schedule: cron(0 0 * * ? *) # JST 9:00

5. Slackにメッセージ通知するLambda関数を作成

Secrets ManagerからSlackのWebhook URLを取得して、Slackにメッセージを送信します。

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
    "net/url"

    "github.com/aws/aws-lambda-go/lambda"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/secretsmanager"
)

// Secrets Managerで設定したキーとリージョン
var (
    secretName string = "SlackWebhookUrl"
    region     string = "ap-northeast-1"
)

type SlackEvent struct {
    Text string `json:"text"`
}

func Modify(se *SlackEvent) {
    se.Text = "test message"
}

// シークレット情報取得用function
func getSecret() (string, error) {
    svc := secretsmanager.New(session.New(),
        aws.NewConfig().WithRegion(region))

    input := &secretsmanager.GetSecretValueInput{
        SecretId:     aws.String(secretName),
        VersionStage: aws.String("AWSCURRENT"),
    }

    // GetSecretValue関数にキー名を渡して、値を取得
    result, err := svc.GetSecretValue(input)
    if err != nil {
        return "", err
    }

    // SecretString配下にJSON形式でシークレット情報がレスポンスされます
    secretString := aws.StringValue(result.SecretString)
    res := make(map[string]interface{})
    if err := json.Unmarshal([]byte(secretString), &res); err != nil {
        return "", err
    }

    return res["WEBHOOK_URL"].(string), nil
}

func handler() error {
    webhoolUrl, err := getSecret()
    if err != nil {
        return err
    }

    se := &SlackEvent{}
    Modify(se)

    params, err := json.Marshal(se)
    if err != nil {
        return err
    }

    // slackにメッセージ送信
    resp, err := http.PostForm(
        webhoolUrl,
        url.Values{"payload": {string(params)}},
    )
    if err != nil {
        return err
    }

    body, _ := ioutil.ReadAll(resp.Body)

    defer resp.Body.Close()

    fmt.Printf("response code:%s, response body:%s, hook:%s\n", resp.Status, body, webhoolUrl)

    return nil
}

func main() {
    lambda.Start(handler)
}

6. デプロイ

ここまで設定ができたら、デプロイしていきます。
$ sam build$ sam deploy の順に実行します。

修正内容に不備がなければ、以下のように$ sam build が成功します。

Build Succeeded

Built Artifacts  : .aws-sam/build
Built Template   : .aws-sam/build/template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided

ビルドが完了したら、$ sam deploy を実行してデプロイします。
はじめての実行の場合、以下のように --guided オプションを付けることで、対話形式でデプロイの設定ができるので便利です。

$ sam deploy --guided

Configuring SAM deploy
======================

    Looking for config file [samconfig.toml] :  Found
    Reading default arguments  :  Success

    Setting default arguments for 'sam deploy'
    =========================================
    Stack Name [notify-slack]:
    AWS Region [ap-northeast-1]:
    Image Repository for SlackFunction [xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/notify-slack]:
      slackfunction:go1.x-v1 to be pushed to xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/notify-slack:slackfunction-eb1817a25a39-go1.x-v1

    #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
    Confirm changes before deploy [Y/n]: Y
    #SAM needs permission to be able to create roles to connect to the resources in your template
    Allow SAM CLI IAM role creation [Y/n]: Y
    Save arguments to configuration file [Y/n]: Y
    SAM configuration file [samconfig.toml]:
    SAM configuration environment [default]:

これで、CloudFormationにスタックが作成されます。

7. テスト

Scheduleを適当な時間に調整し、Webhook URLに設定したSlackチャンネルにメッセージが届けば確認完了です。

Events:
  Notification:
    Type: Schedule
    Properties:
      Schedule: cron(0 0 * * ? *) # JST 9:00

備考

コンソールのLambda関数の画面からテスト実行することもできます。
スクリーンショット 2021-03-29 3.35.41(3).png

secretsmanager:GetSecretValueのポリシーをロールにアタッチしていない場合、エラーとなりAPIが呼び出せないので注意が必要です。

AccessDeniedException: User: arn:aws:sts::901071604628:assumed-role/notify-slack-SlackFunctionRole-1IND13I9826OF/notify-slack-SlackFunction-AL8RRMO0EQ8H is not authorized to perform: secretsmanager:GetSecretValue on resource: SlackWebhookUrl
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS EC2の利用メモ

AWS EC2を用いてSSH接続するまでの流れ(メモ)

AWS初心者がつまづいた点を自分用としてメモ書きとして残します。
環境はMac Windowsは違った内容になります。

AWS起動までの流れ

AWSの登録に関してはこちらの記事を参照
URLを貼る

まとめるとAWSのアカウントを登録、EC2を起動する
SSH接続するところまでは参照先と同じ操作

EC2インスタンスを起動後、SSH接続することについて

AWSのSSH接続に関してはこちらの記事を参照
https://qiita.com/ai-2723/items/eb156cd4dd3ccfac8791

まとめるとMacのターミナルを起動して、コマンドを入力
ターミナルでセキュリティを弱くする。(400とか600とか)
キーのディレクトリと同じディレクトリで実行すること

SSH接続はAWS公式サイトに準拠した
EC2 -> インスタンス -> インスタンスを選択 -> インスタンスに接続を選択

ログは以下の通りとなった。(秘密鍵はmykey.pem)

 ohata@oohatakazushinoMacBook-Pro Downloads % ssh -i "mykey1.pem" ec2-user@ec2-13-231-201-108.ap-northeast-1.compute.amazonaws.com


   __|  __|_  )
   _|  (     /   Amazon Linux 2 AMI
  ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
No packages needed for security; 10 packages available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-172-31-46-110 ~]$ client_loop: send disconnect: Broken pipe

SSH解除はexitと入力

ohata@oohatakazushinoMacBook-Pro Downloads % exit
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
Deleting expired sessions...none found.

[プロセスが完了しました]

編集はここまで

今後追加する可能性あり

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

UnityからRekognitionを使ってみた

R&D成果発表会Vol.2

こんにちは。ノベルワークスR&Dチームのともやんです。
今回はUnityと表情分析でうにゃうにゃした際の報告です。
この記事がVol.100くらいになるころには、なにかおもしろいものがお目見えしているかもしれません。
それでは早速!

Amazon Rekognitionとは

Amazon Rekognitionとは、AWSのサービスの一つで、画像や動画を投げると、顔比較や感情分析など高度なことを、簡単に行える便利なものです。今回はこのサービスを使って、感情分析を行っていきます。

AWS SDK for .Netについて

unityでのAWSSDK導入方法については基本ここ参照。
https://qiita.com/nshinya/items/0a71d4658e7f4a650844

Rekognitionを使いたいので、AWS SDK.Rekognition.dllを入れてください

やりかた

やり方として

1.unityでwebカメラを使う

2.Rekognitionにwebカメラの画像を投げる

3.返ってきたJson風データから感情値を取り出す

の三つで説明していきます

完成コード(雑です)

using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Amazon.Rekognition;
using Amazon.Rekognition.Model;




public class DetectFaces : MonoBehaviour
{
    public RawImage rawImage;

    WebCamTexture webCamTexture;


    //textureをtexture2dにする関数
    public Texture2D ToTexture2D(Texture self)
    {
        var sw = self.width;
        var sh = self.height;
        var format = TextureFormat.RGBA32;
        var result = new Texture2D(sw, sh, format, false);
        var currentRT = RenderTexture.active;
        var rt = new RenderTexture(sw, sh, 32);
        Graphics.Blit(self, rt);
        RenderTexture.active = rt;
        var source = new Rect(0, 0, rt.width, rt.height);
        result.ReadPixels(source, 0, 0);
        result.Apply();
        RenderTexture.active = currentRT;
        return result;
    }





    //Amazon Rekognition
    public async Task Example(Amazon.Rekognition.Model.DetectFacesRequest image)
    {
        //AmazonRekognitionClient
        AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient("AWSのアクセスキー", "AWSのシークレットキー");

        var response = await rekognitionClient.DetectFacesAsync(image);


        foreach(var i in response.FaceDetails[0].Emotions)
        {
            Debug.Log(i.Confidence);
            Debug.Log(i.Type);
        }
    }



    //start
    public void Start()
    {
        webCamTexture = new WebCamTexture();
        rawImage.texture = webCamTexture;
        webCamTexture.Play();
    }

    public async void UseReko()
    {
        var img2d = ToTexture2D(webCamTexture);
        var img = img2d.EncodeToJPG();
        var stream = new MemoryStream(img);
        List<string> att = new List<string>() { "ALL" };
        var rekoImg = new Amazon.Rekognition.Model.Image { Bytes = stream };
        var reqImg = new DetectFacesRequest {Attributes=att, Image = rekoImg };

        await Example(reqImg);

    }

1.Webカメラ

RawImageにwebカメラで取得した画像をはっつけます。顔見たいからです。別に顔を画面で見たくねえよって人はrawImageなんていりません。

略

public RawImage rawImage;
WebCamTexture webCamTexture;

略


    public void Start(){
        webCamTexture=new WebCamTexture();
        rawImage.texture=webCamTexture;
        webCamTexture.Play()
    }
}

んで、webCamTextreなんですが、これをそのままImageとしてRekognitionに投げるわけにはいきません。
というのも、Amazon.Rekognition.Model.DetectFacesRequestクラスのImageを投げなきゃいけないのです。ということで、
WebCamTexture>Texture2D>JPG形式>MemoryStream>DetectFacesRequestという順序で変換していきます。

WebCamTexture>Texture2D

WebCamTextureは一見Texture2Dなんですが、残念ながら違うんです。WebCamTextureというクラスなんです。だから、いったんToTexture2D()をつかって変換します。

var img2d = ToTexture2D(webCamTexture);

Texture2D>JPG

これも関数一発ドーンってやつです

var img = img2d.EncodeToJPG();

JPG>MemoryStream

DetectFacesRequestを作るには、Byte列としてMemoryStreamを作る必要があります。MemoryStreamがなんだかはよくわかっていません。これもドーンです。

var stream = new MemoryStream(img);

MemoryStream>DetectFacesRequest

これはnewするときの引き数にMemoryStreamを入れるだけです。

var rekoImg = new Amazon.Rekognition.Model.Image { Bytes = stream };

これで投げる画像はOKです。あと、どんな情報が返ってくるかの指定として、ALLを指定しておきます。ALLじゃないと感情値とかは返ってきません。

List<string> att = new List<string>() { "ALL" };

んで最後に

var reqImg = new DetectFacesRequest {Attributes=att, Image = rekoImg };

というようにRekognitionに投げるものを作ってあげれば終了です。

RekognitionにWebカメラの画像を投げる

AmazonRekognitionClient rekognitionClient = new AmazonRekognitionClient("AWSのアクセスキー", "AWSのシークレットキー");

        var response = await rekognitionClient.DetectFacesAsync(image);

ここで、DetectFacesAsync()をつかって投げています。ここで大事なのが、DetectFacesじゃなくてDetectFacesAsyncを使わなくちゃいけないということです。非同期なのでそこら辺のことも書き足さなきゃデス。

Asynchronous operations (methods ending with Async) in the table below are for .NET 4.5 or higher. For .NET 3.5 the SDK follows the standard naming convention of BeginMethodName and EndMethodName to indicate asynchronous operations - these method pairs are not shown in the table below.
(APIリファレンスにちっちゃく書いてある)

きちんとリファレンス読むべきですね。(Asyncないとerrorとしてinaccesible due to のやつが出てきます)

返ってきたJson風データから感情値を取り出す

返ってくるデータはこんな形です。

{
   "FaceDetails": [ 
      { 
         "AgeRange": { 
            "High": number,
            "Low": number
         },
         "Beard": { 
            "Confidence": number,
            "Value": boolean
         },
         "BoundingBox": { 
            "Height": number,
            "Left": number,
            "Top": number,
            "Width": number
         },
         "Confidence": number,
         "Emotions": [ 
            { 
               "Confidence": number,
               "Type": "string"
            }
         ],
         "Eyeglasses": { 
            "Confidence": number,
            "Value": boolean
         },
         "EyesOpen": { 
            "Confidence": number,
            "Value": boolean
         },
         "Gender": { 
            "Confidence": number,
            "Value": "string"
         },
         "Landmarks": [ 
            { 
               "Type": "string",
               "X": number,
               "Y": number
            }
         ],
         "MouthOpen": { 
            "Confidence": number,
            "Value": boolean
         },
         "Mustache": { 
            "Confidence": number,
            "Value": boolean
         },
         "Pose": { 
            "Pitch": number,
            "Roll": number,
            "Yaw": number
         },
         "Quality": { 
            "Brightness": number,
            "Sharpness": number
         },
         "Smile": { 
            "Confidence": number,
            "Value": boolean
         },
         "Sunglasses": { 
            "Confidence": number,
            "Value": boolean
         }
      }
   ],
   "OrientationCorrection": "string"
}

さっき、返ってくるデータ指定したけれど、DefaultだとBoundingBox, Confidence, Pose, Quality, Landmarksだけ返ってきます。
foreachでちょちょいと出してあげればOKです。

以上、Rekognitionの簡単な使い方でした。感情値データを使えばいろいろなことができるので遊んでみてください。
あと、動くけれどここのやり方違うとかあるかもなので、そこんところは教えてくれると嬉しいです。

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

素人基盤エンジニアがDockerでDjango REST Frameworkとreactを触るシリーズ③:reactの導入

素人基盤エンジニアがDockerでDjango REST Frameworkとreactを触るシリーズ②:Django REST Frameworkのつづき。
①からみたい場合はこちら。素人基盤エンジニアがDockerでDjango REST Frameworkとreactを触るシリーズ①:Djangoの導入

reactの導入

最終的には、S3上にreactのアプリを配置してCloudFront経由で表示させたいが、構築/テストまでは同じEC2上でreactとdocker上のDjango REST frameworkを動作させて連携させることとする。
動作が確認出来たら、ビルドしS3に移行する。

node.jsの導入

reactのビルド環境として、node.jsが必要なので、下記手順に従いインストールする。
https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node
node -e "console.log('Running Node.js ' + process.version)"

Running Node.js v15.12.0
↑のような形でバージョンが表示されたらインストールは完了。

create-react-app

今回は、reactアプリを簡単に作成することができるツールであるcreate-react-appを利用する。
(本格的にreactアプリを作成したい場合は自分で一から作成したほうが良いと思うが、今回はあくまでreactとDjango REST Frameworkを利用してとりあえず動くものを作るというところを目標とする。)
djangoのためのファイル群をbackendというディレクトリに作成したので、一旦/home/ec2-userまで戻り、下記コマンドを実行する。

cd /home/ec2-user
npm install -g yarn
yarn global add create-react-app
create-react-app frontend

しばらくすると、frontendというディレクトリが作成され、下記のような構成になっているはず。

frontend
∟node_modules
 ∟パッケージ多数
∟package.json
∟public
 ∟favicon.ico
 ∟index.html
 ∟logo192.png
 ∟logo512.png
 ∟manifest.json
 ∟robots.txt
∟README.md
∟src
 ∟App.css
 ∟App.test.js
 ∟index.js
 ∟reportWebVitals.js
 ∟App.js
 ∟index.css
 ∟logo.svg
 ∟setupTests.js
∟yarn.lock

まずはデフォルトの状態で、reactアプリを起動させてみる。

cd frontend
yarn start

http://<ip-address>:3000
にアクセスする。
DRF011.png
reactアプリが動作していることがわかる。
ctrl+Cで一旦終了し、下記ソースを修正してみる。

public/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <link href="https://use.fontawesome.com/releases/v5.6.1/css/all.css" rel="stylesheet">
    <title>ReactSampleApp</title>
  </head>
  <body>
    <h1 class="title">ToDo Apps(React+DjangoRestFramework)</h1>
    <div id="root"></div>
  </body>
</html>
src/App.js
import React, { Component } from 'react';
import axios from 'axios';

class App extends Component {
    constructor(props) {
        super(props);
        this.state = {
            todos: [],
            hostname: ""
        };
    }

    componentDidMount() {
        this.getTodos();
        this.getHostname();
    }

    getTodos() {
        axios
            .get('http://<ip-address>:8000/api/todos/')
            .then(res => {
                this.setState({ todos: res.data });
            })
            .catch(err => {
                console.log(err);
            });
    }

    getHostname() {
        axios
            .get('http://<ip-address>:8000/api/hostname/')
            .then(res => {
                this.setState({ hostname: res.data });
            })
            .catch(err => {
                console.log(err);
            });
    }

    render() {
        return (
            <div>
                {this.state.todos.map(item => (
                    <div key={item.id}>
                        <h2>{item.title}</h2>
                        <p className="item_body">{item.body}</p>
                    </div>
                ))}

                <div className="box30">
                    <div className="box-title">HOSTNAME</div>
                    <p>{this.state.hostname.hostname}</p>
                </div>
            </div>
        );
    }
}

export default App;

<ip-address>の部分を、EC2のIPアドレスにすることを忘れないように注意。
ここは、CloudFrontでの構成に移行すればIPアドレスを書かなくてもよくなる。

src/index.css
body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
    sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

code {
  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
    monospace;
}

h1.title {
  font-family: 'Segoe Print',sans-serif;
  padding: 0.5em;
  color: #494949;/*文字色*/
  background: #fffaf4;/*背景色*/
  border-left: solid 5px #ffaf58;/*左線(実線 太さ 色)*/
}

.box30 {
    margin: 0 auto 0 20px;
    width: 300px;
    background: #f1f1f1;
    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.22);
}
.box30 .box-title {
    font-size: 1.2em;
    background: #5fc2f5;
    padding: 4px;
    text-align: center;
    color: #FFF;
    font-weight: bold;
    letter-spacing: 0.05em;
}
.box30 p {
    text-align: center;
    padding: 15px 20px;
    margin: 0 0;
}

h2 {
  position: relative;
  padding: 8px 15px;
  margin-left: 40px;
  background: #def3ff;
  border-radius: 20px;
}

h2:before {
  font-family: "Font Awesome 5 Free";
  content: "\f111";
  position: absolute;
  font-size: 15px;
  left: -40px;
  bottom: 0;
  color: #def3ff;
}

h2:after {
  font-family: "Font Awesome 5 Free";
  content: "\f111";
  position: absolute;
  font-size: 23px;
  left: -23px;
  bottom: 0;
  color: #def3ff;
}

p.item_body {
  font-family: 'Mv Boli',sans-serif;
  margin-left: 80px;
}

ソース内で、axiosというパッケージを利用しているので、frontendディレクトリで下記コマンドを利用してパッケージを追加しておく。

yarn add axios

また、Django側の設定も、別サイトからのクロスオリジンアクセスがあるため、下記のように書き換える。

backend/todo_project/settings.py
MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True

一行目のcorsheaders~と最後のCORS_ORIGIN_ALLOW_ALLを追加。

docker-compose upでdbとdjangoのコンテナを起動する。
(この後reactも起動したいのでバックエンドで起動する。)

cd backend
docker-compose up &

コンテナを起動させたまま、reactを起動。

cd ../frontend
yarn start

http://<ip-address>:3000/
にアクセスしてみる。
DRF012.png

無事、todoとhostnameが表示されていることがわかる。
次回は、今回構築したreactアプリをビルドしS3へ配置して最終系であるCloudfrontの形に変更する。

つづく

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

【AWS】用語を整理しながら学ぶAWS - part5 Cloud Formation - 3

はじめに

この記事では AWS Cloud Tech を通して Cloud Formation を学習して実践していく記事です。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)
誤りなどがあれば書き直していく予定です。

前回までのおさらい

テンプレートの定義には
Resources 以外に Outputs というオプションが存在する。

Outputs で出力されたパラメータはエクスポート名という名前で参照できる。
エクスポート名はクロススタック参照という方法で利用できる。

また、テンプレート内の値を参照する場合は組み込み関数を利用することで
動的に参照することが可能である。

【AWS】用語を整理しながら学ぶ AWS - part5 Cloud Formation - 2

前回の内容を実践

よくある VPC ネットワークを構築してみる。

ファイル名 用途
vpc_network.yml VPC の構成を管理
public_network.yml パブリックサブネットの構成を管理
private_network.yml プライベートサブネットの構成を管理

VPC ネットワークを定義する。

vpc_network.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MainVpc:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: MainVpcfromCF

Outputs:
  MainVpc:
    Value: !Ref MainVpc
    Export:
      Name: MainVpcId

パブリックサブネットを定義する。

public_subnet.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      VpcId: !ImportValue MainVpcId
      CidrBlock: 10.0.2.0/24
      Tags:
        - Key: Name
          Value: PublicSubnet
  secGroupName:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: PublicSecGrp
      GroupDescription: PublicSecGrp
      VpcId: !ImportValue MainVpcId
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: MainVpc

Outputs:
  PublicSubnet:
    Value: !Ref subnetName
    Export:
      Name: PublicSubnet
  PublicSecGrp:
    Value: !GetAtt secGroupName.GroupId
    Export:
      Name: PublicSecGrp

続いてプライベートサブネットを定義する。

private_subnet.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: "ap-northeast-1a"
      VpcId: !ImportValue MainVpcId
      CidrBlock: 10.0.1.0/24
      Tags:
        - Key: Name
          Value: PrivateSubnet

Outputs:
  PrivateSubnet:
    Value: !Ref subnetName
    Export:
      Name: PrivateSubnet

次にやること

プライベートネットワークとパブリックサブネット内に EC2 を配置する。

ファイル名 用途
public_ec2.yml パブリックサブネット内の EC2 を管理
private_ec2.yml プライベートサブネットの内の EC2 を管理

次回の Part5 - 4 に持ち越し

EC2 を テンプレートで定義すると

仮にですが、思いつきでパッどEC2を定義してみると...

public_ec2.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  myEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: Mykeypair
      ImageId: ami-0992fc94ca0f1415a
      InstanceType: t2.micro
      Monitoring: false
      SecurityGroupIds:
        - !ImportValue PublicSecGrp
      SubnetId: !ImportValue PublicSubnet
      Tags:
        - Key: Name
          Value: CFec2

こんな感じになるかと思うのですが
個人的には幾つか気に入らない点がありまして文字数

気に入らない点

キーペアの管理

鍵を管理するのが面倒くさい。

AMI のID

コード内にIDをハードコートしたくない。
というのもリージョンごとに異なるIDとなる為
冗長化するときに一々、AMI IDを調べないといけない。

じゃあどうするか

鍵は管理しない代わりにSSMを利用する。
AMIのIDは常に最新に保とうとしましたが
AMIが変わったことによる不具合などに悩まされたくないので一旦、ハードコートする。

良い方法を後程、考えます。

まとめ

Cloud Formatinを利用してVPCネットワークを構築してサブネットを切りました。
次回はこのネットワークにEC2を構築します。

おわり

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