継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

AWS での Terraform とコンテナの開発・デプロイを体感する『コンテナ時代のWebサービスの作り方』を読んだ

タダです.

コンテナでアプリを動したり,その環境を Terraform で構成する経験を積んでいきたいと思い「コンテナ時代のWebサービスの作り方」を購入しました.本書を読了したので,学べることと所感をまとめていきます.

Booth booth.pm

目次

本書の章立ては次の通りです.本編として123Pの内容です.

  • 第1章 めざすゴール
  • 第2章 Terraform と ECS について
  • 第3章 Web アプリケーションの作成及び CI でのコンテナビルド
  • 第4章 AWS ECS 関連のリソース作成
  • 第5章 ドメイン取得と SSL
  • 第6章 デプロイ
  • 第7章 RDS の接続
  • Appendix A CircleCI の設定
  • Appendix B GitHub Actions でデプロイをする

1,2章で本書で作る環境のこと,Terraform と ECS の知識を拡充しつつ,3~7章で実践するパート構成となっています.本書を通じて以下の AWS 環境を作り,Sinatra アプリケーションをデプロイします.

f:id:sadayoshi_tada:20200618034417p:plain

引用元:コンテナ時代のWebサービスの作り方 図1.1 目指すシステム構成より

本書で学べること

本書を通じて学べることを以下に列挙します.なお,Terraform は以下の環境で実行しています.

» terraform version
Terraform v0.12.26
+ provider.aws v2.39.0
  • VPC,EC2,IAM,ECR,ECS,ALB,Route53,ACM を作るTerraform の記法,ドライラン,デプロイの実践(RDS と System Manager は手動構築)
  • CircleCI を使ったコンテナイメージのビルド,ECR へ格納する CI の実践
  • CircleCI での ECS on EC2 にタスクとサービスのコンテナをデプロイ
  • CircleCI の処理を GitHub Actions に置き換え

読了後の所感

全体を通して Terraform でインフラを作りつつ,Circle CI による CI/CD を回してアプリケーションをリリースしていきます.なので,次の勉強目的があればとても勉強になる内容でした.

1, AWS のコンテナサービスを使いたい

2, Terraform を使ってみたい

3, CircleCI や GitHub Action での CI/CD を使ってみたい

なお,アプリケーションの開発は最小の要件で作っているためがっつりとした開発を求めている場合は本書だけでは不十分ではありますが,本書で作ったアプリを追加開発してみると良いと感じました.

また,Terraform のコード,CircleCI のコンテナビルドや AWS CLI パートでそのまま写経すると誤記により処理がコケる部分がありました.ただ,エラーが発生した時こそ本書に載っている内容以外の知識もつけられるチャンスで自分もちょっと回り道しましたが正しい記法を学べて良かったです.

関連記事

sadayoshi-tada.hatenablog.com

まとめ

コンテナ時代のWebサービスの作り方」で学べること,所感を整理しました.ハンズオン中心の内容になっていて実際に動作する環境を段階的に作り上げるのが勉強になりました.特にコンテナへの CI/CD を机上や記事で見ていただけでしたが本書を通して実践できてよかったです.Terraform と AWS でのコンテナ活用をテーマにした勉強をされたい方にオススメの一冊です!

『コンテナ時代のWebサービスの作り方』での CircleCI ビルド時にハマったエラー対応を整理する

タダです.

Terraform とコンテナの勉強の一環で「コンテナ時代のWebサービスの作り方」を読んでいます.本書では CI/CD に CircrlCI を使います.CircleCI の定義で本書の内容をそのまま転記した際にエラーが発生する場面がありました.CircleCI を触れるのが初だったので対処した内容をこの記事でまとめていきます.なお,CircleCI の実行バージョンは2.1です.

booth.pm

CircleCI エラー一覧

bundler のバージョン指定でのエラー

本書の Web アプリケーション開発では,Ruby と bundler を使います.そのため,CircleCI の実行環境でも開発同様に Ruby と bunder が使えるように定義している箇所があります.bundler のバージョン指定してインストールを行う時に Unable to parse YAML mapping values are not allowed here というメッセージがでました.

