AWS CloudFrontとLambda勉強まとめ

CloudFront

CDN
– Contents Delivery Network
– エッジのキャパシティを利用して効率的かつ高速にコンテンツ配信
→ユーザに最も近いサーバに誘導して、配信を高速化
→エッジサーバではコンテンツのキャッシングを行い、オリジンに負荷をかけない

・最適なエッジへの誘導方法
①ドメイン名問い合わせ(クライアント→DNS)
②IPアドレス問い合わせ(DNS→CloudFrontDNS)
③最適なEdgeアドレス応答(CloudFrontDNS→DNS)
④最適なEdgeへアクセス(クライアントからEdge)
⑤キャッシュがある場合:コンテンツ配信
キャッシュがない場合:オリジンサーバから取得

・CloudFront特徴
– 84拠点のエッジサーバ
– 予測不可能なスパイクアクセスへの対応
– ビルトインのセキュリティ機能(WAF連携、DDoS対策)
– 充実したレポート

・動的コンテンツ:ELBでEC2に負荷分散。HTML
静的コンテンツ:S3などで保存

・84エッジロケーション→11リージョナルキャッシュ→オリジン
→オリジンに対するコンテンツ取得を削減

CloudFront Distribution
– ドメインごとに割り当てられるCloudFrontの設定
– 40Gbpsもしくは100,000RPSを超える場合上限申請必要
– HTTP/2対応
– IPv6対応
– CNAMEエイリアスを利用して独自ドメイン名の指定可能
→Route53と合わせたZone Apex(wwwがないもの)も利用可能

Gzip圧縮機能
エッジでコンテンツをGzip圧縮することでより高速にコンテンツ配信
※S3はGzip圧縮をサポートしていないので有効

キャッシュコントロール
– キャッシュヒット率の向上がCDNのポイント
→URLおよび有効化したパラメータ値の完全一致でキャッシュが再利用

キャッシュの無効化
コンテンツごとの無効化パス指定

ダイナミックコンテンツ機能
オリジンサーバに対して下記情報をフォワードすることで、動的なページの配信にも対応
– ヘッダー(必要最小限)
– Cookie(Cookie名と値をセットでCloudFrontがキャッシュ)
– クエリ文字列パラメータの値

ダイナミックキャッシング
リクエストパターンをもとにオリジンへのアクセスルールを個別指定可能

カスタムエラーページ
4xx系:クライアントエラー。オリジン側で対処
5xx系:サーバエラー。CloudFrontで対処
参考URL:https://goo.gl/NcUQiY

読み取りタイムアウト
CloudFrontがオリジンからの応答を待つ時間を指定
デフォルトは30秒

キープアライブタイムアウト
接続を閉じる前に、CloudFrontがオリジンとの接続を維持する最大時間
デフォルトは5秒

・セキュリティ
– HTTPS対応
– SSL証明書
→専用IPアドレスSSL証明書には申請必要
ビューワーSSLセキュリティポリシー
→クライアントとCloudFront間のSSL/TLSプロトコルとCipherの組み合わせを指定可能
– オリジン暗号化通信
– オリジンカスタムヘッダー
GEOリストリクション
→地域情報でアクセス判定。制御されたアクセスには403を応答
署名付きURL
→プライベートコンテンツ配信。
→署名付きURLを生成する認証サイトにクライアントから認証リクエスト
→認証サイトからEdgeにアクセス※署名付き出ない場合は、403を返す
-オリジンサーバーの保護
→Origin Access Identitiy(OAI)を利用
S3のバケットへのアクセスをCloudFrontからのみに制限
– AWS WAF連携
AWS ShieldによるDDoS攻撃対策
ブロック時は403応答
– AWS ShieldによるDDoS攻撃対策
デフォルトで有効

・CloudFrontレポート・アクセスログ機能
任意のS3バケットに出力可能

・CloudWatchアラームの活用
リアルタイム障害・異常検知

