mamori017.log

雰囲気でクソコードを書いてバグを作っています

Amazon Athenaを使ってみる

S3に保管したログなどをSQLで解析できるというAmazon Athenaを触ってみました。 CLIだと結果が見辛いらしいのでコンソールから見てみます。

今回は事前に手持ちのIISログをS3バケットに放り込んでいます。 IISログについては元の区切りが半角スペースなのでタブ区切りに変更してあります。

ファイル保管バケットの指定

f:id:mamori017:20171003160737p:plain S3のバケットを指定します。 Athenaで対象バケットを指定する際、S3のパスは「S3://{バケット名}/{フォルダ名}」になりますが、 パスの最後に必ず「/」を記述していないとエラーになるようです。

ファイル形式の指定

f:id:mamori017:20171003160740p:plain 対象となるIISログはタブ区切りにしておいたのでTSV形式を選択しました。

カラムの設定

f:id:mamori017:20171003160745p:plain カラムのデータ型を指定します。 IISログで出力した項目別に列を設定しました。 キャプチャ上はString型になっていますが、 間違って2項目目にtimestamp型を指定してしまったため、 のちのクエリの実行結果でデータが出力されませんでした。

パーティション

f:id:mamori017:20171003160746p:plain パーティションの設定はスキップしました。 データ量が膨大になるとこの設定も必要になりそうです。

テーブル作成

f:id:mamori017:20171003160748p:plain テーブル作成クエリが表示されているのでRun Queryで実行します。 クエリの実行結果が正常であれば、 Athenaに指定したS3バケットのデータを対象としたテーブルが作成されます。 キャプチャはiisデータベースにw3svc1テーブルが作成された状態になります。

クエリの実行

f:id:mamori017:20171003160750p:plain 試しにクエリを実行してみました。 IISログのヘッダまで対象データとして判定されています。 また、time項目をtimestamp型にしてしまっているので型が合わず空欄で出力されています。

実行結果ログ

f:id:mamori017:20171003160752p:plain

S3にAthenaの実行結果用バケットが自動的に作成され、 クエリの実行結果がCSV形式で保管されるようになります。 誤ってこのバケットを削除してしまった場合、コンソール上ではエラーが出力され続けるので、 削除してしまった場合は指定された名称でバケットを作成する必要があります。 また、保存先のバケットはコンソール右上のSettingsから変更できます。

メモ
  • 定期的に実行する必要のあるクエリはSaved Queryで保存しておける。
  • 列数が合わない行も左詰めで対象行となる。(IISログで言うとヘッダ行)
  • 列に指定したデータの型が合わない結果は空欄で表現される。
  • 実行結果がS3の指定バケットに貯まり続ける。
  • DDLリクエストは課金対象とならない。
  • 列指定するとリクエストあたりの課金が抑えられる。
  • 生のファイルサイズが大きい場合はデータを圧縮することで課金が抑えられる場合がある。
  • 500KB弱のログファイルに対してクエリを実行し続けたけど、請求エクスプローラ上ではほぼ0円なので、DB立てるまでもないデータで何となくSQLで操作したいときに使っていきたい。(本来の使い方ではない気はする)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

AWSエキスパート養成読本[Amazon Web Servicesに最適化されたアーキテクチャを手に入れる! ] (Software Design plus)

AWSエキスパート養成読本[Amazon Web Servicesに最適化されたアーキテクチャを手に入れる! ] (Software Design plus)

AWS Lambdaでタイムアウトを発生させてみる

AWS Lambdaで関数実行中にタイムアウトするとどうなるのか見たことが無かったのでためしにやってみました。

Lambdaで空の関数を作成し、ランタイムにPython3.6を選択したときに作成されるコードをsleepで10秒止めてみます。

import time

def lambda_handler(event, context):
    time.sleep(10)
    return 'Hello from Lambda'

テスト実行するだけなのでLambdaの設定はデフォルトのままにしました。 タイムアウトの時間はデフォルトで3秒なので、関数がsleepで止まっている間にLambdaが処理を終了させるはずです。

テストしてみたところ実行結果にタイムアウトのエラーメッセージが出力されました。

{
  "errorMessage": "2017-09-05T02:03:28.155Z xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx Task timed out after 3.00 seconds"
}

f:id:mamori017:20170905105252p:plain

ついでなので、CloudWatchのアラームでLambdaの実行エラー時にSNSが送信されるように設定*1しました。 f:id:mamori017:20170905115800p:plain

アラーム作成後にLambda関数をテスト実行すると、アラームの状態がデータ不足からアラームに変わります。