メッセージ詳細

#!/bin/sh -eo pipefail
# Unable to parse YAML
# mapping values are not allowed here
#  in 'string', line 11, column 39:
#      ...     command: gem install bundler: 2.0.2
#                                          ^
# 
# -------
# Warning: This configuration was auto-generated to show you the message above.
# Don't rerun this job. Rerunning will have no effect.
false

エラーメッセージの内容的に YAML の記法的に問題あるかと思い,以下のように修正して対応しました.

# 変更前
command: gem install bundelr:2.0.2

# 変更後
command: |
   gem install bundler:2.0.2

ECR の認証失敗

ECS でアプリケーションを動作させるコンテナイメージを ECR に格納するのですが,その認証でエラーが発生しました.

#!/bin/sh -eo pipefail
$(aws ecr get-login --no-include-email --region ap-northeast-1)
docker build -t ${ECR_DOMAIN}:$CIRCLE_SHA1 -t ${ECR_DOMAIN}:latest .

An error occurred (UnrecognizedClientException) when calling the GetAuthorizationToken operation: The security token included in the request is invalid.

ECR 認証エラーには下記の処理を追加して回避してます.

[追加] aws configure set aws_access_key_id ${AWS_ACCESS_KEY_ID}
[追加] aws configure set aws_secret_access_key ${AWS_SECRET_ACCESS_KEY}
[追加] aws configure set default.region ${AWS_DEFAULT_REGION}
[追加] aws configure set default.output json
$(aws ecr get-login --no-include-email --region ap-northeast-1)
docker build -t ${ECR_DOMAIN}:$CIRCLE_SHA1 -t ${ECR_DOMAIN}:latest .

取り急ぎエラーを回避する対応を行なったものの,メッセージにもでていますがセキュリティ的によろしくないのでこちらの処理も書き換えて再度ビルドにトライしていきます

WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

AWC CLI v2ではget-loginget-login-passwordに置き換わっているため,CLI v2 でビルドしていこうと考えてます.

パスワードをシェルの履歴またはログに公開するリスクを減らすには、代わりに以下の例のコマンドを使用します。この例では、パスワードは docker login コマンドに直接パイプされ、そこで --password-stdin オプションによってパスワードパラメータに割り当てられます。

docs.aws.amazon.com

まとめ

僕が CircleCI を初めて触ったので手こずってしまいましたが,本書を読む進めていく中で同じ場面に遭遇した時の早期解決の参考情報となれば嬉しいです.

『AWS Data Wrangler』の v1.0 がリリース! どんなアップデートがあったかを整理する

タダです.

以前紹介した「AWS Data Wrangler」が今年の4月に v1.0 でリリースされました.リリースから2ヶ月,過去記事に書いたものからどんなアップデートがあるかをまとめます.

公式ブログ

aws.amazon.com

過去記事

sadayoshi-tada.hatenablog.com

AWS Data Wrangler 概要

AWS Data Wrangler」は AWS の Redshift,Glue,Athena,EMR といったデータ解析系のサービスと連携しやすく,ETL 処理開発に集中できるオープンソースPython モジュールです.

An open-source Python package that extends the power of Pandas library to AWS connecting DataFrames and AWS data related services (Amazon Redshift, AWS Glue, Amazon Athena, Amazon EMR, etc).

Built on top of other open-source projects like Pandas, Apache Arrow, Boto3, s3fs, SQLAlchemy, Psycopg2 and PyMySQL, it offers abstracted functions to execute usual ETL tasks like load/unload data from Data Lakes, Data Warehouses and Databases.

