AWSの話題を中心に、日々の業務やプログラミングの徒然を綴るエンジニアブログです。

HANDS LAB

HANDS LAB ENGINEERS BLOG

ハンズラボエンジニアブログ

作者別: 清水幸佑

バッチ処理をECSに移行した話(GitHubActionsもあるよ)その2

Pocket

こんにちは、ハンズラボの清水です。東急ハンズのECサイトを担当しています。今回は前回の続き、GitHubのリポジトリにpushしたらECRへpushを行うGitHubActionsを紹介します。

前回の記事はこちら
バッチ処理をECSに移行した話(GitHubActionsもあるよ)その1

前回の記事の追記(Fargateになりました)

前回の記事のクラスターを作成にEC2を利用しましたが、その後、NATGatewayにElasticIPをつけることでFargateで出て行くIPアドレスを固定することができたのでFargateになりました。

IPアドレスを固定する理由は外部ECモール(yahoo, 楽天など)のAPIを利用する際、IPアドレスの制限があるのでIPを固定しています。

GitHubActionsを作成する

ここから本題!GitHubのリポジトリにpushしたらECRへpushを行うGitHubActionsを作成していきます。
参考にしたもの(https://github.com/actions/example-aws)

主な流れはこんな感じ

  1. GitHubのリポジトリにコードをpushする
  2. docker buildを行う
  3. dockerにタグをつける
  4. AWSのアカウントにログイン
  5. ECRにpushする

GitHubのリポジトリから作成します。
作成を行うとプロジェクト内に.github/main.workflowというファイルが作成されます。GitHubActionsのGUIで作成も出来ますし、main.workflowを編集して作成もできます。

個人的にはGUIで大まかな流れを作成して、main.workflowを編集するやり方が個人的には作成しやすいです。

main.workflowの見方

がっつりmain.workflowを書くことはありませんが、GUIである程度作成してしまえばいいので編集するのはenvargsくらいです。
usesは使用するdocker imageです。(独自の環境での実行もできます)

作成したもの

各説明(処理の流れ)

1. ブランチをフィルタリングする

pushされたブランチがmasterの時のみ下に処理を流します。
GitHubActionsでは条件分岐ができないのでFillterを使用しています。

2. イメージのbuild, ECRへのログイン, slack通知

ここではイメージの build、ECRへのログイン、slackへの通知を並列で実行します。

やっていることはdocker build -t test-python . –build-arg STAGE=$STAGEのコマンドを実行しています。

ECRへのログインも先ほどのdocker build同様にawsのコマンドを実行しています。secretsAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYをセットすることでECRにログインできます。

secretsの登録は割と簡単です。

slack通知はsecretsにwebhookのURLをセットしてargsにチャンネルに通知するメッセージを設定します。

3. dockerイメージにタグをつける

行なっていることは上記のコマンドと同じですコマンドではバージョンをlatestとしていますが、GitHubActionsではバージョンにブランチ名が適応されます。

4. ECRへpushする

dockerイメージのタグ付け、ECRへのログインが終わり次第ECRへpushを行います。

行なっているコマンドは同じですがバージョンのlatestは今回masterになっています。ECSのタスク定義でイメージのURLをlatestにしている場合はmasterに変更しましょう。

5. 完了通知をslackに飛ばす

2. の工程で説明を行なっているので省略します。

masterへpushを行うと、リポジトリのActionsタブから実行ログを見ることができます。

GitHubActionsを使って見ての感想

良い点

  • 作成が簡単
  • 処理の流れが見やすい
  • Dockerとの相性が良い

悪い点

  • ブランチごとにActionsを定義できない
  • 条件分岐が使用できない(失敗したら~~するとか)
  • AWSの複数アカウントに対応できない(Keyを1セットしか登録できない)

現在GitHubActionsはPublicBetaなので今後の機能追加に期待しています。

Pocket

バッチ処理をECSに移行した話(GitHubActionsもあるよ)その1

Pocket

はじめに

こんにちは、ハンズラボの清水です。東急ハンズのECサイトを担当しています。今回はEC2上で動いている外部ECモール連携バッチをAmazon ECS ScheduleTaskに移行しました。そして、GitHubにpushした際にECRにイメージをpushできるようなGitHubActionsも作成しました。今回はECSのScheduleTask機能を使用してバッチ処理を作成していきます。

※外部ECモールとはyahooや楽天といったショッピングサイトのことです。

既存バッチ処理の内容

既存のバッチ処理ではEC2インスタンス上にバッチサーバーを用意、cronにスケジュールを登録してバッチを叩いています。
処理の内容としては、Auroraに追加された注文変更情報を取得して、注文情報商品の数量変更、注文キャンセル等を行っています。
今回は注文情報変更処理をECSに移行しました。

ECSへ移行

移行の理由

移行の理由としては以下の点が挙げられます。

  • AWSのサポートを受けられる
  • 各バージョンアップに対応できる
  • EC2を冗長化したい
  • dockerを使用するのでローカルでの開発が楽になる

注文情報変更の処理のみをdockerのイメージとして切り出し,ECR(Amazon Elastic Container Registry)にpushします。 Amazon ECS ScheduleTaskでスケジュールを指定して、処理を開始します。

ECRの作成

ECR(Amazon Elastic Container Registry)の作成を行い、ローカル開発環境にあるdockerイメージをECRへpushします。はじめにECRでリポジトリを作成しましょう。作成したらリポジトリ名をコピーしておくと後々楽です。

dockerイメージの作成&ECRへpush

ECR(Amazon Elastic Container Registry)へpushする用のdockerイメージを作成して,pushしましょう。以下のbashスクリプトで行いました。

のちのAmazon ECS ScheduleTaskで説明しますが作成したDockerfileENTRYPOINT"/bin/ash"のようにしておくとコンテナの挙動を変更できます。(今回はpython:3.7.3-alpine3.8を使用したのでashです)

クラスターを作成

ECSからクラスターを作成します。クラスターのテンプレートですが、今回は出て行くIPアドレスを固定したいためFargateを使用せずにEC2を利用しました。 クラスターの設定は各自お任せします。

後に気づいたのですが、NATGatewayにElasticIPをつけることでFargateでもIPアドレスを固定できます。

タスクを定義

ECSからタスクを定義します。起動タイプはEC2を選択。

コンテナ定義でコンテナの追加します。イメージには先ほど作成したECRのURLのパスを貼り付ければOK。

環境のコマンドに今回はテストとしてecho testを実行します。

ログ設定のAuto-configure CloudWatch Logsにチェックを入れておくとCloudWatch Logsにログを吐いてくれるのでチェックを入れました。

タスクを実行してみる

作成したクラスター→タスク→新しいタスクの実行からタスクを実行する。 先ほど作成したクラスターとタスク定義を選択をして実行しましょう。 実行ログはCLoudWatchLogsに吐かれるので確認しましょう。

成功です。

スケジュールを設定する

作成したクラスター→タスクのスケジューリングから作成します。
スケジュールタイプはCron式でも設定できます。タスク定義を先ほど定義したタスクを設定して作成完了です。

CloudWatchLogsでログを確認したところスケジュール通りに動いてくれています。

ハマったところ

タスクが実行されない(CloudWatchメトリクスにFailedInvocationsが出ている)問題がありました。調査の結果以下の二つが問題の原因でした。

  • インターネットに接続出来ていない(ElasticIPを付与したら解決)
  • コンテナインスタンス IAM ロールに権限が付与されていない(IAMロールからECSFullAccessつけることで解決)

終わりに

今回はECSのECS ScheduleTaskを利用してバッチ処理を移行しました。次回はGitHubActionsを利用したECRへのpushを紹介できればと思います。

Pocket

wikiツールを移行した話

Pocket

不定期更新かと思ったらほぼ三ヶ月周期で記事を書いていた清水です。

みなさんは社内でどんなwikiツールを使っていますか?
今回、ハンズラボ全体とは行きませんが、現在所属しているチームのwikiツールを改めようということで、約一ヶ月かけて3つのwikiツールを使用してどのwikiツールが適しているか選定しました。

wikiツールの紹介

今回使用したwikiツールは以下の通り

どれもwikiツールとして最低限の機能は備えているので特徴的な点を紹介していきます。

DocBase

  • リアルタイムプレビュー
  • 同時編集機能
  • Markdown入力補助

同時編集機能がとてもいいと思いました。Googleドキュメントのように誰が編集しているのかも分かりますし、リアルタイムプレビューのおかげで編集が行いやすいと感じました。そして、マークダウンでテーブルを書くのは割と面倒なのですがショートカットが用意されていて便利でした。

Qiita:Team

  • リアルタイムプレビュー
  • 編集リクエスト
  • 豊富なテンプレート

編集リクエストがとてもいいと思いました。 GitHubのように変更差分の確認や通知があったりと便利。 Qiitaに投稿している人であれば、アカウントの連携やQiitaQiita:Teamの行き来ができるので普段からQiitaをみる人にとっては使いやすいと感じました。

Scrapbox

  • 独自の記法
  • 同時編集機能
  • スマホでも書きやすい

DocBaseQiita:Teamのマークダウン記法とは違い、独自の記法を使用しています。 慣れてくるとマークダウンより早くことができるので非エンジニアの人でもサクサクかけるのではと感じられました。
Scrapboxの記法

結果発表

一ヶ月3つのwikiツールを使用して、結果としてチームとして使うことになったのはQiita:Teamです!
選定要因としては毎朝Qiitaを見る人が多かったという点です。これは個人的な意見ですが PCを開く → ブラウザを開く → Qiita → QiitaTeamこの一連の流れがとてもいいと思っています。

僕自身も無意識にQiitaを開いているので、自然にwikiを見に行けます。
毎日見るサイトから流れで自社のwikiを見ることができるので、新しいwikiや更新されたwikiにも頻繁に目を通しやすくなるのでwikiのレビューが捗ります。

Qiita:TeamでもQiitaのAPIを使用することができるので、slackのスラッシュコマンドでwikiを検索するツールを作ってみたいと思っています。

こんな感じのを作っていきたいです(wikiが見つからなかったときのレスポンス)。


なる早でslackのスラッシュコマンドを作ってみる

これを機にハンズラボもQiitaのOrganizationsに参加しているので投稿できる記事が増えると嬉しいです。
ハンズラボのOrganizations

Pocket

混ぜるな危険!? ユニケージとxonshの融合

Pocket

はじめに

こんにちは清水です!
この記事は、Xonsh Advent Calendar 2018 – Qiitaの6日目の記事です。

ユニケージとは

個人的な解釈ですがawkで頑張らずともユニケージコマンドを使用することで比較的楽にshell芸ができます。

一例ですがこんなことができます。

このファイルの2列目の値だけ欲しい。
awkで書くとこんな感じ。

ユニケージコマンド(self)を使用するとこのようにかけます。

僕はまだユニケージ初心者なのでより詳細な情報は以下の記事を参照してください。

xonshとは

Pythonで作られたクロスプラットフォームのUnixライクなシェル言語とコマンドプロンプトです。
Pythonの対話モードとUnixコマンドが合体したみたいなものです。

個人的にshellなるべく書きたくないマンなのでPythonで書けるのは衝撃でした。

pipで入ります。使用するときはターミナルでxonshと打つと起動します。

ライブラリも使用できます

詳しくはこのアドベントカレンダーのリーダーである@vaaaaanquishの記事をご覧ください。

今回紹介すること

今回は謎技術ユニケージとxonshを組み合わせた「ひょっとしたら、これ使えるかもしれない(笑)」的なものを紹介していきます。

selfとのコラボ

先ほど使用したselfコマンド。このコマンドはawk '{print $1 $3}'のように出力したいフィールドを指定することでそのフィールドを表示します。

xonshと組み合わせる

いつ使うかよくわかりませんが、まぁ便利そう(pandas使ってもいいんですけどね)

殺人的なワンライナーも書けます。

mdateとのコラボ

こののコマンドは開始日から終了日を全てスペース区切りで表示します。
mdate -e <開始日(yyyymmdd)> <終了日(yyyymmdd)>

xonshと組み合わせる

split関数がいい感じにスペース区切り文字列を分割してくれるので20181201から20181231までのリストを生成できます。これは割と使えるのでなないかと個人的に思っています

dayslashとのコラボ

説明するよりも見た方が早いです。

いい感じに/を入れてくれます。 1はフィールド指定です。

xonshと組み合わせる

date_listから受け取ったdateをdayslashで/を入れてslash_dateに格納します。\nが入ってしまうのは勘弁。

Jupyter Notebookで使用する

いつものようにJupyter Notebookを使用して新規ファイルを作成しようとしたら,Xonshが入っていることに気付く。
どうやらpip install xonshするだけでJupyterのカーネルに追加されるそうです。

ユニケージコマンドは果たして使用できるのか?

実行できた!どうやらローカルのコマンドも使用できるようです。

ちなみにGoで作成したコマンドも使用できました。

Pocket

Go言語 初心者向けハンズオンに行って来た

Pocket

はじめに

こんにちはハンズラボの清水です。
株式会社メディアドゥさんのGo言語 初心者向けハンズオンに参加させていただきました。

清水の最近の経験言語

  • Python: 大学からの付き合い(軽く機械学習の真似事ができるくらい)
  • javascript : Node, jQuery 研修でやりました
  • PHP : 業務で使ってます

Go言語の知識

  • 関数を使ったら戻り値とerror値が返ってくる
  • if err != nil をとりあえず沢山書くらしい
  • メルカリさんが使っている

会場に到着


サイバー感すごい!

手塚治虫作品が沢山!

勉強会開始

資料


事前にスライドが公開されているので手元のPCでも見ながら確認できるのでとてもよかったです。

練習問題がある

私も勉強会には月2~3回ほど参加していますが練習問題がある勉強会は初めてでした。
ハンズオン形式の勉強会は多くありますが、練習問題があることによって、自分で考えて実装するのでより意欲が湧いて来ます。(スライドの後半に課題があります)
資料:Go言語でシンプルなWebAPIサーバーを実装する
練習問題は全部6問あり、資料を参考に解いていきました。時間制限もあったので全部解くぐらいの意気込みで挑戦したら、思いの他1問目で手こずってしまい3問目までしか解くことができました。(相当ググりまくっていました)
そして、想像通り if err != nil を結構描きました。

一部を紹介

これは1問目のコードの一部ですが、strconv.Atoiを使用して文字列を数値に変換するのですが数値だけでなくerror値も帰ってくるのでGoではこのようにエラーハンドリングを行うようです。

勉強会を終えてGo言語に私が思った感想は

  • ところどころC言語的なものを感じる(変数宣言、ポインタとか)
  • go get便利
  • 色々と覚えることが多いが学ぶのが楽しそう
  • 並列処理やってみたい(goroutine, channel)

最後に

今回の株式会社メディアドゥさんの勉強会はとても楽しく、練習問題で自分がどこまで実装できるのかといった挑戦もあるので次の学習のきっかけになる勉強会でした。
機会があるのであれば次回も参加したいと思っています。

ハンズラボはエンジニアを募集中です。 https://www.wantedly.com/companies/hands-lab

Pocket