・S3オリジン自動キャッシュの無効化(Invalidation)
S3にアップロード→Lambdaファンクション呼び出し→CloudFront Invalidation APIの呼び出し→CloudFront上でキャッシュの無効化

Lambda

高度にパーソナライズされたウェブサイト
ビューワーリクエストに応じたレスポンス生成
URLの書き換え
エッジでのアクセスコントロール
リモートネットワークの呼び出し

参考URL:https://www.slideshare.net/AmazonWebServicesJapan/aws-blackbelt-online-seminar-2017-amazon-cloudfront-aws-lambdaedge

続きを読む

Jenkins Pipeline から AWS SNS に publish する

Jenkins でのビルド失敗時に AWS SNS で通知を送りたかったので、そのために試行錯誤したメモ。

AWS SNS について

Simple Notification Service の略で、通知を扱うための AWS のマネージドサービス。AWS SNS にメッセージを Publish することで、設定に応じてメールやチャットツールなどに通知を送ることができる。

AWS SNS の設定方法についてはググればたくさん出てくるので割愛する。

今回は、AWS SNS の Topic は既に作成済みという前提で話をする。

Amazon SNS Build Notifier について

当初 Amazon SNS Build Notifier というプラグインを使おうとしていたが、これは動かなかった。

リポジトリを見ると 2016 年以降メンテナンスされていないようだし、そもそも Pipeline に対応していないのかもしれない。

Pipeline: AWS Steps を使う

Pipeline: AWS Steps というプラグインの中に snsPublish という機能を見つけて「これはいけそうだぞ」と思って試してみたところ、できた。

Jenkins 公式がメンテしているし、現時点ではこれを使うのがベストっぽい。

AWS の認証情報を設定する

今回は Jenkins サーバのローカルの Credentials を利用する。

Jenkins のビルドは jenkins ユーザが実行していたので、jenkins ユーザのホームディレクトリ以下の .aws/credentials に認証情報が保存されるようにした。

$ sudo su - jenkins
$ aws configure

今回は試していないが、Jenkins サーバが Amazon EC2 で動いている場合は SNS:Publish の権限がある IAM Role を EC2 インスタンスに割り当てれば、認証情報をサーバのローカルに保存しなくても通知を送れると思う。

その他にも、withAWS という step を挟むことで柔軟に認証情報を設定できる模様。

Pipeline 定義に通知設定を書く

以下のように書くと「ビルドが失敗した場合」に通知することができる。

Jenkinsfile
pipeline {
    stages {
        // 必ずコケるステージ
        stage('main') {
            steps {
                sh 'false'
            }
        }
    }
    post {
        failure {
            snsPublish(
                topicArn: 'arn:aws:sns:ap-northeast-1:000000000000:xxxxxxxx',
                subject: 'Build failed!',
                message: env.BUILD_URL,
            )
        }
    }
}

ビルドを実行すると、無事通知が届くと思う。

参考

続きを読む

Amazon Transcribeを調べてみた

Amazon Transcribeとは

Amazon Transcribeは一言で言うと”Speech to Text”と呼ばれる、音声をテキスト情報に変換するサービスです。
話されている言語を機械学習の技術で識別し、テキスト情報に変換します。

この技術は以下のような新しいサービスやプロダクトの提供に役立ちます。

  • 映像ファイルから音声を認識し、クローズドキャプションを生成
  • コールセンター業務などでの問い合わせ内容の分析
  • 医療分野や法律分野での活用

また、”Amazon Translate”や”Amazon Polly”と連携して、生成したテキスト情報を翻訳し、再度翻訳した言語で音声に変換することなどもできます。

何ができるのか

Amazon Transcribeには以下の3つのオペレーションがあります。

  • StartTranscriptionJob : 非同期で音声をテキストに書き起こす
  • ListTranscriptionJobs : 開始された音声認識ジョブのリストを返す。 返して欲しいJobをステータスで絞り込むことができる
  • GetTranscriptionJob : 音声認識の結果を返す。結果にはJSON形式に変換された結果へのリンクが含まれている

