20200701のAWSに関する記事は29件です。

[Lightsail]さくらインターネットからAWS LightsailにWordPressを最速で移行する – スモールスタート編

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

CloudWatch Eventにてイベントソースからの情報をAWS Batch Jobのパラメータに渡す

はじめに

本記事は、AWS公式ドキュメントのCloudWatch イベント ターゲットとしての AWS Batch ジョブの内容をより噛み砕いた記事になります。

例とともに

やりたいこと

今回やりたかったことは、CloudWatch Eventsをスケジュール形式で実行させ、このときEventが持つその実行時の日時をAWS Batch Jobに渡すことです。

Batchの状態

AWS BatchのJob Definitionには以下のようにdateという値をパラメータにした定義を持っています。

CLIで表示すると以下のように出ます。

$ aws batch describe-job-definitions --job-definition-name "my-job-definition-name"
{
    "jobDefinitions": [
        {
            "jobDefinitionName": "mixlunch-matching-job-definition",
            "jobDefinitionArn": "arn:aws:batch:ap-northeast-1:XXXXXXXXXXXX:job-definition/mixlunch-matching-job-definition:5",
            "revision": 5,
            "status": "ACTIVE",
            "type": "container",
            "parameters": {
                "date": "2018-11-01T00:00:00Z"
            },
            "retryStrategy": {
                "attempts": 1
            },
            "containerProperties": {
                "image": "XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/mixlunch-matching:latest",
                "vcpus": 1,
                "memory": 2000,
                "command": [
                    "python",
                    "./run.py",
                    "Ref::date"
                ],
.
.

私の上記の例の場合はdateパラメータはPython実行にて引数としてアプリに渡すために利用します。

CloudWatch Eventでの設定方法

今回の例ではスケジュール設定(cron)でのイベントソースを利用します。CloudWatch Eventのルールにおけるイベントソースはとても多様ですが、後述の設定方法はどのイベントソースでも共通です。

スクショとしては下記のようになります。

CloudWatch_Management_Console.png

スクショ左下青枠はイベントソースからやってくるサンプルのJSON形式です。

今回AWS Batch Jobに渡したいのは赤枠の部分の"time"フィールドの中身です。

そのために、スクショ右側でのConfigure inputにはInput Transformerを設定します。

1つ目の枠には、イベントソースから来るJSONのフィールドを指定のキーに渡す設定です。

{
  "detail": {
    "requestParameters": {
      "bucketName": "my-bucket"
    }
  }
}

上記のようなJSON形式の場合のイベントソースならば、{"myValue": "$.detail.requestParameters.bucketName"}のように記述できます。

2つ目の枠では1つ目で取得したキーを用いてAWS Batch Jobのパラメータに指定します。

今回の例では{"Parameters" : {"date": <TimeValue>}}とすることでAWS Batch Jobで定義しているdateへ渡すことができます。

AWS CLIでは以下で内容を取得できます。

$ aws events list-targets-by-rule --rule "matching"
{
    "Targets": [
        {
            "Id": "IdXXXXXXXXXXXX",
            "Arn": "arn:aws:batch:ap-northeast-1:XXXXXXXXXXXX:job-queue/mixlunch-matching-job-queue",
            "RoleArn": "arn:aws:iam::XXXXXXXXXXXX:role/service-role/AWS_Events_Invoke_Batch_Job_Queue_XXXXXXXXXXXX",
            "InputTransformer": {
                "InputPathsMap": {
                    "TimeValue": "$.time"
                },
                "InputTemplate": "{\"Parameters\" : {\"date\": <TimeValue>}}"
            },
            "BatchParameters": {
                "JobDefinition": "arn:aws:batch:ap-northeast-1:XXXXXXXXXXXX:job-definition/mixlunch-matching-job-definition:5",
                "JobName": "matching-job"
            }
        }
    ]
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS SAA対策メモ(VPC, ELB & Auto Scaling編)

SAA対策の自分用のメモ。
どんどん更新して加筆修正していく予定。

VPC

パブリックサブネットとプライベートサブネットの定義は?違いは?
サブネットのルートテーブルのデフォルトゲートウェイ(0.0.0.0/0)がインターネットゲートウェイなら、パブリックサブネット。指定が特にないなら、プライベートサブネット。

NATインスタンスの特徴は?
NATゲートウェイの代わりに置く。プライベートサブネットのEC2インスタンスをネット接続させる。ただし、送信元送信先チェックの機能を無効化し、自身への通信トラフィックを破棄する設定が必要。また、単一障害点とならないように冗長化構成も必要。あまりおすすめしない。

Elastic IPとは?いつ課金?
固定のグローバルIPアドレス。これをつけていると、EC2インスタンスを再起動してもIPは変わらない。EC2にアタッチされていない、または、アタッチされているEC2が停止状態の場合に課金される。使っていないなら開放しよう。

VPCエンドポイント
エンドポイントを作成すると、パブリックIPアドレスを持つインターネットからしかアクセスできないサービスにもVPC内からアクセス可能。
1. ゲートウェイ型 ルートテーブルに指定されたターゲットを追加することで、ネット接続なしにプライベート接続でS3やDynamoDBにアクセス可能。
2. インターフェース型 AWS PrivateLinkのこと。APIコールに対して、ネット接続なしにプライベート接続可能。

VPCピアリング接続は中国リージョンではできない!

SGとネットワークACLの違いは?
対象はインスタンスか、サブネットか
デフォルトはイン拒否とアウト許可か、インアウト許可か
全てのルール適応か、順番に適応か
ステートフルか、ステートレスか

ELB

通信負荷軽減、耐障害性の向上のためにトラフィックを分散。
オートスケール
トラフィックの急増により、オートスケールが間に合わないときがある。予めわかっているのであれば、暖機運転(Pre-Warming)を行う。AWSサポートにて申請する。ビジネスかエンタープライズのみ。
IPが自動で振り分けられるが、変動する。そのため、ELBへの接続にはDNS名を使う(エンドポイント)
SSL復号機能(SSL Termination)により、EC2インスタンスの負荷軽減や証明書の一元管理ができる。クライアントーELB間は443ポートのSSL通信、ロードバランサーーターゲットインスタンス間は80ポートのHTTP通信。
SGをつけてアクセス制御可能(NLBはできない)
ヘルスチェック機能(healthy/unhealthy)により、正常でないEC2インスタンスへの振り分けを止める。
スティッキーセッションにより、一度セッションを保持したら、そのサーバーに再度リクエストするようにできる。
Connection Drainingとは、ELBからサーバーを登録解除する際に、処理が中断しないように解除を遅延させる機能。
クロスゾーン負荷分散とは、複数のAZに登録された全てのインスタンスにリクエストを均等に分散させること。

Application Load Balancer (ALB)
パスペース、ホストベースのルーティング
従来はパスやホストが異なると一つ一つにCLBをつけていたが、いまはALB一つで済む!

Network Load Balancer (NLB)
低レイテンシー高スループット。
送信元IPを保持するので、レスポンスはNLBを経由せずに直接クライアントへ(パフォーマンス↑↑)
SGはない

Auto Scaling

対象はEC2、ECS、DynamoDB、Aurora。

Auto Scaling group
リージョンをまたぐことはできない

スケーリングプラン
手動スケーリング
最大最小数を定義する(Desired capacity)バッチ処理などに使う

動的スケーリング
スケーリングポリシーを設定。
cloudwatchのアラームに基づいてスケール
target tracking scaling
特定のメトリクスのターゲット値に基づいてスケール
step scaling
アラームの超過具合によって段階的にスケール
simple scaling
1つのスケーリング調整値に基づいてスケール
スケジュールスケーリング
特定の日時や繰り返しでスケーリング可能
Auto Healing
Auto Scaling対象のEC2は、ELBでヘルスチェックして異常(running以外)と判断されると削除され、新しいインスタンスが起動され、インスタンス数が維持される。

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

AWS Transcribeでテレテキストのようなものをやってみる

テレテキストと言われても何のことかわからんって方はとりあえずこの動画を見てみてほしい。
ビデオが開けなかった場合に表示されるテキスト

こんな感じに動画にほぼsyncして文字起こしが表示されると、ネイティブ並みのヒアリング能力がなくてもスピーチの把握がやりやすい。CNNとかで時々やってたりする。Youtubeだと自動文字起こしをやってくれるのだが、それ以外の方法で動画が配信されているとかなりしんどい。最近やってる海外のバーチャルイベントとか。

そこでAmazon Transcribeというサービスで似たようなことをやってみた。

Transcribeで文字起こしを取得する

まずAmazon Transcribeに与える音声データをS3にアップロードする。Transcribeにかけると文字起こしのデータが得られる。抜粋するとこんな感じのJSONになっている。

transcribed.json
{
    "jobName": "aaabbbccc",
    "accountId": "123456789012",
    "isRedacted": true,
    "results": {
        "transcripts": [
            {
                "transcript": "XXXXXXXXXXXXXXXXXXXX"
            }
        ],
        "items": [
            {
                "start_time": "193.92",
                "end_time": "199.55",
                "alternatives": [
                    {
                        "confidence": "0.2774",
                        "content": "thing"
                    }
                ],
                "type": "pronunciation"
            },
            (中略)
        ]
    },
    "status": "COMPLETED"
}

itemsのところに発音した時間と、発音内容、信頼度が出ている。あとはこれを時間に従って表示すればいい。

テレテキストっぽく表示する

こんな感じにpythonスクリプトを書く。特にコメントは書いていないが短いので何をやっているかはわかると思う。

teletext.py
import sys
import json
from datetime import datetime, timedelta

jsonobj = None

with open(sys.argv[1]) as fh:
    try:
        jsonobj = json.load(fh)
    except:
        raise

jsonobj = jsonobj["results"]["items"]

idx = int(0)
ntime = float(0.0)
jsonlength = len(jsonobj)

n1 = datetime.now()
while True:
    if "start_time" in jsonobj[idx]:
        if float(jsonobj[idx]["start_time"]) < ntime:
            print(jsonobj[idx]["alternatives"][0]["content"], end=' ')
            idx += 1
            if idx >= jsonlength:
                break
    else:
        print(jsonobj[idx]["alternatives"][0]["content"])
        idx += 1
        if idx >= jsonlength:
            break
    d = datetime.now() - n1
    ntime = float(d.total_seconds())

実行はこんな感じにする。

$ python3 -u teletext.py transcribed.json

さいごに

30分で作ったにしては結構役立つなあ、と

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

Amazon Transcribeでテレテキストのようなものをやってみる

テレテキストと言われても何のことかわからんって方はとりあえずこの動画を見てみてほしい。
ビデオが開けなかった場合に表示されるテキスト

こんな感じに動画にほぼ同期して文字起こしが表示されると、ネイティブ並みのヒアリング能力がなくてもスピーチの把握がやりやすい。CNNとかで時々やってたりする。Youtubeだと自動文字起こしをやってくれるのだが、それ以外の方法で動画が配信されているとかなりしんどい。最近やってる海外のバーチャルイベントとか。

そこでAmazon Transcribeというサービスで似たようなことをやってみた。

Transcribeで文字起こしを取得する

まずAmazon Transcribeに与える音声データをS3にアップロードする。Transcribeにかけると文字起こしのデータが得られる。抜粋するとこんな感じのJSONになっている。

transcribed.json
{
    "jobName": "aaabbbccc",
    "accountId": "123456789012",
    "isRedacted": true,
    "results": {
        "transcripts": [
            {
                "transcript": "XXXXXXXXXXXXXXXXXXXX"
            }
        ],
        "items": [
            {
                "start_time": "193.92",
                "end_time": "199.55",
                "alternatives": [
                    {
                        "confidence": "0.2774",
                        "content": "thing"
                    }
                ],
                "type": "pronunciation"
            },
            (中略)
        ]
    },
    "status": "COMPLETED"
}

itemsのところに発音した時間と、発音内容、信頼度が出ている。あとはこれを時間に従って表示すればいい。

テレテキストっぽく表示する

こんな感じにpythonスクリプトを書く。特にコメントは書いていないが短いので何をやっているかはわかると思う。

teletext.py
import sys
import json
from datetime import datetime, timedelta

jsonobj = None

with open(sys.argv[1]) as fh:
    try:
        jsonobj = json.load(fh)
    except:
        raise

jsonobj = jsonobj["results"]["items"]

idx = int(0)
ntime = float(0.0)
jsonlength = len(jsonobj)

n1 = datetime.now()
while True:
    if "start_time" in jsonobj[idx]:
        if float(jsonobj[idx]["start_time"]) < ntime:
            print(jsonobj[idx]["alternatives"][0]["content"], end=' ')
            idx += 1
            if idx >= jsonlength:
                break
    else:
        print(jsonobj[idx]["alternatives"][0]["content"])
        idx += 1
        if idx >= jsonlength:
            break
    d = datetime.now() - n1
    ntime = float(d.total_seconds())

実行はこんな感じにする。

$ python3 -u teletext.py transcribed.json

さいごに

30分で作ったにしては結構役立つなあ、と

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

とあるサービスの基盤構築記録

目次
- 前置き
- インフラ構成
- まとめ
- おまけ

前置き

eeNotesでインフラ兼バックエンド兼フロントエンドの足枷兼Figmaを眺めるだけの@tetsuya28です
普段はベンチャーや知り合いのお手伝いなどでAWSのインフラ管理などをメインに生計を立てているしがない大学院生です

今回は、去年の夏インターンの成果物を優秀なチームメンバーと共に紆余曲折、10ヶ月もの歳月を費やし開発を続け、先週リリースしたeeNotesというサービスのインフラ構成についてざっくりとまとめてみました

https://twitter.com/eeNotes/status/1275730389290479616?s=20

インフラ構成

なにはともあれ、とりあえずインフラ構成はこんな感じになってます
アイコンがバラバラなのは許して下さい。新しいアイコンが揃ってなかったので…

eeNotes (4).png

eeNotesではプロダクション環境とステージング環境をAWS上に構築しています
ステージング環境は諸々の事情により若干上記のプロダクション環境とは違うのですが、複雑になるので一旦なかったことに
青色の線が主にサービス内で行われる通信、オレンジがログ等、緑色がデプロイに使われるものを表しています
上記の構成をTerraformを用いてIaCで構築しています
めちゃくちゃ大雑把な図ですが、主にデプロイ・Backend・Frontendについて解説していこうと思います

デプロイパイプライン

prod環境は、Frontend, Backend共にGitHub上の masterブランチの更新を元にGitHub Actions上でDockerイメージを作りECRにpush、またCodePipelineに使う imagedef.json をS3にアップロード
S3へのアップロードをフックしてCodepipelineを起動してECSのタスク定義・タスクを更新。また、デプロイ情報はSNS、Amazon Chatbotを通じて随時Slackに通知しています
デプロイ時に必要な認証情報はSSMを通じて取得
基本的にデプロイに係る作業はGitHub上でPull Requestさえ作ってしまえば後はいい感じにやってくれるようにしてあるので大体MTG中にPRだけ作って後はSuccess通知が来るのを雑談しながら待っています

Frontend

Frontendはロードバランサーを経由してECS on EC2上でリクエストを処理しています
静的ファイルに関しては前段にCloudfrontを挟みキャッシュしつつS3へリクエストを流しています
(後述のBackendと異なりon EC2で動かしているのはコスト削減の為にステージング環境と同一ホストを使っているためです)

Backend

Backendはロードバランサーを経由、ECS on Fargate上にGolangのAPIサーバを配置し、RDS・Elasticsearchからデータの取得・検索を行っています。
ログは逐次Cloudwatch Logsに流しています

その他

ユーザ認証周りは全てFirebaseにお任せしてあります
アラートなどは基本的にCloudwatchからSNS経由でSlackで受信しています
お金に関しては、大体こんな感じの構成をステージング環境用にも作って月3,000円程って感じで運用しています(余裕で赤字。どなたかスポンサーしてくれてもいいんですよ??いや、まじで…)

ロードマップ

今後のインフラの課題としては次のようなことに時間が出来たら検証しようと思ってます

  • DBのマイグレーション自動化
  • 属人化からの脱却
  • フロントエンドをS3などで配信
  • Auto Scalingの設定

まとめ

以上、ざっくりとではありますがeeNotesのインフラ構成についてでした
MySQL、Elasticsearchやフロント・デザイン技術、チーム開発体制については他のメンバーが記事を書いてくれることを期待している♪
インフラなどについてご質問等ありましたらお気軽に@tetsuya28までDMでも飛ばして下さい

おまけ

最後にeeNotesのインフラを作っていく中でのいくつかの失敗をご紹介
良い子は真似しないでね

環境はきちんと分離しよう

スクリーンショット 95.png
eeNotesでは当初、ステージング環境と言うものが存在しておらずAWS上ではプロダクション環境のみ稼働していました
が、やはり途中からステージング環境が欲しいということで追加したのですが、その中でGitHubのSecretsに設定する値を間違えており、ステージング環境用にビルドされたReactからプロダクション環境にリクエストが飛ぶという事故がありました

環境はきちんと分離しよう Part 2

スクリーンショット 96.png
続いての失敗も環境関連の変更を加えた時期に起きた失敗
前述の通り、eeNotesでは特定のブランチの更新を元にGitHub Actionでdockerイメージを作成しているのですが、workflowの設定ファイルをミスってしまい、本来ステージング環境のイメージを更新しなければいけないのにプロダクション環境のイメージを更新してしまっていたというバグでした
GitHub Actionは大部分がコピペだからって気を抜かずにちゃんとレビューしましょう
ちなみにスクショにまたとあるようにこの失敗は何度か起こしてます。笑

リソース破壊テロ

スクリーンショット 97.png
コスト削減の一環でステージング環境のEC2インスタンスを整理していたときのお話
ECS on EC2やら on Fargateを行き来していてとあるタイミングでEC2インスタンスが要らなくなったと勘違いしてコンソール上でボケーッとインスタンスを削除しました
が、なんと運悪くコスト節約のためにElasticsearchとECS on EC2の共有ホストを削除してしまっていました
ステージング環境くらいからはちゃんとインフラもコード管理 & 気分でリソース削除しないこと

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

AWS SAA-C02を取得した際のメモ

はじめに

2020年6月から勉強を始めて、同年6月30日にAWS Solution Architect Associate (SAA-C02)を取得することができたので、勉強した内容をメモします。

前提

仕事で多少AWSを使ったことがある程度(VPC作成〜パブリック/プライベートサブネット作成〜EC2起動〜SSH接続を2回程度やったことがある)。
RDSやKinesisについてもちょっとだけ知っていましたが、細かいオプションや設定はしたことなし。
テストで重要なSQSやCloud Frontなどは全く知りませんでした。
GCPやAzureについても上記と同様の知識レベルです。

勉強で使ったもの

書籍は自宅の近くの本屋であったものを購入しました。
あまりAWSのサービス全体について分かっていなかったので、体系立てて学びたいと思って購入しました。

上記の書籍だけだと本番を想定した問題に慣れるのが難しいと思い、申し込んで活用しました。
スマホからでも問題を解いて勉強できるので、非常に便利でした。

書籍やUdemyの解説だけでは理解しにくい部分の確認や、最新情報の確認のためにAWSのWebページも参照しました。
例えば、S3のドキュメントに記載されている、オブジェクトクラスは非常に分かりやすく、参考になりました。

勉強の時間など

  • 1日目~14日目:1日1時間程度:書籍で基礎を勉強しました。全部で14章で構成されているので、1日1章ずつ進めていったイメージです。

  • 15日目〜27日目:1日1時間程度:Udemyで問題を解きました。間違えた内容についてノートにポイントなどを整理しつつ進めました。模擬試験→答え合わせ→ポイント整理→同じ問題を再試験というループを全6回分回しました。

  • 28日目:公式の模擬試験で最終確認しました。

試験について

自宅からの受験で申し込みしたのですが、試験2日前に急にキャンセルされ、後日メールで受験のソフトウェアトラブルのためキャンセルしたとのメールが来ました。
もともと希望していた日時で受けられなかったため、仕方なくテストセンターで受験しました。
試験当日は顔写真付きの身分証明書が2種類必要なので、要注意。

SAA試験の公式情報にも記載がありますが、65問に対して130分という時間設定になっています。
実際には30分程度時間が余りました。

結果、感想など

750点程度取ることができ、合格でした。
ギリギリで危なかった...

Udemyや公式の模擬試験では初回はどれも50%程度しか正答できませんでしたが、
できないところをひたすらつぶして復習していきました。

書籍だけでは正直なところ合格は厳しいかと思いました。
書籍の弱点でもありますが、情報が古い部分があったりするので、Udemyの問題集は役に立ちました。
もしかしたら同じUdemyのオンラインコースも受けているともう少し余裕を持って合格できたかもしれません。
ご参考までに。

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

RDSのデフォルトパラメータグループの罠

はじめに

RDS の DB インスタンスを新規に作成する際、何も指定しないとデフォルトのパラメータグループを使う設定となります。
デフォルトのパラメータグループなので、それなりに標準的な設定になっており、とりあえずはこれを使っておくのが無難かなと思っていましたが、大きな間違いでした、、、というお話です。
かなり初歩的なお話ですね。。。

ちなみに、MySQL 前提での話ですが、PostgreSQL など他のエンジンでも基本的には同じ話だと思います。

デフォルトのパラメータグループを使うと起きる問題

DB を使っていると、設定を変更したくなることが多々あります。
例えば、私の場合は DB インスタンスのリソースがまだガッツリ残っているのに Too many connections が出るようになったので、max_connections を引き上げたくなりました。
それ以外でも、例えば、slow_query_log を出したい/出したくないとか、その閾値 long_query_time を変えたいなどといったことはよくあると思います。
しかしながら、、、デフォルトのパラメータグループではパラメータの設定変更が一切できません!
つまり、どうしても設定変更をしたいのであれば、まずは DB インスタンスが使用しているパラメータグループ自体を変えないといけないことになります。

さらに、、、使用するパラメータグループを変更する際には、DB インスタンスの再起動 が必要となります。
つまり、サービスが止まります。

この辺の話が、下記の AWS のページに記載されています。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-modify-parameter-group-values/

DB インスタンスを作成する際に、安易にデフォルトのパラメータグループを使うことを選択しただけでサービス停止を余儀なくされるのは、サービスによってはとても痛いと思います。
独自のパラメータグループを作成することはまったく難しくないので、DB インスタンスの作成時には必ずパラメータグループも新規に作成するクセを付けるくらいで良いと思います。

パラメータグループの設定パラメータの変更

稼働中の DB インスタンスで使われているパラメータグループの設定パラメータの変更は、DB インスタンスの再起動無しに動的に行えます。
ただし、動的パラメータと呼ばれるパラメータのみで、静的パラメータの変更後の有効化には再起動が必要となります。

パラメータグループの共有

独自に作成したパラメータグループを複数の DB インスタンスで共有することも可能です。
これはこれで便利な仕組みなのですが、注意が必要です。
設定パラメータの変更は、あくまでもパラメータグループの内容の変更になります。
従って、設定パラメータを変更するとそのパラメータグループを参照しているすべての DB インスタンスの設定が変更されます。

よって、明確に設定値を揃える必要がない限りは、基本的にはそれぞれの DB インスタンスには別々のパラメータグループを用意するのが無難だと思います。
※例えば、同じ種別の複数台のreadレプリカには同じパラメータグループを割り当てた方が都合が良いといったことが考えられます。

結論

  • サービスを簡単に停止できない DB インスタンスにはデフォルトのパラメータグループは使わない
  • 特別な理由がない限りは、パラメータグループは DB インスタンスごとに作成して関連づける

あくまでもザックリとした個人的な感覚レベルなので、ベストプラクティス的な情報があれば教えていただけるとありがたいです。

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

AWS Well-Architected フレームワークのホワイトペーパー5本柱

AWS Well-Architectedフレームワークとは?

AWSを利用するためのベストプラクティスをまとめたもの。

Well-Architected フレームワーク

AWS Well-Architectedフレームワークの3つの構成要素

1. ホワイトペーパー

  • レビュープロセス
  • 5本の柱
  • 設計の原則
  • ベストプラクティス

2. Well-Architected Tool

  • ワークロード管理
  • レビュー結果の管理

3. 支援するソリューションアーキテクト

  • 構築
  • 設計
  • 運用
  • レビュー

ホワイトペーパーの5本の柱

3つの構成要素の中のホワイトペーパーの5本の柱。
5本の柱は、Well-Architected を体系立てる基本的な考え。

クラウド全般についての一般的な設計原則

そもそも、クラウド全般の一般的な設計原則は以下です。
- 実際に稼働して計測し、確実なキャパシティ設計をする
- 本番環境と同じスペックおよび構成でテストし、リリース後の障害発生を減らす
- 環境構築は自動化し、再現性を高める
- データを収集しデータに基づいた意思決定を行う
- 頻繁にデプロイしてリスクを減らす
- ゲームデーを利用して緊急事態に備える

柱1:運用上の優秀性

オンプレと比べる、オンラインでのリリースのしくいやインフラをコードで管理する仕組みがある、
そのため、小規模なリリースを頻繁に行ったり、再現性が高いリリースを行えまる。
AWSもリリースのために使えない時間帯や制限事項はない。

運用上の優秀性についての設計原則

  • 運用をコードとして実行する
  • ドキュメントをコードと一緒に管理する
  • 小規模なリリースを頻繁にし、戻せるようにする
  • 定期的に運用手順を見直す
  • 障害を予想し、準備する
  • 運用上のすべての障害から学ぶ

柱2:コスト最適化

AWSは、従量課金制で費用節約可能。
需要のピークに合わせてサーバーを用意できる。

コスト最適化についての設計原則

  • 費用を追跡する、必要に応じてアラームを設定する
  • 不要な時間は停止する
  • 需要に合わせたリソース最適化を行う
  • マネージドサービスを積極的に活用する
  • 購入オプションを活用しコスト削減する

柱3:信頼性

AWSでは、サーバーが突然落ちるかもしれない、データセンターが突然停止するかもしれないという前提で設計する。
サービスをいかに継続させるかが信頼に繋がる。

信頼性についての設計原則

  • RPOとRFO
  • Multi-AZ
  • Multi-Region
  • ELB
  • Auto Scaling
  • リソースのモニタリング
  • バッグアップリストア
  • AWSの制限

柱4:パフォーマンス効率

AWS提供しているサービスを理解し、適切で使うことでパフォーマンス効率をあげることができる

柱5:セキュリティ

セキュリテ対策を行う際の基本的に考え方「多層防御」
複数のセキュリティ対策を行うことで、リスクを下げる

セキュリティのベストプラクティス

  • 認証情報の管理
  • データの保護
  • 脆弱性管理
  • 監視とログ管理
  • インシデント発生時のプロセスを準備
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】MacからEC2インスタンス(AmazonLinux)へSSHする方法

はじめに

MacからEC2インスタンス(AmazonLinux)へSSHする方法をアウトプットします。
※Windowsとは接続方法が違います。

自宅環境

項目 説明
自宅PC  MacOS Catalina バージョン10.15.5
ターミナル Macのターミナル

基盤環境

項目 説明
OS Amazon Linux 2 AMI (HVM), SSD Volume Type
Size t2.micro

前提

  • EC2インスタンス作成時、下記画面にて「新しいキーペアの作成」を実施している。
  • キーペアをダウンロード済である。

スクリーンショット 2020-07-01 21.03.18.png

手順

①ターミナルを起動

下記のどちらかの方法で起動

  • タスクバー
    スクリーンショット 2020-07-01 21.11.27.png

  • Launchpad(その他の中)
    スクリーンショット 2020-07-01 21.14.46.png

②キーペアが保存されているディレクトリに移動

cd キーペアが保存されているディレクトリ

※ターミナルにcdと打ち込んだ後に、保存ディレクトリをターミナルへドラックすると楽です。
(個人情報は伏せています。)

スクリーンショット 2020-07-01 21.20.55.png

③EC2インスタンスへSSH接続

sudo ssh -i キーペア ec2-user@グローバルIPアドレス

実行例

satton@sattonMBP AWS_SSH % sudo ssh -i testkey.pem ec2-user@3.112.4.99
The authenticity of host '3.112.4.99 (3.112.4.99)' can't be established.
ECDSA key fingerprint is SHA256:dTS2Al40C6Ewa/hi//jd50WDbbAUVJsGnrC6Y0z/6x8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '3.112.4.99' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
13 package(s) needed for security, out of 22 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-124 ~]$ 

※キーペアの絶対パス指定でも可能

satton@sattonMBP ~ % sudo ssh -i /Users/satton/Desktop/AWS_SSH/testkey.pem ec2-user@3.112.4.99
Last login: Wed Jul  1 12:44:28 2020 from om126204165127.6.openmobile.ne.jp

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
13 package(s) needed for security, out of 22 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-0-124 ~]$ 


sudoを付けない場合

ファイルの権限の関係でSSHログインができません。

satton@sattonMBP ~ % ssh -i /Users/satton/Desktop/AWS_SSH/testkey.pem ec2-user@3.112.4.99
The authenticity of host '3.112.4.99 (3.112.4.99)' can't be established.
ECDSA key fingerprint is SHA256:dTS2Al40C6Ewa/hi//jd50WDbbAUVJsGnrC6Y0z/6x8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Failed to add the host to the list of known hosts (/Users/satton/.ssh/known_hosts).
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/satton/Desktop/AWS_SSH/testkey.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/satton/Desktop/AWS_SSH/testkey.pem": bad permissions
ec2-user@3.112.4.99: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
satton@sattonMBP ~ % 

EC2のグローバルIPアドレスってどこ?

ここの部分になります。
(AWSマネジメントコンソール→EC2→インスタンス一覧)

スクリーンショット 2020-07-01 21.49.57.png

参考

AWSのEC2にmacからSSHする方法

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

ansibleをportを指定して、localで立てたamazonlinux2 dockerコンテナに対して実行する

紹介する内容

  • ansibleをlocal(127.0.0.1)のport(55556)を指定して実行します
  • sshログイン可能なdockerコンテナ(amazonlinux2)作成します

結論

デプロイ試しに活用できます

  • production環境のリソース(AWSなど)を使わずにansibleを試せます
  • デプロイ(Deployer、Capistranoなど)試しにも応用できると思います
  • dockerイメージをAWS公式のamazonlinux2を使用したから、AWSのEC2に近い試しになれると思います

紹介始めます

ディレクトリ構成

全体ソースコードは https://github.com/cheekykorkind/qiita-example/tree/master/ansible/to-docker で確認できます

  • 全体図
    allD.png

  • ansible担当デレクトリー
    ansibleD.png

  • ssh鍵担当デレクトリー
    sshD.png

ansibleのport指定、localに対して実行する実装周り説明

  • playbookとinventoryによってport(55556)、local(127.0.0.1)指定されます
    • playbookはansible/local_docker_book.ymlファイルです
      • playbookのhostsはinventoryファイルに書いたlocal_dockerにします
    • inventoryはansible/local_hostsファイルです
      • inventoryでlocalを意味する127.0.0.1にします
      • inventoryでansible_port=55556で使いたいpostを指定します

sshログイン実装周り説明

  • 公開鍵docker-ssh-key.pubを加えたauthorized_keysファイル持って待機しているdockerコンテナに対して、ansibleが秘密鍵docker-ssh-keyを使ってsshログインします
    • 公開鍵はdocker-ssh/docker-ssh-key.pubファイルです
    • 秘密鍵はdocker-ssh/docker-ssh-keyファイルです
    • 公開鍵を加えたauthorized_keysはdocker-ssh/authorized_keysファイルです
    • docker-compose.ymlファイルで./docker-ssh:/home/ec2-user/.sshにマウントしているから、ansible実行するマシンとdockerコンテナ両方でファイルが使用可能です
      • entrypoint.shファイルで公開鍵、秘密鍵、authorized_keysの所有者をansible実行するマシンのユーザーと同じく設定し、権限を調整しています
        • dockerコンテナ中のユーザーのUIDをansible実行するマシンのユーザーのUIDと同じくすることで両方ファイル所有権を気にせずに使えます
    • docker-compose.ymlファイルでansibleが使うportを用意しますports: '55556:22'
      • dockerコンテナに開いたportにsshログイン作業処理してくれるsshdをバックグラウンドで起動しておきます
        • entrypoint.sh/usr/sbin/sshd -D部分です
      • sshdは指定された名前の秘密鍵/etc/ssh/ssh_host_rsa_keyがないと怒りますから、使用しませんがssh秘密鍵を作っておきます
        • DockerfileRUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''部分です
    • ansible実行コマンドansible-playbook local_docker_book.yml -i local_hosts -u ec2-user --private-key ../docker-ssh/docker-ssh-keyでsshに使う秘密鍵を指定してます

試し順番です

ansibleはファイルnginx.repoを2箇所(/etc/yum.repos.d/nginx.repo/home/ec2-user/nginx.repo)にをコピーする内容です。
実行成功したら、dockerコンテナの/etc/yum.repos.d/nginx.repo/home/ec2-user/nginx.repoにファイルが見えます。

  1. docker composeがあるデレクトリー移動に移動します
    • cd qitta-example/ansible/to-docker
  2. dockerコンテナをバックグラウンドで起動します
    • DOCKER_UID=$(id -u $USER) DOCKER_GID=$(id -g $USER) docker-compose up -d
  3. Ansibleのplaybookがあるデレクトリーに移動します
    • cd qitta-example/ansible/to-docker/ansible
  4. Ansible実行します(両方同じです。どっちでも実行可能です)
    • ansible-playbook local_docker_book.yml -i local_hosts -u ec2-user --private-key ../docker-ssh/docker-ssh-key
    • sh local_docker_book.sh

試します

ansible.gif

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

Live Sync for AWS Cloud9の使用

1.はじめに

Visual Studio Codeのマーケットプレイスにある「Live Sync for AWS Cloud9」を使ってVScodeで直接Cloud9を操作します。

2.Live Sync for AWS Cloud9のインストール

VScode上で「Live Sync for AWS Cloud9」をインストールします。
image.png

Cloud9で検索すれば出てきますので、そのままインストールします。

3.AWSでの設定

3.1 グループの作成

「IAM」 → 「アクセス管理」 → 「グループの設定」

image.png

新しいグループを設定し、グループ名を設定します。
例えば「vscode_user」と設定します。

ポリシーのアタッチで
・AmazonEC2FullAccess
・AWSCloud9Administrator
をチェックして「次のステップ」、確認画面で「グループの作成」
image.png

作成したグループを選択し、ユーザーを割り当てます。
「IAM」 → 「グループ」で作成したグループ名を選択 → 「グループにユーザーを追加」

3.2 アクセスキーの作成

「IAM」 → 「ユーザー」で割り当てたユーザーを選択し、認証情報のタブを選択
「アクセスキーの作成」ボタンを押します。

image.png

ここでアクセスキーIDとシークレットアクセスキーを取得します。
シークレットアクセスキーはこの時点でしか取得できませんのでご注意ください。

4.VSCodeでの設定

「F1」 → cloud9 Sync Setupと入力し、取得したIDとアクセスキーを設定します。
リージョンはcloud9で使っている地域を設定します。

image.png

左側に追加されているCloud9のアイコンを選択して、使いたいEnviromentを選択します。

image.png

これでAWS Cluod9上のコードが直接編集できます。

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

AWSの超基礎〜物理的に捉えてみる〜

まずは
グローバルインフラストラクチャ
をみてください。

ここら辺の話をちょっとしていきたいと思ってます。

リージョン

物理的なインフラを配置する地域。
東京とかのやつですね

アベイラビリティーゾーン

複数のデータセンターで構成されている。
リージョンの中に存在している。
地理、電源などのファシリティが完全に分離されている。

データーセンター

複数のサーバーを管理しているところ

Pop (Points of Presence)

エッジロケーションとリージョナルで構成されたサーバ群。
ユーザーに近いところで管理している。

エッジロケーション

Amazon Route 53, Amazon CloudFront, AWS WAF, AWS Shieldを提供

実際、図でみると、、、

グローバルインフラストラクチャ
でみてください。

私たちのポチッとが、こんな感じで配置されているんですね、、、。

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

AWSで学ぶクラウドの超基礎②〜クラウドのサービスモデルについて〜

AWSの勉強をしている時にふとクラウドについて気になったのでまとめていこうと思います。

第一回
https://qiita.com/roko18366758/items/499013ea919e7b8834a5

クラウドのサービスモデル

調べた感じ、この3つを抑えておければ大丈夫かと思います。

IaaS(infrastructure as a Service)

ファシリティ、ハードウェア、仮想化基盤までクラウドプロバイダが提供する。
ユーザーは、OS、ストレージやネットワークの管理軽減と責任をもつ。
他にもOSユーザーの設定やミドルウェア、アプリケーションのデプロイ、ファイアウォールなどのネットワークセキュリティについてもユーザーがわで対応する必要がある。

Amazonでいうと

AmazonEC2,Amanzon EBS,Amanzon VPCなど

PaaS

ファシリティ、ハードウェア、仮想化基盤、OS,ミドルウェアまでクラウドプロバイダが提供する。
ユーザーは開発したアプリケーションをデプロイするだけでサービスを提供できる。
ハードウェアやネットワーク、OSを意識する必要なし。

Amazonでいうと

Amazon RDS, AWS Elastic Beanstalk, AWS Lambda, Amazon EKS

SaaS

ファシリティ、ハードウェア、仮想化基盤、OS,ミドルウェア、アプリケーションまでクラウドプロバイダが提供する。
ユーザーからはアプリケーションしか見えない。
GmailやSalesforceなど。
ユーザーはハードディスクなどのインフラやOSのセキュリティを意識せずに利用できる。

Amazonでいうと

Amazon WorkMail, Amanzon WorkDocs

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

Session Manager で Amazon Linux ユーザーを切り替える

ec2-user になる

$ sudo su --login ec2-user

root になる

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

未経験者が1か月でソリューションアーキテクトアソシエイト(SAA)を取得するためにやること2選

こんにちは、みきおです。
タイトルの通り、未経験だけどとにかく効率的にソリューションアーキテクトアソシエイト(SAA)を取得したい人の養分になればと思います。

対象

  • 未経験だけどSAAを取得したい人
  • とにかく効率重視でSAAを取得したい人
  • SAAを取得したい人
  • Black Belt?なにそれ?だけどSAAを取得したい人
  • 他の人がどんな勉強をしたか参考にしたい人

はじめに

SAAを取得するためにやるべきことは大きく3つのステップに分けられます。

  • AWSサービス群の全体の把握
  • 各サービスの詳細の把握
  • 試験対策

上記のうち、各サービスの詳細の把握と試験対策についてだいぶ被るので一つにまとめます。

1. AWSサービス群の全体の把握

AWS認定アソシエイト3資格対策をおすすめします。
3資格対策と銘打たれていますが、デベロッパーアソシエイトでは不十分でした。SAAについても1下記書籍オンリーでは未経験者にはきついと思いますので、下記に続きます。

2. 各サービスの詳細の把握と試験対策

Udemyのソリューションアーキテクトアソシエイトの試験対策にて模擬試験を周回します。
全65問を回答後に各設問に対する答えと詳細な解説がついてきます。解説で理解できない部分をググるなりすると理解が深まってくるかと思います。
1周以上がマストで2周以上80~90%の正解率が出せればベストです。
心配性な方はUdemyのハンズオンもやってみてもいいかもしれませんが、動画が待ってられなかったのと聞き取りづらい箇所があったので私はあまりお勧めしませんしやってません。

さいごに

勉強時間などを書いておきます。
平日:約1時間(だいたい週4ほど)
休日:約2~6時間
32~68時間くらいなので間をとって50時間くらいかなと思います。

配分は書籍(全体の把握)と模擬試験で半々くらいだったと思います。全体を把握するのに時間がかかりましたが、覚えがはやい方はもう少し短時間で済むかもしれません。

2020年4月ごろから勉強を始め、試験2週間前くらいから焦って本腰を入れて勉強し6月6日に取得しましたが計画的にやれば1か月では取得できるかと思います。
ちなみに1問1答形式でWEBに無料で公開してくれているサイトがあり、当初はできるだけお金をかけたくないとそれもやりこみましたが、必要経費とみなしてさっさとUdemyの模擬試験をやり込んでおけばよかったと思ってます。

多数の方が書かれていますが、Udemyはセールをやっているタイミング2で購入するのがベストです。

デベロッパーアソシエイトの取得はオンライン試験を受けたので、その際の様子も今後記事にしたいと思います。
ちなみにSAA取得後にlambdaとdynamodbをバックにしたWEBアプリを作りました。その後デベロッパーアソシエイトを受験しています。
WEBアプリの構成について簡易的ですが記事にしていますので、興味があればこちらもどうぞ。
これから個人開発をはじめてみようと思っている人へおすすめしたいアレコレ2020


  1. SysOpsアドミニストレーターについては受けていないのでわかりません。 

  2. Udemyにログインしていない2窓目でみたらセールしてたりします。セール値が正規値段疑惑ありますよね。 

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

HoneyCodeでworkbookを共有する方法

背景

2020/6/26にAmazonがHoneycodeというコードを記述せずにウェブやモバイルアプリを構築できるサービスを発表しました。
AmazonがHoneycodeについて説明している記事
このアプリを作成する時にworkbookというスプレッドシートみたいなものを使うのですが、そのworkbookは、複数人で共有することができます。
アプリを作成して人と共有しようと思ったのですが、共有の方法がわからなかったので、調べてまとめました。
結論から言うと、workbookを共有する前に、同じチームのメンバーにする必要があります。
同じチームのメンバーにさえなればworkbookの共有は簡単にできます。
同じチームのメンバーに登録する方法を説明した後にworkbookの共有方法を説明します。

workbookを共有するまでの手順

登録の手順は以下のような順番で行います。
1. シェアしたいメールアドレスでHoneycodeのアカウントを作成する。
2. シェアしたいworkbookをもつアカウントでチームメンバーの追加を行う。
3. メール受信後追加されたチームメンバーのアカウントでログインしチームに入る。
4. チームに入った後にShare workbookをクリックし、メンバーと共有する。
1に関してはもう一つ別のアカウントを作成するだけなので説明を省きます。
2以降に関して説明します。

シェアしたいworkbookをもつアカウントでチームメンバーの追加を行う

最初に現在のチームの状況を確認します。
画面左下にある、teamsという部分をクリックすると以下のような画面がでてきます。
スクリーンショット 2020-07-01 10.45.15.png
登録時に設定した自分の名前のチーム名がでていると思います。
ここの自分の名前のチーム名をクリックすると以下のような画面が出てきます。
スクリーンショット 2020-07-01 10.45.36.png
これが現在のチームメンバーの一覧になります。
(メールアドレスに関しては個人情報となるので隠しています。ご了承ください。)
この画面の右上の「Add team menber」をクリックしてください。
以下のような画面が出てくるので、「Enter recipient emails」の部分に、登録したいアカウントで使用しているメールアドレスを追加してください。
スクリーンショット 2020-07-01 10.47.02.png
右のMemberと書いてある部分は、チーム内での権限を表すものです。
Adminの場合は、他のチームメンバーの追加、削除ができます。
Memberの場合は、自分以外は操作することができません。
どちらか新規で追加したいアカウントに渡したい権限を選択して下さい。

以下のような画面が出てたらメールが送信されているのでメンバー登録したい別アカウントに切り替えてください。
スクリーンショット 2020-07-01 17.56.16.png

メール受信後追加されたチームメンバーのアカウントでログインしチームに入る

メンバー登録したいアカウントでログインしたら、そのアカウントで登録したときに使用したメールアドレス宛にHoneycodeからメールが来ていると思います。
このメールを開けると以下のように表示されます。
スクリーンショット 2020-07-01 10.51.37.png
メンバーに登録したいアカウントにログインしている状態で「Go to Honeycode」をクリックすると以下のような画面が出てきます。
スクリーンショット 2020-07-01 10.56.33.png
この「Join」を押すとクリックするとチームに入ることができます。
この「Join」が押された後は、メールマークが名前に変わります。
スクリーンショット 2020-07-01 18.04.35.png
これでメンバーの追加は完了です。

チームに入った後にShare workbookをクリックし、メンバーと共有する

シェアしたいworkbookに移動します。
画面右上にあるShare workbookをクリックすると以下のような画面が出てきます。
スクリーンショット 2020-07-01 11.05.09.png
このShare withの所に追加したいアカウント名を入れてください。
チームに追加できている場合は、以下のように予測が出るようになっています。
スクリーンショット 2020-07-01 11.08.24.png
追加したいアカウントをクリックすると以下のように変わります。
その後右下のUpdateを押すと共有できます。
スクリーンショット 2020-07-01 11.09.23.png

workbookの共有ができました。
この時workbookも共有する時に権限を渡すことができます。
workbookへの編集はどちらでもできました。
Ownerは、自分を含めてOwnerとCollaboratorの切り替えをすることができ、他のworkbookを共有しているメンバーにアクセスさせないようにすることもできます。
Collaboratorは、他の人にCollaborator権限を付与することができ、他のworkbookを共有しているCollaborator権限を持つメンバーにアクセスさせないようにすることができます。

以上です。

まとめ

HoneyCodeでworkbookを共有する時は、先にチームに共有したいアカウントを追加する必要があります。

感想

権限周りを調べるときに、複数のアカウントを使わないといけなかったので、アカウントを切り替えるのが面倒でした。
AWSのコンソールでも同じなので、この部分に関しては、同一ブラウザでも複数のアカウントを使えるようにしてもらえると嬉しいと思いました。

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

AWS S3からファイルを取得したFlask APIがファイルをレスポンスとして返戻し、Vueでダウンロードする

はじめに

忙しいタイトルをしていて、大変申し訳ありません。
現在、以下のアプリ構成でお仕事をしています。
フロントエンド: Vue.js
バックエンド: Flask (python)

Flaskの方については、これまで全く触ったことがなかったので、新鮮さを噛みしめつつ、日々触っています。
そもそもpythonの方も、ファイルを読み込んでcsvを吐き出してくれるというプチツールを作ったことがあるぐらいですので、多くのことを勉強させてもらっています。

本記事で書くこと

タイトルそのままですが、以下を実現します。
1. Flask(Api)が、AWS SDK for Python (Boto3)を使って、AWS S3からファイルを取得する。
2. 取得したファイルデータをレスポンスに詰め、クライアント(Vue.js)に返却する。
3. クライアント(Vue.js)がレスポンスからファイルをダウンロードする。
Lambda + API GateWayで良いのでは・・・
こんなこともできるんだというぐらいの気持ちで読んでください。

本記事で書かないこと

  • Lambda + API GateWayで上記の流れを実現すること
  • Flaskについてのあれこれ
  • pythonについてのあれこれ
  • aws関連についてのあれこれ
  • Vue.jsについてあれこれ
  • fetch APIのあれこれ

おそらく上記は色々な方が実践済みだと思うので。

なぜやろうと思ったのか

そもそも、今回の機能は amplify で実現する予定でした。
が、「Internet Explorer」の場合は、なぜか、aws credentialの認証情報がamplifyにわたってくれず、s3からファイルを取得しようしたときに、403エラーになるという状況に・・・
そのため、このように実装することにしました。
ですので、「Internet Explorer」を対象外とする場合は、素直にamplifyを使うことをオススメします・・・

環境

  • vue: 2.6.11
  • boto3: 1.12.38
  • Flask: 1.1.2
  • python: 3系

事前準備

  • awscli、boto3をインストールしておく
  • aws configureで、awscliを使えるようにしておく

それでは内容へ

1. Flask(Api)が、AWS SDK for Python (Boto3)を使って、AWS S3からファイルを取得する。

s3からファイルを取得する場合に、以下二つの方法があります。

ローカルにダウンロード
boto3.resource('s3').Bucket(BUCKET).download_file(Filename=KEY, Key=KEY)
メモリ上にダウンロード
boto3.client('s3').get_object(Bucket=bucket, Key=key)

Flaskのローカル(アプリケーション上)にファイルがダウンロードされてしまうと、そのファイルを消したりしないといけないのが面倒なので、後者のメモリ上にダウンロードする方法を採用しました。

ソースコード

s3からファイルを取得する
@app.route('/file', methods=['GET'])
def get_file_from_s3():
    s3 = boto3.client('s3')
    bucket = 'YOUR_BUCKET_NAME'
    key = 'YOUR_FILE_NAME'

    obj = s3.get_object(Bucket=bucket, Key=key)

これで、/fileのエンドポイントを叩くことで、s3からファイルオブジェクトを取得することができました。
このobjの内、Bodyのバイト配列を今回は利用します。

2. 取得したファイルデータをレスポンスに詰め、クライアントに返却する。

それでは、取得したファイルオブジェクトからレスポンスをつくりましょう。
レスポンスはmake_response()でつくります。

ソースコード

取得したファイルオブジェクトからレスポンスをつくって返却してあげる
@app.route('/file', methods=['GET'])
def get_file_from_s3():
    s3 = boto3.client('s3')
    bucket = 'YOUR_BUCKET_NAME'
    key = 'YOUR_FILE_NAME'

    obj = s3.get_object(Bucket=bucket, Key=key)

    response = make_response()

    # レスポンスobjectのdataに取得したファイル情報を設定します。
    # read()で、ファイルを読み込みます。
    response.data = obj['Body'].read()

    # ダウンロード時のファイル名を定義します。
    # quoted_filenameでURLエンコードします。また、日本語のファイル名でもできるように、UTF-8エンコーディングもします。
    quoted_filename = urllib.parse.quote(name)
    response.headers['Content-Disposition'] = "attachment; filename='{}'; filename*=UTF-8''{}".format(quoted_filename, quoted_filename)

    return response

3. クライアントがレスポンス情報をダウンロードする。

それでは、クライアント(Vue.js)でレスポンスのファイル情報をダウンロードしましょう。
今回はFetch APIを利用します。

ソースコード

レスポンスからファイルをダウンロードする
    fetch('http://XXXXXX/file', {
      method: 'GET',
    }).then((response) = >{
      // blob()で、Blob形式にします
      return response.blob();
    }).then((blob) => {
      // IEの場合は、msSaveBlobを使います
      if (window.navigator.msSaveBlob) {
        window.navigator.msSaveBlob(blob, 'ファイル名.拡張子');
      } else {
        const a = document.createElement('a');
        a.download = 'ファイル名.拡張子';
        a.href = URL.createObjectURL(blob);
        a.click();
      }
    })

これで、ファイル名.拡張子のファイルをダウンロードできます。
ファイル名.拡張子Content-Dispositionのfilenameとしたい場合は、
response.headers.get('Content-Disposition)Content-Dispositionを取得できるので、そこから抽出して使うと良いと思います。

参考にさせていただいた記事

Flaskでファイルダウンロードを実現する3つの方法
Python の boto3 で S3 とダウンロード/アップロードする
Djnagoメモ Content-Dispositionのfilenameに日本語をセットする

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

Amazon Conect

Amazon Connect

Amazon Connect は、オムニチャネルクラウドコンタクトセンター

統合しているサービス

AWS Lambda

AWS Lambda 関数を使用して、Amazon Connect 外のソースのデータを検索したり、投稿したりできます。たとえば、お客様の電話番号に基づいて SalesForce のインバウンド発信者を検索できます。この関数は、お客様名、会員レベル (頻繁利用者など)、直近の注文、注文ステータスなどを返すことができます。次に、その

電話番号からどこの誰かわかる。会社とか役職とか

S3

Amazon Connect は Amazon Simple Storage Service (Amazon S3) を使用して、記録された会話やエクスポートされたレポートを保存します。Amazon Connect を設定すると、これらの要件に合わせてデフォルトのバケットが作成されます。または、既存の Amazon S3 インフラストラクチャを指すように設定します。

会話記録はS3で管理

VPC エンドポイントはサポートされていません。

Amazon S3 Glacier にデータを移動してより低コストで長期に保存するように Amazon S3 ポリシーを管理することもできます。ただし、そうすると Amazon Connect の問い合わせ追跡レコード (CTR) のリンクが切断されます。これを修正するには、Lambda 関数を使用して、CTR のデータと一致するように S3 Glacier オブジェクトの名前を変更します。

制約がある

DynamoDB

さまざまな目的のために Amazon Connect と AWS データベースを併用できます。たとえば、DynamoDB で、データのクイックテーブルを作成できます。

通話のルーティング用に動的情報のテーブルを作成することもできます。たとえば、Lambda 関数は DynamoDB テーブルに着信通話を書き込み、このテーブルにクエリを実行して、その電話番号と一致する他の通話があるかどうかを確認できます。他の通話があった場合は、発信者を前と同じキューに送信するか、繰り返しの発信者としてフラグを設定できます。

どういう会話になるんだろ

分析

Amazon Connect は、問い合わせ追跡レコード (CTR)を使用してすべてのやり取りを追跡します。CRT は、リアルタイムレポートおよび履歴メトリクスレポートのために使用します。また、Amazon Kinesis を使用して、BI 分析 (Amazon QuickSight や、Tableau などのサードパーティー) 用に Amazon Redshift や Amazon Athena などの AWS データベースに CRT をストリーミングすることもできます。この機能を Amazon Redshift や Athena で設定するために使用できる AWS CloudFormation テンプレートがあります。

機械学習 (ML) と人工知能 (AI)

Amazon Lex — 自動音声応答 (IVR) として使用するチャットボットを作成します。

Amazon Polly — すべての問い合わせフローでテキスト読み上げを提供します。

Amazon Transcribe — 会話の記録を Amazon S3 から取り出し、テキストに書き起こして読めるようにします。

Amazon Comprehend — 録音の書き起こし、音声分析の機械学習をコールに適用して、センチメント、キーワード、企業ポリシーの遵守などを識別します

Amazon Connect の開始方法

  • Amazon Connect インスタンスの作成。

    • インスタンスを使用して、サポートセンターに関連するすべてのリソースと設定を含めます。音声録音とチャットのトランスクリプトの保存場所、およびユーザーアカウントなどの管理方法を指定します。
  • コンタクトセンターの電話番号。

    • 音声を使用している場合は、AWS が提供する電話番号を登録するか、現在の電話番号を Amazon Connect に移植します。番号を移植する場合は、番号が移植されるのを待つ間に Amazon Connect をテストしてコンタクトセンターを構築できるように、番号を登録することをお勧めします。
  • ルーティングの設定

    • キューとルーティングプロファイルを作成し、オペレーション時間を設定します。ルーティングプロファイルで、エージェントが使用するチャネル(音声、チャット、またはその両方)を指定します。また、エージェントが同時に管理できるチャット数も指定します。
  • Amazon Connect 問い合わせフローの作成。

    • 問い合わせフローを確立して、最初から最後までのコンタクトセンターでのカスタマーエクスペリエンスを定義します。1 つの問い合わせフローが音声とチャットの両方で動作し、より効率的に設計できます。問い合わせフローを構築し、ブロックを設定するとき、フローが音声、チャット、またはその両方に対してどのように機能するかを指定します。
  • マネージャーおよびエージェントである、ユーザーを追加し、その設定を行います。各エージェントにルーティングプロファイルを割り当て、ソフトフォンとデスクフォンのどちらを使用するかを指定し、[問い合わせ後作業] の持ち時間を設定します。

概念

Amazon Connect では、オムニチャネルコンタクトセンターを作成できます。これは、音声やチャットなど、複数の通信チャネルにわたって統一されたエクスペリエンスを提供するコンタクトセンターです。

Amazon Connect では、1 度構築して、音声チャネルとチャットチャネルの両方で次のエクスペリエンスを有効にします。

両方のチャネルで同じルーティングプロファイル、キュー、問い合わせフロー、メトリクス、およびレポートを使用します。

マネージャーは、1 つのダッシュボードから両方のチャネルを監視します。

エージェントは、すべての顧客を 1 つのインターフェイスのみから処理します。顧客とのやり取りがチャットで始まり、音声に移行した場合、音声通話を処理するエージェントは完全なチャットトランスクリプトを保持するため、コンテキストが保持されますAmazon Connect では、1 度構築して、音声チャネルとチャットチャネルの両方で次のエクスペリエンスを有効にします。

両方のチャネルで同じルーティングプロファイル、キュー、問い合わせフロー、メトリクス、およびレポートを使用します。

マネージャーは、1 つのダッシュボードから両方のチャネルを監視します。

エージェントは、すべての顧客を 1 つのインターフェイスのみから処理します。顧客とのやり取りがチャットで始まり、音声に移行した場合、音声通話を処理するエージェントは完全なチャットトランスクリプトを保持するため、コンテキストが保持されます。

  • テレフォニー
  • チャット
  • ルーティングプロファイル
  • キュー: 標準およびエージェント
  • キュー: 優先度と遅延
  • キューベースのルーティング
  • チャネルおよび同時実行
  • 問い合わせフロー

テレフォニー

Amazon Connect には、会社が電話を発信および受信できるようにするためのさまざまな選択肢が用意されています。Amazon Connect の大きな利点の 1 つは、AWS がテレフォニーインフラストラクチャ(キャリア接続、冗長性、ルーティング)を管理することです。また、拡張できるように設計されています。

チャット

Amazon Connect を使用すると、顧客はエージェントまたは Amazon Lex ボットとチャットを開始し、そこから離れ、会話を再開できます。顧客は、デバイスを切り替えてチャットを続けることもできます。これは非同期のやり取りです。

ルーティングプロファイル

ルーティングプロファイルによって、エージェントが受信できる問い合わせのタイプとルーティングの優先度が決定されます。

各エージェントは 1 つのルーティングプロファイルに割り当てられています。

ルーティングプロファイルには、複数のエージェントを割り当てることができます。

キュー: 標準およびエージェント

キューには 2 つのタイプがあります。

標準キュー: 問い合わせがエージェントにルーティングされて受け付けられる前に待機する場所です。

エージェントキュー: エージェントを問い合わせセンターに追加すると自動的に作成されるキューです。

問い合わせは、問い合わせフローの一部として明示的にエージェントキューに送信された場合にのみ、エージェントキューにルーティングされます。たとえば、請求やプレミアムサポートなど、特定の顧客の問題を担当する特定のエージェントに問い合わせをルーティングできます。または、エージェントキューを使用して、エージェントのボイスメールにルーティングすることもできます。

エージェントキューで待機している問い合わせは、標準キューで待機している問い合わせよりも優先順位が高くなります。エージェントキュー内の問い合わせは、優先度が最も高く、遅延はゼロです。

最高優先度: 基本キューに別の問い合わせがある場合、Amazon Connect は最初にエージェントキュー内の問い合わせをエージェントに割り当てます。

ゼロ遅延: エージェントが利用可能な場合、問い合わせは即座にエージェントにルーティングされます。

キュー: 優先度と遅延

キューベースのルーティング

チャネルおよび同時実行

問い合わせフロー

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

Amazon Athenaを始めるときに知っておきたいこと

はじめに

株式会社ipocaでAthenaを扱ってきて、最初から知っておけばより早く、より効率的にやれたなと思うところをまとめました。なるべく公式ドキュメントを参照していますが、間違っている部分もあるかと思いますので、最後はドキュメントを確認していただきたいです。また間違った点は指摘いただけると幸いです。
本内容は2020年7月1日現在の内容となっています。

Athenaとは?

Amazon Athena とは

Amazon Athena は、標準 SQL を使用して Amazon Simple Storage Service (Amazon S3) でのデータの直接分析を簡易化するインタラクティブなクエリサービスです。AWS マネジメントコンソールでいくつかアクションを実行するだけで、Athena にデータの保存先の Amazon S3 を設定し、標準 SQL を使用してアドホッククエリの実行を開始できます。結果は数秒で返ります。

とありますが、わかりやすく言うと手持ちのCSVファイルなどをS3バケットにおいておくだけでそのままDBのように扱えるようになるサービスです。DBと言ってもデータの取り出しのみ(select)で、insertやupdateは扱えません。
速度もインスタンスタイプにもよりますがRDSで組み込むよりも圧倒的に早く結果を得ることが可能となります。結果は数秒で返りますとありますが、これはもちろんデータ量に依存するので数秒で帰らないことは多々あります。また逆に言えば必ず数秒はかかることとなります。速度を求めるのであればRedShiftの導入のほうが良さそうです。

料金は後述しますが、従量課金で費用も抑えられます。使ってないときはS3の料金のみとなるので、利用方法によりますが、初めて使う人にも費用は優しいものと思われます。

料金

Amazon Athena の料金

スキャンされたデータ 1 TB あたり 5.00USD

Athenaに関しては上記費用です。10 MB 未満のクエリは 10 MB と計算されるため、最低でも0.00005USD分はかかってしまう想定です。1円もかからないのでよっぽどのことがない限り無視できるかと思います。
またこれとは別にデータをS3に置いているのでその費用はかかってきます。単純なストレージ料金とリクエスト料金がかかります。これは公式の情報ではありませんが、1クエリに対して1ファイル2~3アクセスあるように見えました。これも基本的には誤差の範囲ですが、大規模なサービスになる場合は留意しておく必要があります。

弊社は当初別室テムで細切れに作成された数KBの数万以上のファイルを読み込んでいましたが、S3の費用が圧倒的にかかってしまい、対処が必要となりました。
後述するファイルサイズの最適化で詳しくのべます。

SQL

Amazon Athena の SQL リファレンス

Amazon Athena では、データ定義言語 (DDL) とデータ操作言語 (DML) のステートメント、関数、演算子、およびデータ型のサブセットがサポートされています。いくつかの例外を除き、Athena DDL は HiveQL DDL に基づいており、Athena DML は Presto 0.172 に基づいています。

とあるようにSQLを書くときはPrestoの構文で書きます。普段MySQLを触っている自分としては特に変わった所はないように感じましたが、ちょっとした関数の違いなどがあるので都度ドキュメントを参考にするといいと思います。

ファイル形式

サポートされる SerDes およびデータ形式

Athena でテーブルの作成とデータのクエリをサポートしているのは、CSV、TSV、カスタム区切り、JSON の各形式のデータ、Hadoop 関連形式 (ORC、Apache Avro、Parquet) のデータ、および Logstash ログ、AWS CloudTrail ログ、Apache WebServer ログです。

サポートしているファイル形式はいくらかありますが、自分はCSVとParquetの2種類なのでこの2種類に限って話をします。
まずCSVですが、これは普段から使うようなファイル形式なので使う機会が多いのではないでしょうか。CSVを使うときはファイルを圧縮しても可能なので必ずgzipなどで圧縮しましょう。圧縮するとスキャンデータ量が減るので費用を抑えることができます。当然S3の費用も抑えられます。zip形式は対応していないのでその点のみ注意です。

ただ弊社では基本Parquetファイルを利用しています。これは列指向データなので列を指定することでスキャン量を大幅に減らせます。大規模データになればなるほど正規化されていないデータが多くなるので列を絞ってクエリを実行することで速度アップ・費用を抑えることが可能です。

select * from users

ではなく

select id, name from users

というようなSQLにします(id、name以外にたくさんカラムがある想定)。またParquetはそれ自体圧縮されたものなので、圧縮する必要はありません。
Parquet形式のファイルはpython使うとCSVなどから変換できますが、Athenaを利用しても作成できます。
参考:AthenaでCSVファイルからParquet形式へ変換

ファイルサイズの最適化

Amazon Athena のパフォーマンスチューニング Tips トップ 10
S3に置いているファイル数が多いとリクエスト数が増えると上述しましたが、どれくらいのファイルサイズにまとめるべきか上記リンクに記載があります。

ただしファイルサイズが非常に小さい場合、特に 128MB 未満の場合には、実行エンジンは S3ファイルのオープン、ディレクトリのリスト表示、オブジェクトメタデータの取得、データ転送のセットアップ、ファイルヘッダーの読み込み、圧縮ディレクトリの読み込み、といった処理に余分な時間がかかります。

128MB以下のファイルだと速度が低下するようなのでそれ以上にすると良いみたいです。ただあまり大きいファイルにすると小さいクエリでもスキャン量が大きくなるので弊社では128MB程度のファイルにまとめています。

当初は小さいファイル(数KB~数MB)でクエリを実行していましたが、実際に実行時間は数分の1から十分の1程度まで下がった一方スキャン量は増えました。
Athenaの料金はいくらか上がりますが、小さい多くのファイルが対象だとS3へのリクエスト量が増え、S3料金が発生るるのでやはり小さいファイルにまとめるのは得策ではなさそうです。

パーティション

データが大きくなってくるとクエリの時間や費用が大きくなってきます。そういった場合パーティションを利用すると速度・費用ともに改善されます。パーティションは時刻やその他のグループで分けるなど、普段流すことの多いクエリによって変わっていますが、弊社では時間で区切っています。
パーティションはあとから加えることも可能ですが。S3のディレクトリ(実際にはディレクトリではありませんがここでは便宜的にディレクトリと呼びます)構成を事前に整えておくことでメンテナンスが用意になります。またパーティションはいつでも好きなように区切れるわけではなくS3のディレクトリ構成に依存するのでいくらか事前に分けておくことをおすすめします。

s3://elasticmapreduce/samples/hive-ads/tables/impressions/year=2020/month=01/
s3://elasticmapreduce/samples/hive-ads/tables/impressions/year=2020/month=02/

このようにyear=のような形式にしておくとパーティションの詳細を都度加える必要がなくなります。

MSCK REPAIR TABLE <table_name>

の実行のみ必要となります。もしこのようなディレクトリ構成にしていない場合はAlter table文で対応します。
参考:Athenaで後からパーティションを追加する

またパーティションを利用することで、本来の使い方ではないかもしれませんが、ごちゃごちゃになったディレクトリ構成でも単一のうまくデータを分けられることがあります。
参考:Athenaでは複数のS3ロケーションを指定できないのでその対応方法

TIMESTAMP型の結果が空になる

2020-07-01 15:54:12のようなYYYY-MM-DD HH:MM:SS形式のタイムスタンプをそのままAthenaに読ませるとエラーは出ないのですが、空欄で結果が返ってきます。
Amazon Athena のテーブルにクエリを実行すると、TIMESTAMP の結果が空になる
原因・対策は上記公式ドキュメントを参照すればOKなのですが、タイムスタンプ型を扱うにはYYYY-MM-DD HH:MM:SS.fffffffffという形式が必須となります。

上記リンクとは別の対処になるのですが、弊社では文字列型で一旦テーブルを作り、キャストしてcreate table as selectを利用しています。
キャストはcast(time_column as timestamp)でできるので、キャストしてテーブルを作り直す、またはキャストでタイムスタンプ型を都度作るようにしています。

ウィンドウ関数

大規模データを扱って基本的には何かを分析するものだと思われるのでウィンドウ関数は使えるとかなり便利かと思います。
ドキュメントは以下です。
Window Functions
たとえば特定のグループ順位をつけるためにROW_NUMBER関数を使ったり、前後の行を取得するためにLAG関数を利用したりしました。
参考:LAG関数利用例
ウィンドウ関数を普段から馴染みがある人は問題ありませんが、触ったことのない人は関数だけでもどのようなモノがあるか眺めておくと、必要なときに使えるかもしれません。

クエリ結果からのテーブルの作成

Athenaでは通常のDBにはあるinsertやupdate文は利用できません。基本的には今あるデータを閲覧すことがメインとなります。
ただ分析結果からあるデータを取り出し、さらにその結果を分析したい場合があります。
これを都度サブクエリを増やしていってデータを分析していくと、処理時間が膨大となります。その場合にはクエリ結果からテーブルを作成する、CREATE TABLE AS SELECT (CTAS) を利用することをおすすめします。
構文としては

CREATE TABLE <table_name>
    WITH (
    format='PARQUET',
    external_location='<s3://path/to/new/file/directory>'
) AS SELECT * FROM <exist_table_name>

最後のselect文で条件を指定したりなどをしてデータを抽出したものから新しいデータ・テーブルを作成します。上記例ではformatをParquetに指定しているので、元のファイルがCSVだったとしてもここでParquetに変換されます。
CATSを利用して
- カラム形式の変更
- データの絞り込み(不要データ削除)
- ファイル形式の変更
などを弊社では利用しており、頻繁に利用する機会があります。

タイムスタンプの比較

上述したようにタイムスタンプ型を利用するには少し注意が必要です。またさらに、タイムスタンプを比べるときのSQLにもひと工夫必要になります。
たとえばMySQLであれば

WHERE created_at > '2020-07-01 16:44:51'

というような構文が有効となります(created_atというカラムがタイムスタンプ型と想定)
しかしAthenaの場合、タイムスタンプ型と文字列型は比較できませんとエラーとなってしまいます。そのためキャストする必要があります。

WHERE created_at > cast('2020-07-01 16:44:51' as timestamp)

こうすることで時刻の比較が可能となります。

ORDER BY を最適化する

Amazon Athena のパフォーマンスチューニング Tips トップ 10
こちらにもありますが、ORDER BYは単一のワーカーで実行されるため、ソート対象が大きくなるとかなり時間がかかります。そして大きくなりすぎると処理ができなくなりエラーが吐かれるので注意です。上記リンクにはlimitをつけるという対処しか書かれておらず、データ量を減らすしか現状では対応できないようです。

WEBアプリケーションとの連携について

弊社では一部PHPと連携させてAthenaから結果を取得しています。aws-sdk-phpを利用するとあとはcredential設定のみで簡単に利用可能です。
ただその際にも最低でも必ずレスポンスが帰ってくるまで数秒はかかるので、C向けのサービス等ではかなりキビいいと思われます。
例えばテーブル一覧の取得のSQLで、S3にアクセスしない場合でも3秒程度はかかっています。

最後に

まだまだやれていないこともたくさんあるかと思いますが、上記のことが実践した上でAWSエンジニアに現状を見てもらったところ、ほぼ完璧に組めているとお墨付きをもらいました。ただどれもが最初からできていたわけではなく、都度発生する課題に対してドキュメントを読み込んだり、様々な記事をたどっていった上でわかってきたことが多く、最初からわかっていればなぁと思ったことをまとめておきました。
間違っている部分も多かったり、より良い方法があったりすると思いますのでその点ありましたらご指摘いただけると助かります。

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

AWS EC2入門 #4: 固定IPを取得しよう

aws.png

今回でいったん最終回とさせていただきます。AWSにはほかにもさまざまなサービスがあるので、興味のある方はぜひ自分で調べて使ってみてください。

Elastic IPアドレスを利用する

①EC2ダッシュボードから「Elastic IP」を選択する
img1.png

②右下の「割り当て」をクリックする
img2.png

③「Elastic IPアドレスの関連付け」を選択する
img3.png

④リソースタイプに「インスタンス」を選択し、インスタンスを指定した後、「関連付ける」をクリックする
img4.png

⑤インスタンスを確認すると、パブリックIPが変わっているのがわかります
img5.png

⑥このパブリックIPをブラウザで確認してみると、前回と同じページが表示されています
img6.png
これでインスタンスを再起動したとしてもIPアドレスが変わることはありません。

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

AWS EC2入門 #2: AWSのセキュリティグループを変更しよう

aws.png
現時点では、インスタンスに発行されたパブリックIPをブラウザで見ようとすると、下の画面のようになってしまいます。
img1.png
これを解決するために、今回はセキュリティグループを変更していきます。

セキュリティグループを変更する

①EC2ダッシュボードに「セキュリティグループ」があるので選択する
img2.png

②インスタンスを指定し、「インバウンドルールを編集」をクリックする
img3.png

③「ルールを追加」をクリックした後、下の画面の通りに編集し、右下の「ルールを保存」をクリックする
img4.png

④ここで、Webサーバーソフトをインストールします(ここではApacheを入れていますが、Nginxでもいいです)

$ sudo yum install httpd

と打てば、Apacheをインストールできます。
img5.png
上の画像のように表示されれば、インストールは完了です。

⑤Apacheを起動します

$ sudo systemctl start httpd

img6.png
特に反応はありませんが、これで起動はできています。

⑥ここで再度、パブリックIPをブラウザで見てみると、
img7.png
Apacheのスタートページが表示されました。

次回

無事Webページが表示できたので、次はページの内容を変更していきます。

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

AWS EC2入門 #3: AWSのセキュリティグループを変更しよう

aws.png
現時点では、インスタンスに発行されたパブリックIPをブラウザで見ようとすると、下の画面のようになってしまいます。
img1.png
これを解決するために、今回はセキュリティグループを変更していきます。

セキュリティグループを変更する

①EC2ダッシュボードに「セキュリティグループ」があるので選択する
img2.png

②インスタンスを指定し、「インバウンドルールを編集」をクリックする
img3.png

③「ルールを追加」をクリックした後、下の画面の通りに編集し、右下の「ルールを保存」をクリックする
img4.png

④ここで、Webサーバーソフトをインストールします(ここではApacheを入れていますが、Nginxでもいいです)

$ sudo yum install httpd

と打てば、Apacheをインストールできます。
img5.png
上の画像のように表示されれば、インストールは完了です。

⑤Apacheを起動します

$ sudo systemctl start httpd

img6.png
特に反応はありませんが、これで起動はできています。

⑥ここで再度、パブリックIPをブラウザで見てみると、
img7.png
Apacheのスタートページが表示されました。

次回

今のままではインスタンスを終了して再度起動したときにIPアドレスが変更されてしまいます。そこで、次回はElastic IPを使って固定IPを取得します。

AWS EC2入門 #4: 固定IPを取得しよう

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

AWS EC2入門 #2: AWSにSSH接続しよう

aws.png

クライアントソフトを使ってSSH接続をする

①インスタンスに接続し、パブリックDNSをコピーする
img1.png

②PuTTYを起動し、Host Name (or IP Adress) にパブリックDNSをペーストする
img2.png

③PuTTYgenを起動し、ConversionsからImport Keyを選択、前回ダウンロードしたpemファイルを指定する。
img3.png

④Save private keyをクリックすると、ppkファイルを保存することができるので、任意のディレクトリに保存する(pemファイルと同じ名前でも構いません)

⑤PuTTYの左側のメニューで、SSHからAuthを選択、Browseをクリックし、ppkファイルを指定する
img4.png

⑥Openをクリックすると、インスタンスにSSH接続できます
img5.png

⑦ログイン名を聞かれるので、ec2-userと打ちます
img6.png
これで無事、ログインできました。

⑩今のままだとパッケージのバージョンが古いので、sudo yum updateと打ってアップデートします
img7.png
上の画像のように表示されればアップデートは完了です。

次回

セキュリティグループを変更してブラウザからアクセスできるようにします。

[AWS EC2入門 #3: AWSのセキュリティグループを変更しよう]

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

AWS EC2入門 #1: AWSをはじめよう

aws.png

AWSに触れたことのない方向けの記事です。
AWSアカウントを作っていない方は、ここで事前にアカウントを作っておいてください。

インスタンスを作成する

①AWSマネジメントコンソールでEC2を開く
img1.png

②リージョンを「アジアパシフィック(東京)」にする
img2.png

③左側のメニューから「インスタンス」を選択し、「インスタンスの作成」をクリックする
img3.png

④Amazon Linux2 AMI (HMI), SSD Volume Typeを選択する
img4.png

⑤t2.micro [無料利用枠の対象] を選択し、右下の「確認と作成」をクリックする
img5.png

⑥右下の「起動」をクリックする
img6.png

⑦キーペアを作成し、「インスタンスの作成」をクリックする
※キーペア名は好きに決めてください。ここではtestとします。キーペアは必ずダウンロードしておいてください。
img7.png

⑧インスタンスが作成し終わるまで待ちましょう。
img8.png
作成し終わるとインスタンスの状態がpendingからrunningに変わります。
img8-1.png

⑨インスタンスを選択した状態で「接続」をクリックすると、そのインスタンスに接続することができます。
img9.png
今回はEC2 Instance Connect (ブラウザベースのSSH接続) を選択し、「接続」をクリックします。

⑩インスタンスへの接続に成功しました
img10.png

次回

EC2にSSH接続しますので、PuTTYがない方は事前にインストールしておいてください。

AWS EC2入門 #2: AWSにSSH接続しよう

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

【AWS SAA】ストレージサービスの特徴を比較

はじめに

AWS SAA取得のため勉強しております。今回は自分の備忘録も兼ねて、試験でも頻出のストレージサービスの特徴を比較しつつ、簡単にまとめたいと思います。

EC2

インスタンスストア

・ホストコンピュータに内蔵されたディスクでEC2と不可分のブロックレベルの物理ストレージ。
・EC2の一時的なデータが保持され、EC2の停止・終了とともにクリアされる。

EBS(Elastic Block Store)

・ネットワークで接続されたブロックレベルのストレージでEC2から独立。
・EC2から独立しており、EC2をTerminateしてもEBSには保持可能でSnapshotをS3に保持可能。

EBS

・上記の説明同様EC2にアタッチして利用できるブロックレベルのストレージサービス。
・OS/アプリケーションのインストール先、データの保存先などとして利用。
・確保した容量分で課金。
・データは永続的に保存。
・99.99%の可用性。
・サイズは1GB〜16TB。

ボリュームタイプの種類 ユースケース
汎用SSD 仮想デスクトップ。低レイテンシーのアプリケーション。開発・テスト環境。
プロビジョンドIOPS 大規模なデータベース。ビジネスアプリケーション。
スループット最適化HDD ビッグデータ。データウェアハウス。ログ処理。
コールドHDD アクセス頻度の低い大量データ。バックアップ。
マグネティック 旧世代のボリュームタイプで基本的には使用しない。アクセス頻度が低い場合などに利用。

S3

・インターネット経由で利用できるオブジェクトストレージサービス。
・イレブンナイン(99.999999999%)の耐久性。
・結果整合性モデル データ更新・削除時、読み取りのタイミングによっては古いデータを読み込むことがある。
・容量無制限。
・安価。

ストレージクラス 特徴
S3 標準 耐久性が非常に高い
S3 Intelligent-Tiering 最もコスト効率の良いストレージクラスに自動的にデータを移動させる。
S3 標準-低頻度アクセス (IA IA:infrequent Access) アクセス頻度が低いが、必要となったらすぐにデータを取り出せる。
S3 1ゾーン-低頻度アクセス(S3 1ゾーン-IA) S3 標準-低頻度アクセスと同様にアクセス頻度が低く、かつ単一のアベイラビリティゾーン内でデータを保存でも良い場合に使われる。S3 標準-低頻度アクセスよりもコストをさらに20%削減できる。
S3 Glacier アーカイブ用ストレージ。コストは安く済む。

EFS

・複数のAZにある複数のEC2インスタンスから同時にアクセス可能な、ファイルストレージサービス。
・完全マネージド型のNFSファイルシステム。

まとめ

AWSは以下の3つの形式のストレージサービスを、提供していることがわかった。

ストレージタイプ ユースケース
ブロックストレージ EC2にアタッチして活用するディスクサービス。データベースシステムやERP システムといった企業アプリケーションなど、低レイテンシーなストレージが必要な場合に最適。例:EBS、インスタンスストア
オブジェクトストレージ 安価かつ高い耐久性を持つ、オンラインストレージ。高い可用性や耐久性を備えている一方で、更新や削除がすぐに反映されない。HTTPSなどでアクセス可能なエンドポイントを提供。ゼロから最新のアプリケーションの構築、分析、バックアップなどに最適。例:S3
ファイルストレージ 複数のEC2インスタンスから同時にアタッチ可能な共有ストレージサービス。ディレクトリ(フォルダ)構造という管理のしくみを備えている。大規模なコンテンツリポジトリ、開発環境、メディアストア、ユーザーのホームディレクトリといったユースケースに最適。例:EFS

参考
この1冊で合格! AWS認定ソリューションアーキテクト - アソシエイト テキスト&問題集
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html
これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)
https://aws.amazon.com/jp/what-is-cloud-object-storage/
https://business.ntt-east.co.jp/content/cloudsolution/column-65.html
https://business.ntt-east.co.jp/content/cloudsolution/column-64.html
https://aws.amazon.com/jp/efs/features/

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

metabase環境構築メモ

環境構築に手間取る

AWSにmetabaseを導入する場合、ElasticBeanstalkが推奨となっており、QuickLaunchも用意されていたにもかかわらず、構築に少し手間取りました。基本的には初期値で設定されているので、必要最低限の部分を自社の環境に合わせることで利用可能となります。ここでは注意点だけ記載します。

公式サイト:
https://www.metabase.com/docs/v0.35.4/operations-guide/running-metabase-on-elastic-beanstalk.html#running-metabase-on-aws-elastic-beanstalk

QuickLaunchでElasticBeanstalkに環境構築する際の注意点

リージョンの確認

初期値は"バージニア北部"が選択されます。
適切なリージョンを選択し直しましょう。
2020-07-01_09h30_31.png

ソースコードの事前ダウンロード

ソースコードをS3に公開してくれているのですが、初期値で設定されているURLを指定しても、リージョンが違うという理由でダウンロードできません。
2020-07-01_09h33_021.png

初期値のURLからもダウンロードできない

初期値に設定してあるS3のURLから先にソースコードをダウンロードしようとすると、証明書エラーとなりダウンロードできません。HTTPにすることでダウンロードできますので、ローカルに保存しておきます。

× https://downloads.metabase.com.s3.amazonaws.com/v0.35.4/metabase-aws-eb.zip
http://downloads.metabase.com.s3.amazonaws.com/v0.35.4/metabase-aws-eb.zip

ソースコードをローカルからアップロードする

先程ダウンロードしたソースコードをローカルファイルからアップロードします。
ソースコードがアップロードされたことを確認したら「確認して起動」ボタンを押します。
2020-07-01_09h46_43.png

おわりに

以後は公式サイトの案内に従うことで設定可能でした。あとは自社の環境に合わせての設定となります。また機会があれば続きも書きます。

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

AWS初心者がAWS 認定ソリューションアーキテクト アソシエイトを取得するまで

どうもAWS初心者のくせにAWS使用率100%の会社に転職したSATO論外です!
この度AWS初心者だった私ですがなんとかAWS認定ソリューションアーキテクトアソシエイトに合格することができました!!
その時に使用した勉強法と対策について簡単ですが紹介しようかと思います

使用した教材

勉強時間

  • 学習期間:約一ヶ月(業務中でのAWS操作は除く)
    ※ただし勉強できない日などもあったので学習期間2週間ほどあれば取れそうな感触がありました

やったこと

  • 前半1周目〜3周目:Udemyのアソシエイト試験突破講座を一通り流してみる
    • 概要の説明をうける&ハンズオンで実際にサービスを触りながらサービスを覚えていくことに集中する
    • 各セクション毎に小テスト(サービスの概要レベル)があるので全問正解できるまで挑戦
  • 後半4周目〜:アソシエイト試験突破講座に付属している模擬試験にチャレンジ
    • ひたすら模擬試験にチャレンジ!最初の方は全然点数が取れないので試験結果を見て理解が不足しているサービスの概要動画だけUdemyで確認
    • 合間合間でアソシエイト教科書をペラペラめくる
  • 試験2日前:アソシエイト試験突破講座に付属している模擬試験と別で買ったアソシエイト模擬試験問題集をひたすら再復讐
    • アソシエイト試験突破講座に付属している模擬試験は90点以上取れるようになるまで繰り返し解く
      • 模擬試験後に各問題の回答・解説と出てきたサービスについての概要が見れるのでひたすら正解するまで繰り返す
    • アソシエイト模擬試験問題集の通常問題は上記同様に90以上取れるまでくりかえして、高難易度問題については間違えた箇所の解説を読み込む

使用した教材の良かった点・悪かった点

  • Udemyの各教材について
    • 良かった点
      • SAAで知る必要があるサービスやユースケースについてわかりやすく解説してくれる
      • ハンズオンを行いながら学習できるので実際の操作方法を理解しながら学べる
      • SAA-C02(新バージョン)に対応している
      • 模擬試験が付属&別途販売しているので不足している知識がわかりやすく復讐もしやすい
      • アソシエイト模擬試験問題集を購入すれば高度な内容まで理解できる
    • 悪かった点
      • ハンズオンを含めると22.5 total 時間かかるため時間がない時は難しい
      • 実際にサービスを動かせる環境がhituyou(ハンズオンを省く場合は不要)
      • 買うタイミングを間違えるとかなり割高(通常時だと12,000円しますので割引タイミング(1600円ぐらいで買える)を狙って買った方が良いです)
  • アソシエイト教科書について
    • 良かった点
      • 各サービスについての説明などが乗っており概要を理解するにはちょうど良い
    • 悪かった点
      • サービスの実際の使い方などは理解できない
      • SAA-C02(新バージョン)にしていないので古い記述が一部ある

学習を振り返ってみて

現状販売している書籍などはどうしてもSAA-C02(新バージョン)に対応していないため、Udemyの教材の方に力を入れました
ただし、サービスの種類や概要を抑えるレベルであればアソシエイト教科書で補えるかと思います
主軸をUdemyにおいてサブツール的にアソシエイト教科書を使うのが良いと感じました

また最後に総復讐として模擬試験を行い、解説を読み込むことがサービスを理解するのに大いに役立ちます
※ただし、試験問題=模擬試験内容と言うわけではないのでキーワードだけで覚えるのはあまりおすすめしません

試験の内容的には各サービスを使うべきタイミングを覚えておくのが良いかと思います(EBSのボリュームタイプとかS3でどのストレージタイプをコスト面・パフォーマンス面など考えて使うべきなどの問題が出てきます)

追加でこれをやっておくとさらに合格率が上がりそう

  • 主要なサービスのAWSブラックベルトを確認する(概要類)
  • 時間とお金に余裕があればAWSの模擬試験を受けてみる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【AWS】AmazonLinuxにEFSボリュームのNFSマウントを実施してみる

はじめに

AmazonLinuxにEFSのNFSマウントを実施する手順をまとめたいと思います。
今回はEC2インスタンス2台に同じEFSをマウントして、ファイルを共有できるか確認するという内容になります。

そもそもEFSとは?

「Amazon Elastic File System」の略。
AWSクラウドサービスおよびオンプレミスリソースで使用するためのNFSファイルシステム

特徴

  • NFSサーバ(EFS)自体はAWSにて管理
  • 高い可用性と耐久性を備えている

基盤環境

項目 説明
OS Amazon Linux 2 AMI (HVM), SSD Volume Type
Size t2.micro

※AmazonLinuxは作成直後の状態になります。

構成

EFSマウント.png

構成表

項目 名前 備考
VPC efs-test -
セキュリティグループ efs-security -
サブネット#1 efs-public-1a AZ(ap-norheast-1a)
サブネット#2 efs-public-1c AZ(ap-norheast-1c)
EC2#1 efs-test01 -
EC2#2 efs-test02 -
EFS test-efs -

※サブネット2つにつきましては、パブリックIPへSSH接続できるように設定しています。

手順

※VPCについては、セキュリティグループの説明以外省略します。

EFS作成

①EFSを開く

AWSマネジメントコンソールよりEFSを開く。

1.JPG

②ファイルシステムの作成

「ファイルシステムの作成」をクリック。

2.JPG

③ネットワークアクセスの設定

以下のように設定

  • VPC
項目 名前 備考
VPC efs-test -
  • マウントターゲットの設定
チェック アベイラビリティーゾーン サブネット IPアドレス セキュリティグループ
ap-northeast-1a efs-public-1a 自動 efs-security
ap-northeast-1c efs-public-1c 自動 efs-security

3.JPG

設定後、次のステップをクリック

④タグ設定

下記のようにタグ設定を実施

キー
Name test-efs

4.JPG

他の設定はデフォルトのままで、次のステップをクリック

⑤内容確認

内容確認し、ファイルシステムの作成をクリック。

7.JPG

⑥ファイルシステム作成

ファイルシステム作成が完了すると、下記のようになる。
※マウントターゲットの状態が「利用可能」

efs.JPG

セキュリティグループ

セキュリティグループ(efs-security)にNFS(0.0.0.0/0)を追加。
※セキュリティグループはVPCダッシュボードから設定可能

9.JPG

※設定前の状態では、SSH/HTTP/HTTPSをフルオープン(0.0.0.0/0)状態にしています。

EC2設定

EC2インスタンス2台(efs-test01/efs-test02)に同様の設定を実施します。

①rootへスイッチ

sudo su

②ディスク確認

df -Ph

実行例

[root@ip-10-0-0-191 ec2-user]# df -Ph
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        474M     0  474M   0% /dev
tmpfs           492M     0  492M   0% /dev/shm
tmpfs           492M  400K  492M   1% /run
tmpfs           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1      8.0G  1.3G  6.8G  16% /
tmpfs            99M     0   99M   0% /run/user/1000
[root@ip-10-0-0-191 ec2-user]#

③amazon-efs-utilsパッケージインストール

yum -y install amazon-efs-utils

④EFSマウント

mkdir マウントしたいディレクトリ
mount -t efs <ファイルシステムID>:/ <マウントしたいディレクトリ>

実行例

mkdir /test
mount -t efs fs-ecfdfecd:/ /test

※ファイルシステムIDはこちらの部分になります。
(EFSダッシュボードのファイルシステム一覧から確認できます。)

ID.JPG

⑤EFSマウント確認

df -Ph

実行例

[root@ip-10-0-0-191 ~]# df -Ph
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        474M     0  474M   0% /dev
tmpfs                                           492M     0  492M   0% /dev/shm
tmpfs                                           492M  404K  492M   1% /run
tmpfs                                           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1                                      8.0G  1.3G  6.8G  16% /
tmpfs                                            99M     0   99M   0% /run/user/1000
fs-ecfdfecd.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /test
[root@ip-10-0-0-191 ~]#

確認

EC2インスタンス2台(efs-test01/efs-test02)にてファイルが共有できるか確認します。
※今回の確認手順では、分かりやすくするためにOSにホスト名を付与しています。

①マウント確認

2台とも「/test」にボリュームがマウントされていることを確認。

  • efs-test01
[root@efs-test01 ~]# df -Ph
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        474M     0  474M   0% /dev
tmpfs                                           492M     0  492M   0% /dev/shm
tmpfs                                           492M  464K  492M   1% /run
tmpfs                                           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1                                      8.0G  1.3G  6.8G  16% /
fs-ecfdfecd.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /test ← これ
tmpfs                                            99M     0   99M   0% /run/user/0
tmpfs                                            99M     0   99M   0% /run/user/1000
[root@efs-test01 ~]#
  • efs-test02
[root@efs-test02 ~]# df -Ph
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        474M     0  474M   0% /dev
tmpfs                                           492M     0  492M   0% /dev/shm
tmpfs                                           492M  464K  492M   1% /run
tmpfs                                           492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1                                      8.0G  1.3G  6.8G  16% /
tmpfs                                            99M     0   99M   0% /run/user/0
fs-ecfdfecd.efs.ap-northeast-1.amazonaws.com:/  8.0E     0  8.0E   0% /test
tmpfs                                            99M     0   99M   0% /run/user/1000
[root@efs-test02 ~]#

②efs-test01にてファイル作成

efs-test01より/textへファイルの作成を実施する。

ファイル作成の流れ

test.txt作成
test.txtに「test」と書き込み
test.txtの表示

コマンド

touch /test/test.txt
echo test > /test/test.txt
cat /test/test.txt

実行例

[root@efs-test01 ~]# touch /test/test.txt
[root@efs-test01 ~]# echo test > /test/test.txt
[root@efs-test01 ~]# cat /test/test.txt
test
[root@efs-test01 ~]#

③efs-test02にてファイル存在確認/ファイル削除

ファイル存在確認

/test内にefs-test01にて作成したファイルが存在することを確認。

ll /test
cat /test/test.txt

実行例

[root@efs-test02 ~]# ll /test
total 4
-rw-r--r-- 1 root root 5 Jun 30 14:26 test.txt
[root@efs-test02 ~]#
[root@efs-test02 ~]# cat /test/test.txt
test
[root@efs-test02 ~]#

ファイル削除

test.txtを削除する。

rm -f /test/test.txt

実行例

[root@efs-test02 ~]# rm -f /test/test.txt
[root@efs-test02 ~]# ll /test
total 0
[root@efs-test02 ~]#

④efs-test01にてファイル存在確認

test.txt/testより消えているか確認する。

ll /test

実行例

[root@efs-test01 ~]# ll /test
total 0
[root@efs-test01 ~]#

まとめ

  • AmazonLinuxにEFSボリュームをNFSマウントできる
  • EFSボリュームは複数のEC2インスタンスで共有できる。

参考

Amazon EFS入門 S3、EBSとの違いと使い方
Amazon Linux で amazon-efs-utils パッケージをインストールする
AWS EFS をEC2にマウントしてみる

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