アップデートサマリー

  • Athena のパーティション射影をサポート
  • CSV,JSON,FWF 形式をサポート
  • S3 に格納した Parquet の読み込みと Glue カタログに Parquet メタデータの格納における Parquet スキーマを混合する
  • S3 に Parquet を書き込みと Glue カタログに Parquet メタデータの格納をサポート
  • Parquetでの uint8,uint16,uint32,uint64 のサポート
  • Glue カタログでの upsert_table_parameters,get_table_parameters,upsert_table_parameters 関数を追加
  • Athena の入れ子になった配列と構造体をサポート
  • 行数でチャンク化されたRead Parquet/Athena/Redshiftに対応
  • Docker で EMR をサポート
  • EMR でカスタム分類をサポート
  • Redshift の UNLOAD 処理で kms_key_id,max_file_size,region を引数としてサポート
  • Glue カタログ の上書き操作でテーブルのバージョニングをサポート
  • Athena の読み込み SQL 時に keep_files,ctas_temp_table_name を引数としてサポート
  • S3 のオブジェクトコピー時に replace_filenamesを引数としてサポート
  • 別のディレクトリにコピーする S3 オブジェクトをリストしたり,ターゲットのデータセットにマージする処理をサポート
  • モジュールの型アノテーションが登録された
  • S3 と EMR を moto でサポート
    • moto でのテストの改善は適宜行われている
  • Pandas DataFrame から Athena のカラムとパーティションタイプを抽出処理をサポート
  • 受信した S3 プレフィックスや S3 オブジェクトのパスのリストから Apache Parquet ファイルを読み込んだり,s3 上の Parquet ファイルをステージとして使用して Redshift のクエリ結果から Pandas DataFrame をロード,Athena 上で任意の SQL クエリの実行結果をPandas DataFrame として返す処理をサポート

まとめ

AWS Data Wrangler」が ver 1.0 リリースされたので 1.0 以降のアップデートサマリーを列挙しました.リポジトリを見ると issue も上がっていて近々でも対応されてたので今後もアップデートが楽しみです.自分自身としては「AWS Data Wrangler」を活用できるようまずはとっつきやすいチュートリアルから触れてナレッジを貯め込んでいきたいです.

監視の基本と戦略を学ぶなら『入門 監視』で勘所を押さえよう

タダです.

業務で3月から Datadog を使った監視の設定やチューニング,運用を担当することになったのですが,監視について学んだ経験がなかったため監視の勉強の一環として「入門 監視」を読みました.読了したので学んだことと所感と一緒に本書を紹介します.

入門 監視 ―モダンなモニタリングのためのデザインパターン

入門 監視 ―モダンなモニタリングのためのデザインパターン

  • 作者:Mike Julian
  • 発売日: 2019/01/17
  • メディア: 単行本(ソフトカバー)

目次

本書の章立ては次の通りです.本編として170Pの内容です.

  • 第1章 監視のアンチパターン
  • 第2章 監視のデザインパターン
  • 第3章 アラート、オンコール、インシデント管理
  • 第4章 統計入門
  • 第5章 ビジネスを監視する
  • 第6章 フロントエンド監視
  • 第7章 アプリケーション監視
  • 第8章 サーバ監視
  • 第9章 ネットワーク監視
  • 第10章 セキュリティ監視
  • 第11章 監視アセスメントの実行
  • AppendixA 手順書の例:Demo App
  • AppdendixB 可用性表
  • AppendixC 実践 監視SaaS

本書で学んだこと

本書を通じて学んだことを以下に列挙します.

  • 1,2章で監視におけるアンチパターンデザインパターンが説明されているのですが,一覧として整理されていたので勘所として勉強になりました.
  • 3章で監視の目的をシステムやシステムのコンポーネントの振る舞いや出力を観察,チェックし続ける行為と定義して,目的実現のための日々のアラート,オンコール,インシデント管理の運用の仕方を学べました.
  • 4章で監視における統計の話が出てきます.なぜ監視に統計?と最初は思いましたが,CloudWatch のメトリクスにも統計が使われているので学ぶ意義を実感できました.
    • CloudWatch ではメトリクスデータの集計方法としてドキュメントにあるように 最小値/最大値/合計値/平均値/データのカウント数/パーセンタイル値があります.
  • 5~10章で KPI を確認しつつ各コンポーネントで監視の観点をさらえたので,監視の設計をしたことない自分にとって勉強になりました.
  • 11章で5~10章で扱ったトピックのケーススタディを通してどんな観点で監視を取りまとめるかを振り返ることができました.