Speech Input

インプットするファイルはS3 bucketに保管されている必要があります。
インプットファイルの仕様は以下のみ

  • FLAC、MP3、MP4、WAV
  • 尺は2時間未満

言語、フォーマット、サンプリングレートを指定する必要があります。

  • PCM 16ビットエンコーディングのFLACやWAVなどのロスレスフォーマットを使用。
  • サンプリングレートは8000 ~ 16000Hz

Amazon TranscribeのS3とその中のファイルへのアクセスを許可する必要があります。

Output JSON

Jobが完了するとJSONが含まれた結果が生成され、テキストファイルがS3に置かれます。
ファイルのIDはユーザー固有のURIとなっており、そのURIを利用することで結果を取得できます。

Ex)

 {
      "jobName":"job ID",
      "accountId":"account ID",
      "results": {
         "transcripts":[
            {
               "transcript":" that's no answer",
               "confidence":1.0
            }
         ],
         "items":[
            {
               "start_time":"0.180",
               "end_time":"0.470",
               "alternatives":[
                  {
                     "confidence":0.84,
                     "word":"that's"
                  }
               ]
            },
            {
               "start_time":"0.470",
               "end_time":"0.710",
               "alternatives":[
                  {
                     "confidence":0.99,
                     "word":"no"
                  }
               ]
            },
            {
               "start_time":"0.710",
               "end_time":"1.080",
               "alternatives":[
                  {
                     "confidence":0.874,
                     "word":"answer"
                  }
               ]
            }
         ]
      },
      "status":"COMPLETED"
   }
 

始め方

始めるにはAWSアカウント、ID、IAMユーザーが必要です。CLIの利用も可能です。

Step.1 AWSアカウント設定

いつも通りなので割愛

Step.2 CLI設定

いつも通りなので割愛

Step.3 コンソールでの利用開始

Jobの作成

1.各種情報の入力
 - Transcription job name : AWSアカウント毎にユニークである必要がある
 - Amazon s3 input URL: 音声ファイルが格納されているS3 busket。Transcribeと同一リージョンである必要がある
 - Language:インプットファイルの言語を選択
 - Format:インプットファイルのフォーマットを選択
 - Media sampling rate(Hz):インプットファイルのサンプリングレートを8000 ~ 48000Hzの間で指定。8000~16000Hzが推奨
2.「Create」を押す

Jobの確認

Jobのリストを表示。「Availability」にサーバーに結果が保管される残り期間が表示される。結果の保管期間は90日
Jobをクリックすると、詳細(Job名、残りの保管期間、I/OのファイルのS3パス)と結果の文字列が表示される。
「Code Samples」で該当JobについてのJSONファイルを取得可能

Step.4 API

CLI

Transcribeのテストをする場合

1.InputファイルをS3 バケットに配置する(Transcribeと同じリージョンに)
2. ファイル情報を含んだJSONファイルを作成する

{
    "TranscriptionJobName": "request ID", 
    "LanguageCode": "en-US", 
    "MediaFormat": "wav", 
    "Media": {
        "MediaFileUri": "https://S3 endpoint/test-transcribe/answer2.wav"
    }
}

3.下記コマンドを実行
json
aws transcribe start-transcription-job
--endpoint-url endpoint
--region region
--cli-input-json file://test-start-command.json

・下記レスポンスが返れば成功
“`json

{
“TranscriptionJob”: {
“TranscriptionJobName”: “request ID”,
“LanguageCode”: “en-US”,
“TranscriptionJobStatus”: “IN_PROGRESS”,
“Media”: {
“MediaFileUri”: “https://S3 endpoint/test-transcribe/answer2.wav”
},
“CreationTime”: timestamp,
“MediaFormat”: “wav”
}
}
“`

Jobのリストを取得

1.Jobが完了していた場合、下記コマンドでステータスを取得する