f:id:mamori017:20170905124002p:plain

同時に、アクションに設定していたSNSトピックの送信先メールアドレスにメッセージが送信されます。

f:id:mamori017:20170905124310p:plain

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

AWSエキスパート養成読本[Amazon Web Servicesに最適化されたアーキテクチャを手に入れる! ] (Software Design plus)

AWSエキスパート養成読本[Amazon Web Servicesに最適化されたアーキテクチャを手に入れる! ] (Software Design plus)

*1:本来はLambdaのリトライを考慮したうえでCloudWatchのアラートの閾値と間隔を設定すべき。

GitリポジトリにAWS CodeCommitを使用する

AWS CodeCommitを使用できるようになるまでの手順。

IAM(Identity and Access Management)の設定

グループの作成

  • IAM(Identity and Access Management)のダッシュボードから[グループ]を選択する。 f:id:mamori017:20170704002650p:plain

  • [新しいグループの作成]を選択する。 f:id:mamori017:20170704002647p:plain

  • グループ名を入力し[次のステップ]を選択する。 f:id:mamori017:20170704002654p:plain

  • グループにアタッチするポリシーの一覧が表示されるのでCodeCommitポリシーのいずれかをアタッチし[次のステップ]を選択する。 f:id:mamori017:20170704004917p:plain CodeCommitポリシーについては以下の3つから選択する。今回はリポジトリに変更を加えるのでAWSCodeCommitPowerUserをアタッチした。

ポリシー アクション
AWSCodeCommitFullAccess CodeCommitのすべてのアクションを実行可能。
AWSCodeCommitPowerUser リポジトリの削除以外のアクションを実行可能。
AWSCodeCommitReadOnly リポジトリのプルのみ可能で内容を変更できない。
  • 確認で表示される内容で問題がなければ[グループの作成]を選択する。 f:id:mamori017:20170704010511p:plain

ユーザーの作成

  • IAM(Identity and Access Management)のダッシュボードから[ユーザー]を選択する。 f:id:mamori017:20170704011731p:plain

  • ユーザー名を入力する。AWSアクセスの種類は[プログラムによるアクセス]を選択し[次のステップ:アクセス権限]を選択する。マネジメントコンソールへのアクセスが必要であれば[AWSマネージメントコンソールへのアクセス]も選択しておく。 f:id:mamori017:20170704011728p:plain

  • ユーザーのアクセス権限を設定する。作成しておいたグループを選択し[次のステップ:確認]を選択する。 f:id:mamori017:20170704012442p:plain

  • 確認で表示される内容で問題がなければ[ユーザーの作成]を選択する。 f:id:mamori017:20170704012438p:plain

  • 作成したユーザーのアクセスキーIDとシークレットアクセスキーはGitリポジトリへのアクセスの際必要になるので控えておく。念のため[.csvのダウンロード]でアクセスキーが記載されたCSVファイルもダウンロードしておく。 f:id:mamori017:20170704012434p:plain

CodeCommitの設定

リポジトリの作成

アクセス確認

  • HTTPSリポジトリに接続する。リポジトリ作成後に接続方法が表示されるので接続タイプに[HTTPS]、オペレーティングシステムに任意のOSを選択する。 リポジトリクローンを作成するステップに表示されるGitコマンドを実行後、リポジトリURLを指定してクローンを実行する。このとき、アクセスキーIDとシークレットアクセスキーの入力を要求される*1ので、ユーザー作成後に表示されていたアクセスキーを入力するとクローンが実行される。あとは通常のGitリポジトリと同様の手順で操作できる。 f:id:mamori017:20170704014412p:plain

使ってみて

非公開リポジトリを使用したかったのでCodeCommitを利用してみたけど、 思うほど設定が面倒でなかったし、5人までで利用するぶんには無料枠内で運用できる*2ので、AWSユーザーでプライベートリポジトリを運用したい人には便利で良いサービスだと思う。

AWS CodeCommit

aws.amazon.com

docs.aws.amazon.com

Amazon Web Services実践入門 (WEB+DB PRESS plus)

Amazon Web Services実践入門 (WEB+DB PRESS plus)

AWSエキスパート養成読本[Amazon Web Servicesに最適化されたアーキテクチャを手に入れる! ] (Software Design plus)

AWSエキスパート養成読本[Amazon Web Servicesに最適化されたアーキテクチャを手に入れる! ] (Software Design plus)

*1:Windows 10の場合。LinuxMacでは未確認。

*2:有料でも十分安いと思うけど、あくまでリポジトリサービスであるということについては、GitHubなどからの移行を考える際には少し注意すべきかもしれない。