読了後の所感

本書を読み終えての所感についてもまとめます.

  • 本書全体を通して監視の設計に関わったことがない自分にとって監視をどう進めるか,どんな考え方がアンチパターンで,デザインパターンとしてこう考えるべきという視点を得られたと感じています.実際に監視設計に関わる時に再度立ち返りたいと思う書籍でした.
  • 監視は継続的な改善活動だというデザインパターンは得心できました.自分はシステムの運用に関わったことが少ないのですが,関わってみて日々の運用に加え,社内外の課題やトラブルを乗り越え,成長のための改善を繰り返していく活動だと感じてます.その中で事業にコミットするための監視の閾値を設けることやシステムの重要な監視項目をチェックしていることが監視の重要性を感じますし,監視の継続的な改善をすることで事業やプロダクトをよりよくしていく一端を担えるのだなと感じました.
  • AppendixC では当時Mackerelのプロダクトマネージャーを担当されていた @songmuさんが執筆されており,監視 SaaS を使うメリット,導入するときの観点,使い分け,これからの監視 SaaS 等のトピックがありました. 自分は Datadog を扱っているので,監視 SaaS の良さをまだまだ使えてないなとか,今後の SaaS での監視の取り組みを考え直すきっかけになりました.

まとめ

入門 監視」で学んだこと,所感を整理しました.監視の素地がないけど業務で当たることになった人や感覚に頼っていたり経験則があまりない人にとってオススメの書籍だと感じました.自分自身も本書を読んだからもう終わりではなく,監視を通じた継続的な改善を続けていけたらと思います.

複数アカウントや環境の切り替えに Terraform の WorkSpaces を使ってみた

タダです.

最近,Terraform を業務で使ったのですがデプロイする環境が複数の AWS アカウントでした.同じコードをアカウントを変えてデプロイすることを初めてやってみてわかったのが tfstate ファイルを最初のデプロイ以降に Terraform 側でデプロイするたび参照するため別のアカウントにデプロイが難しかったです.そこで Terraform の WorkSpaces を使ったのでこの記事で使い方を整理しておきます.

Terraform における WorkSpaces とは

WorkSpace は Python の仮想環境のように環境ごとに設定を切り替えてデプロイを実行したい場合に有効です.Terraform ではdefaultという単一のワークスペースが割り当てられており,WorkSpace を切り替えることで tfstate ファイルも切り替えられるのが特徴です.

www.terraform.io

WorkSpaces の使い方

WorkSpaces の使い方を見ていきましょう.terraform workspace --help で関連コマンドを確認できます.

» terraform workspace --help
Usage: terraform workspace

  New, list, show, select and delete Terraform workspaces.

Subcommands:
    delete    Delete a workspace
    list      List Workspaces
    new       Create a new workspace
    select    Select a workspace
    show      Show the name of the current workspace

ワークスペースの作成

新しく WorkSpaces を作りたい場合は new コマンドを使います.以下のはdevというワークスペースを作った例です.

» terraform workspace new dev
Created and switched to workspace "dev"!

You're now on a new, empty workspace. Workspaces isolate their state,
so if you run "terraform plan" Terraform will not see any existing state
for this configuration.

現在のワークスペースの表示

現在のワークスペースを表示したい場合はshowコマンドを使います.

» terraform workspace show   
dev

ワークスペースの一覧を表示する

ワークスペースを一覧の表示をするときはlistコマンドを使います.*が付いているのが現在のワークスペースになります.

» terraform workspace list
  default
* dev

ワークスペースの切り替え

ワークスペースの切り替えはselectを使って次のように行います.

» terraform workspace select default
Switched to workspace "default".
» terraform workspace show          
default

まとめ

Terraform の WorkSpaces を初めて使ったので概要とどう使うかの整理をしました.業務ではなかなか使えてないですが,引き続き学んだことはアウトプットしていきます!