aws transcribe get-transcription-job-results 
   --endpoint-url endpoint 
   --region endpoint 
   --request-id "DocTest-01"

・成功すればレスポンスは下記通り返ってくる

{
    "TranscriptionJob": {
        "TranscriptionJobName": "request ID",
        "LanguageCode": "en-US",
        "TranscriptionJobStatus": "COMPLETED",
        "Media": {
            "MediaFileUri": "input URI"
        },
        "CreationTime": timestamp,
        "CompletionTime": timestamp,
        "Transcript": {
            "TranscriptFileUri": "output URI"
        }
    }
}
```json

2.Output URIを使って翻訳されたテキストを取得

```json
{
      "jobName":"job ID",
      "accountId":"account ID",
      "results": {
         "transcripts":[
            {
               "transcript":" that's no answer",
               "confidence":1.0
            }
         ],
         "items":[
            {
               "start_time":"0.180",
               "end_time":"0.470",
               "alternatives":[
                  {
                     "confidence":0.84,
                     "word":"that's"
                  }
               ]
            },
            {
               "start_time":"0.470",
               "end_time":"0.710",
               "alternatives":[
                  {
                     "confidence":0.99,
                     "word":"no"
                  }
               ]
            },
            {
               "start_time":"0.710",
               "end_time":"1.080",
               "alternatives":[
                  {
                     "confidence":0.87,
                     "word":"answer"
                  }
               ]
            }
         ]
      },
      "status":"COMPLETED"
   }

SDK for Python(Boto)

・InputファイルをS3 バケットに配置する(Transcribeと同じリージョンに)。ファイル情報を含んだJSONファイルを作成する

from __future__ import print_function
import time
import boto3
transcribe = boto3.client('transcribe')
job_name = "job name"
job_uri = "https://S3 endpoint/test-transcribe/answer2.wav"
transcribe.start_transcription_job(
    TranscriptionJobName=job_name,
    Media={'MediaFileUri': job_uri},
    MediaFormat='wav',
    LanguageCode='en-US'
)
while True:
    status = transcribe.get_transcription_job(TranscriptionJobName=job_name)
    if status['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
        break
    print("Not ready yet...")
    time.sleep(5)
print(status)

・成功すればレスポンスは下記通り返ってくる

 {
      "jobName":"job ID",
      "accountId":"account ID",
      "results": {
         "transcripts":[
            {
               "transcript":" that's no answer",
               "confidence":1.0
            }
         ],
         "items":[
            {
               "start_time":"0.180",
               "end_time":"0.470",
               "alternatives":[
                  {
                     "confidence":0.84,
                     "word":"that's"
                  }
               ]
            },
            {
               "start_time":"0.470",
               "end_time":"0.710",
               "alternatives":[
                  {
                     "confidence":0.99,
                     "word":"no"
                  }
               ]
            },
            {
               "start_time":"0.710",
               "end_time":"1.080",
               "alternatives":[
                  {
                     "confidence":0.87,
                     "word":"answer"
                  }
               ]
            }
         ]
      },
      "status":"COMPLETED"
   }

認証とアクセスコントロール

・AWS Transcribeの利用にはCredentialが必要です。Credencialには認証とアクセスコントロールの設定を行う必要があります。

認証

・認証には以下のいずれかを使用します。
– AWS Account ルートユーザー(非推奨)
– IAM role
  (1) ユーザーごとの許可
  (2) AWSサービスのからのアクセス
  (3) EC2からのアクセス許可

アクセスコントロール

TranscribeへアクアセスするためのPermissionの管理

アクセスとアクションの確認

・誰が何にアクセスするかはは下記方法で定義します。
 - IAMポリシー:IAMユーザーやIAM roleに権限を付加する
 - リソースベースのポリシー:各AWSのサービスにAPIでアクセスする際に要求されるポリシー主にResource,Action,Effect,Principalなど

TranscribeのためのIAM ポリシー

・StartTranscriptionJobを実行するためのIAM roleの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "transcribe:StartTranscriptionJob"
             ],   
            "Resource": "*"
        }
    ]
}

・コンソールでTranscribeを使用するためのIAM roleの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "transcribe:*"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}

・音声を取得するためにIAM roleの例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "transcribe.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket name/*"
        }
    ]
}

・KMSを使ったS3の暗号化を行うための IAM roleの例

{
      "Sid": "Allow-Transcribe",
      "Effect": "Allow",
      "Principal": {
        "Service": "transcribe.amazonaws.com”
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    }

APIに対する権限のリファレンス

・Amazon TranscribeのAPIは下記通り
 - GetTranscriptionJob:
   API: transcribe:GetTranscriptionJob
   Resource:*
 - ListTranscriptionJobs:
   API: transcribe:ListTranscriptionJobs
   Resource:*
 - StartTranscriptionJob:
   API: transcribe:StartTranscriptionJob
   Resource:*

ベータ版のガイドラインと制限

・現在は下記リージョンのみ
 -リージョン:US East (N. Virginia)
 - Endpoint::https://transcribe.us-east-1.amazonaws.com
 - プロトコル:HTTPS
・推奨素材は以下
 - ロスレスFLAC、ロスレスWAV、PCM(16ビット)
 - サンプリングレート 8000 ~ 16000Hz
・制限は以下の通り
 - 尺は最長2h

APIリファレンス

・別紙参照(https://docs.aws.amazon.com/ja_jp/transcribe/latest/dg/API_GetTranscriptionJob.html)

続きを読む

CloudWatch カスタムメトリクスの料金計算

CloudWatchのカスタムメトリクスについて、料金計算が分かりづらかったので確認した

AWSで特にEC2を使用している場合、なにかとCloudWatchを使うことはあるのではないでしょうか?
そして、少し前に新しいCloudWatch Agentもリリースされ、今まで以上にカスタムメトリクスを使用する機会も増えました。

そこで、様々なカスタムメトリクスの使い方を考慮して、その見積りをするべく料金を確認したところ、分かりにくい点があったため、調査をしました。

まずは結論から

CloudWatch へのメトリクスの送信 (PutMetricData API) が行われていた時間の割合で計算され、1時間の間に1度以上の送信があった時間が課金対象となります。

例えば、1つのカスタムメトリクスを 1週間 (168 時間)、1時間毎に送信した後に送信を止めた場合、1か月は 720時間(30日の場合)となりますので、$0.3 * 168/720 = 0.069999 と、約 $0.07 が課金の対象となります。

調査の背景

カスタムメトリクスについての料金ですが、料金のページに下記のような記載があります。

Amazon CloudWatch のカスタムメトリクス
$0.30 メトリクスあたり/月 (最初の 10,000 メトリクス)
$0.10 メトリクスあたり/月 (次の 240,000 メトリクス)
$0.05 メトリクスあたり/月 (次の 750,000 メトリクス)
$0.02 メトリクスあたり/月 (1,000,000 メトリクス以上)

こちらの記事によると、10,000メトリクスまではメトリクスあたり月$0.3とのことです。

一見とても分かりやすい料金体系です。

本当にそうでしょうか?

私のAWS環境の12月度の請求書(既に1ヶ月丸々使用済みの環境)の 「$0.30 per metric-month for the first 10,000 metrics – Asia Pacific (Tokyo)」の項目のメトリクス数は、小数点以下が3桁まで表示されていました。
仮に、保有メトリクスの数が対象となるのであれば、このメトリクス数は整数値になるはずです。

AWSサポートに確認しました。

本件、たまたま担当された方が知識不足だったのか分かりませんが、最初の回答として、「保有メトリクス数x$0.3」であり、月の途中から使用した場合、時間数により按分されるため、保有メトリクス数が小数点以下になることがあるという説明でした。

しかしこの説明が正しい場合、メトリクスを削除できない ことから、一度でもメトリクスデータを送信したらその後ずっと$0.3が課金されることになります。

その点について、指摘し再度確認を行ったところ、冒頭の結論に記載したとおりの料金である旨、訂正した説明が送られてきました。

CloudWatch カスタムメトリクスのコストパフォーマンスのよい使い分け

これらの調査結果から、カスタムメトリクスは3600秒毎に課金が発生することが分かりましたので、
1分に1回データを送信するのも1時間に1回送信するのもカスタムメトリクスの料金としては同じです。 1
メモリ使用率などのメトリクスデータを監視する目的で使う場合は、数時間単位で確認するよりも数分単位で確認するほうが現実的だと思いますので、質の高いデータにするためには60秒間隔などで送るのがよいでしょう。

SSL証明書の監視 を行うような場合、1日1回確認することでよいため、1ドメインの料金は、30 / 720 * 0.3 ≒ $0.013 となります。
つまり、1カスタムメトリクスの月額料金分で24ドメインが監視対象として監視できます。
CloudWatchメトリクスにSSL証明書の残日数を送るとこんな感じでダッシュボードに並べられてとても管理しやすいです。
これが、とても安価に使えるのは良いと思います。
image.png

同様に、少し応用的な使い方として、1日毎のデータでよいメトリクス情報(売上データ、アクセス数、会員登録数のようなもの)は、使い方を考えて時間毎ではなく日毎にデータを送るようにするととても安く効果的に使用できます。


  1. 別途Amazon CloudWatch API リクエストを行うための料金(1000件のリクエストあたり$0.01)は発生します。 

続きを読む

Amazon LightsailでもAWS Lambdaで運用して( )できた話 – Qiita

Amazon LightsailでもAWS Lambdaで運用して(◜◡◝)できた話 – Qiita. はじめにある案件で、社内のユーザーが使用する数台のサーバを提供しているものがありましてその案件… 続きを表示 はじめにある案件で、社内のユーザーが使用する数台のサーバを提供しているものがありましてその案件のテストサーバで先ごろ特殊 … 続きを読む

hotentry: “https://dev.classmethod.jp/cloud/aws/check-aws-ce…” – mstdn.jp

IO. SSL証明書の変更が予想されるAWSサービスのエンドポイントを確認してみた | Developers.IO. はじめに AWSチームのすずきです。 AWSのサービスで利用されているSSL証明書について、アマゾンの自社認証局 Amazon Trust Services への切替案内が2017年11月にありました。 AWSの自社認証 […] Developers.IO. 続きを読む

AWSにおけるネットワーク設計の真髄。Amazon Web Services 業務システム設計・移行ガイドにおける …

この記事に対して1件のコメントがあります。コメントは「同意です!コラムもう一回読み直そうっと。|個人的に最大の見どころは、4章のネットワーク接続の設計・構築・維持管理ではないかと思っています。」です。 続きを読む

カテゴリー 未分類 | タグ

スマートスピーカー、流行のトリガーは「オフィス」? 「Alexa for Business」の可能性 (1/2)

買おうにも、アマゾンから招待が届かずいつ買えるか分からない、音声AIアシスタント「Alexa」搭載デバイスの「Amazon Echo」。実は、これがビジネスの場面に進出しつつあることをご存じだろうか。 2017月11月に開催されたアマゾンの年次イベント「AWS re:Invent 2017」で、エンタープライズ向けの音声AIアシスタント「Alexa … 続きを読む

大企業がマルチクラウドに取り組まない理由

驚きは全くないが、Amazon Web Service(以下、AWS社)のCEO(最高経営責任者)を務めるアンディ・ジャシー氏は、自身が率いる会社について非常に強気だ。同社が2017年11月に米国で開催したカンファレンス「re:Invent」の基調講演に登壇したジャシー氏は、その直後に記者会見に応じた。この会見は約45分に及び、 … 続きを読む