yyp٩( 'ω' )و

色々触って遊んでます

zshを導入したい(願望)

まえがき

bashを使っているのですが、zshの補完機能が良いと聞いたのでzshに切り替えたいなと思っています。
ですがzshrcを作る際に面倒がってしまい、事故りました…

環境

  • OS: macOS Mojave
  • OS version: 10.14.5

zshに切り替える

デフォルトで入っているzshに切り替える

Macにはデフォルトで何種類かシェルが入っています。
下記コマンドで確認できます。

$ cat /etc/shells

入っているのはだいたい下の6つかなと思います。

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

zshもデフォルトで入っているので切り替えてみます。
下記コマンドでログインシェルを切り替えます。

$ chsh -s /bin/zsh

一度ログアウトして再度ログインすると、zshになります。
何かしら失敗してたらログインできなくなる可能性があるため、新しいタブを開いてログインしてみるのがおすすめです。

バージョンを確認してみます。

% zsh --version
zsh 5.3 (x86_64-apple-darwin18.0)

Release notesによると最新版が5.7なので若干古いですね。

zsh.sourceforge.net

zshrcを作ろうとする

面倒だったので.bashrcを.zshrcにコピーしてみたところ、プロンプトがだめな感じになりました…そりゃそうか…
そして.zshrcを空にしてsourceしても戻らず…
色だけつけるように.zshrcに追記してみます。

autoload -Uz colors
colors
PROMPT='%{$fg\[red\]%}[%n@%m]%{$reset_color%}'

source .zshrcで読み込みますが変わらず…
ちゃんとした.zshrcを作り直すしかなさそうです…

あとがき

zshに切り替えるのはとても簡単でした。
ですが億劫がってしまったためにプロンプトがおかしなことになるという事故が発生してしまいました…
解決したらまた記事に書こうと思います(戒め)
zsh本体についてはbrewで最新版を入れることもできるようなので、こちらも試してみたいな〜と思っています。

「ハッキング・ラボのつくりかた」ホストOS環境構築(Macの場合) 後編

前編はこちら
「3-11 AutoPlayの設定を確認する」から進めていきます。

環境

前編と同じです。
* OS: macOS Mojave
* OS version: 10.14.4
* VirtualBox: 5.2.28
* Kali Linux: 2019.2

ホストOSの基本設定

3-11 AutoPlayの設定を確認する

Macの場合、デバイスをアタッチしても自動実行はされないはずなので、特に何もしません。
Finder等探しましたが、該当しそうな設定箇所はありませんでした。
ただ、少し古いOSだとある可能性はなくはないですね…

3-12 共有フォルダーの"Thums.db"の作成を抑止する

"Thumbs.db"はMacでは生成されないので、スキップします。
Macの場合".DS_Store"というファイルがこれに似た機能を持っていると思われます。
ファイルやフォルダがロックされるということはなさそうなので、今は何も設定せずに先へ進みます。
必要になったら設定したいと思います。

3-13 右クリックのショートカットメニューをカスタマイズする

「送る」メニューに追加する

ファイルやフォルダを右クリックした際、Windowsの場合は「送る」という項目が出てきます。
Macの場合、右クリックした際に表示される「共有」がこれに当たるかと思います。
【手順】
1. 適当なフォルダやファイルを選択した状態で右クリック
1. 「共有」> 「その他」を選択すると、機能拡張の設定画面が開きます。
1. ここで必要なものにチェックを入れたり、チェックを外したりしてカスタマイズ。
Windowsの「送る」に比べ、選択できるものが少ない気がします。
他にいい方法を見つけたらまた設定したいと思います。

右クリックのメニューに項目を追加する 以降

Windowsの場合、レジストリキーを操作することで右クリックのメニューをカスタマイズできますが、Macの場合、「システム環境設定」からカスタマイズできます。

【手順】

  1. メニューバーのリンゴマークをクリックして「システム環境設定」を開く
  2. 「キーボード」を開き、「ショートカット」タブを開く
  3. 左のメニューから「サービス」を選択
  4. 下にスクロールしていくと「ファイルとフォルダ」という項目があるので、必要なものにチェックを入れる (不要なものがあればチェックを外す)
  5. iTerm等のターミナルソフトを入れていれば「ファイルとフォルダ」に表示されているはずなので、チェックをつける(ターミナルを直接開く方法は分からないです…)

3-14 ストレージ分析ソフトで無駄なファイルを洗い出す

Macの場合、下記の手順でストレージの状況を確認できます。

【手順】

  1. メニューバーのリンゴマークをクリックして「このMacについて」を開く
  2. 「ストレージ」タブを開き、「管理」をクリック
  3. 「おすすめ」メニューが表示されるので、お好みで設定する
  4. 自分で確認して整理したい場合は左メニューからファイルを確認できます

「おすすめ」については「ゴミ箱を自動で空にする」は設定してもいいと思います。
「不要なファイルを削除」は不要そうなファイルを判断して表示してくれます。
そこから本当に不要なものを削除できるので便利です。
他の2つについては私は使っていないです。

3-15 ランチャーを導入する

Macの場合Launchpad(親指と3本の指でつまむようにする)がデフォルトで入っているので特に何もしません。
(私の場合、Launchpadはあまり使わず、Spotlight検索(⌘+Space)を使っています)

3-16 ハッキング・ラボにおけるGit

プライベートリポジトリでコードを管理します。
私は普段からGitHubを使っているので、GitHubのプライベートリポジトリを使おうと思います。

github.com上でプライベートリポジトリを作ります。

f:id:mizukichi3:20190528225233p:plain

この時に"Private"を選択します。
リポジトリを作ったらMac側にcloneします。
私はhome配下に作業用ディレクトリを作成して作業をしているので、そこにcdしてcloneします。

$ cd ~/<directory>
$ git clone git@github.com:<username>/<repository-name>.git

ファイル等リポジトリの中身についてはおいおい追加していきます。

3-17 クラウドストレージの活用

代表的なクラウドストレージサービスとして下記の3つが紹介されています。

  1. Dropbox
  2. Google Drive
  3. OneDrive

私はすでにGoogle Driveを同期しているので、そのままGoogle Driveを使っていきたいと思います。

3-18 Prefetch機能を有効にする

コンテンツキャッシュが似たような機能を持っているかなと思ったのですが、調べていくうちに別物ということがわかりました。
Prefetch機能に当たるものは見つけられませんでした…

コンテンツキャッシュも面白そうな機能だったので、仕組みについて解説している公式ドキュメントを貼っておきます。
複数台Apple製品を運用している環境だとなかなか便利そうです。

support.apple.com

3-19 WindowsPython環境を構築する

MacはデフォルトでPython2系が入っていますが、3系も入れて混在環境を構築します。
バージョン混在環境作るの苦手なんですよね…
pyenvやvirtualenvを使う方法などありますが、今回はvirtualenvを使います。
こちらの記事を参考に進めていきます。

qiita.com

homebrewでpython3を入れます。

$ brew install python3

バージョンを確認して、3系が入っていたらOKです。

$ python3 --version
Python 3.7.2

pip3でvirtualenvをインストールします。

$ pip3 install virtualenv

環境構築時に行うのはここまでです。
以下は開発とかをするときに行います。
まずpython3を使って開発をするときに使用するディレクトリに移動します。
例えばgitのローカルリポジトリを分けていたら、そのリポジトリに移動します。
その後virtualenvを実行します。

$ virtualenv --python=/usr/local/bin/python3 --no-site-packages env

アクティベートします。

$ source env/bin/activate

こんな感じでpython2, 3の混在環境の構築は完了です。

3-20 BIOS(UEFI)画面を表示する

起動する時にショートカットキーを押すと使える機能*1が似ているかなと思ったのですが、Macの場合、そもそもBIOSに入れないみたいですね…
今後わかったらまた書きます…!

まとめ

後編も終了です。
これから第2部で色々やってみたいと思います〜
余談ですが、この辺の設定をAnsilbe等の構成管理ツールでできたら楽そうだな〜と思ったんですが、そもそもMac用のモジュールがなさそうで、難しそうですね…

第2回 SECCON Beginners CTF Write-up

まえがき

初めてCTFに参加しました。
解けたのは下記2問。
- Misc: [warmup]Welcome
- Reversing: [warmup]Seccompare
正直今回は初参加だし、全然解けなくてもいいや〜と思っていたので、ちょっとでも解けてよかったです。

CTFとは?

CTFとは、"Capture the Flag"の略で、プログラムに埋め込まれているFlagを自分の持っているIT知識を駆使してGetする競技です。
何人かでチームを組んでも、一人で参加してもいいみたいです。
問題の分野はその会によって違いますが、今回参加したSECCON Beginnersは下記5分野でした。

  1. Web
  2. Pwnable
  3. Reversing
  4. Crypto
  5. Misc

細かい説明はwikipediaさんへ…
セキュリティ周りの知識が必要なので、その辺りに興味がある人は楽しいと思います。

環境

  • OS: macOS Mojave
  • OS version: 10.14.4
  • VirtualBox: 5.2.28
  • Kali Linux: 2019.2

    【Misc】[warmup]Welcome

    「SECCON Beginners CTFのIRCチャンネルで会いましょう。」とあります。
    何のことかよく分からずしばらく別の問題に取り組んでいたのですが、ルールを確認しようと思ってスコアサーバのRulesページをみたら、IRCへのリンクがあります。
    これをクリックすると"Connect to freenode IRC"ページに飛ぶので、必要事項を入力して"Connect"をクリックします。
    すると、IRCのページの一番上にFlagが表示されています。
    f:id:mizukichi3:20190526203439p:plain これでFlagゲットです。

    【Reversing】[warmup]Seccompare

    Kali Linuxsshし、Seccompareのファイルをwgetします。

$ wget https://score.beginners.seccon.jp/files/seccompare_44d43f6a4d247e65c712d7379157d6a9.tar.gz  

圧縮されているので解凍します。

$ tar xvzf seccompare_44d43f6a4d247e65c712d7379157d6a9.tar.gz  
./._seccompare
./seccompare

"seccompare"と"._seccompare"というファイルが生成されました。
どんなファイルか確認します。

# seccompareファイル  
$ file seccompare  
seccompare: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=4a607c82ea263205071c80295afe633412cda6f7, not stripped  
# ._seccompareファイル  
$ file ._seccompare 
._seccompare: AppleDouble encoded Macintosh file

"seccompare"の方は実行するファイルみたいです。
"._seccompare"の方はMac用にエンコードされたファイルみたいです。
grepしてファイルの中にflagがないか見てみます。

# 今回のflagの形式で検索  
$ grep ctf4b ./ -r
ヒットなし  
# "flag"という文字列で検索  
$ grep flag ./ -r
Binary file ./seccompare matches

"seccompare"ファイルの中に"flag"が含まれているようです。
stringsで"seccompare"ファイルの文字列だけ出力します。

$ strings seccompare  
/lib64/ld-linux-x86-64.so.2
libc.so.6
puts
......  
usage: %s flag
correct
wrong

flagという文字列がありました。
ファイルの権限を変えて、実行してみます。

$ chmod 755 seccompare  
$ ./seccompare 
usage: ./seccompare flag

引数が必要みたいです。
適当に引数を与えて再度実行してみます。

$ ./seccompare flag
wrong

どうやら正誤判定をしているらしいというところまで分かりました。
ltraceでトレースしながら実行してみます。

$ ltrace ./seccompare flag
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "flag")                          = -3
puts("wrong"wrong
)                                                           = 6
+++ exited (status 0) +++

strcmpは文字列の比較をするC言語のコマンドみたいです。
"ctf4b{5tr1ngs_1s_n0t_en0ugh}"と引数を比較しているみたいです。
引数"ctf4b{5tr1ngs_1s_n0t_en0ugh}"を与えてみると…

$ ltrace ./seccompare ctf4b{5tr1ngs_1s_n0t_en0ugh}
strcmp("ctf4b{5tr1ngs_1s_n0t_en0ugh}", "ctf4b{5tr1ngs_1s_n0t_en0ugh}")  = 0
puts("correct"correct
)                                                         = 8
+++ exited (status 0) +++

correctでした!flagゲットです。

まとめ

他の問題にも挑戦したのですが、分かりそうで分からなくて、「俺にもっと力があれば…!」という気持ちで取り組んでいました。
サーバは6/9までオープンしているそうなので、他の方のWrite-upなどを見つつやってみたいなと思います。

GitHub PagesにGBStudioで作った自己紹介を載せる

まえがき

GitHub Pagesを作る

公式ドキュメントがあるのでこれに沿って進めます。

pages.github.com

リポジトリを作る

GitHub上で<自分のID>.github.ioリポジトリを作ります。

ローカルにクローンする

自分のローカル環境にリポジトリをクローンします。

git clone https://github.com/username/username.github.io

閲覧できるか確認する

確認用のhtmlファイルを作り、GitHubから閲覧できるか確認します。

  1. "Hello World"と表示されるindex.htmlを作ります。
cd username.github.io
echo "Hello World" > index.html
  1. GitHubにpushします。
git add --all
git commit -m "Initial commit"
git push -u origin master
  1. https://username.github.ioにアクセスして"Hello World"と表示されればOKです。
    今回作ったのはこちらです。

https://mizukichi3.github.io/

ここにGBStudioで作った自己紹介を載せてみたいと思います。

GBStudioで作ったものを載せる

GBStudioのファイルをgithub.ioリポジトリにコピー

GitHub Pagesに載せたいGBStudioのプロジェクトのファイルを全て.github.ioリポジトリにコピーします。
下記にアクセスすると…!

https://mizukichi3.github.io/web

ゲームっぽい何かが表示されました。
まだちゃんと作っていないので動きが変だったりするのですが、面白いですね!

「ハッキング・ラボのつくりかた」ホストOS環境構築(Macの場合) 前編

まえがき

CTFをやってみたくて、「ハッキング・ラボのつくりかた」を見ながら環境構築をしています。 最初は自力で環境構築をしようとしたのですが、なかなかまとまった情報が得られなかったので…

ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習

ハッキング・ラボのつくりかた 仮想環境におけるハッカー体験学習

こちらの第3章「ホストOSの基本設定」がWindowsを想定したものだったので、Macの場合にやったことを書いてみます。
あくまで私の場合なので、これがベストかどうかは分かりません。ご了承ください。

環境

ホストOSの基本設定

3-1 ファイルの拡張子を表示する

私の場合、ファイルをGUIで扱う場合はFinderを使っています。
なのでFinderでファイルの拡張子を表示するように設定します。

【手順】

  1. Finderを開く > メニューバーのリンゴマークの横の"Finder"をクリック > "環境設定"を開く
  2. Finder環境設定画面で「すべてのファイル名拡張子を表示」にチェックをつける

これでファイルの拡張子を常に表示できるようになりました。

3-2 ファイルやフォルダーの隠し属性を解除する

先頭に"."がついているファイルをFinderでも表示できるようにします。

【手順】

  1. ターミナルを起動
  2. defaults write com.apple.finder AppleShowAllFiles TRUEを実行する
  3. kilall Finderを実行してFinderを一回終了させて設定を適用する

Finderを再度起動し、Homeディレクトリで".bashrc"等がうっすら表示されていればOKです。

3-3 コントロールパネルをすぐに開けるようにする

MacWindowsのコントロールパネルにあたるものがあんまりよく分かっていないです…
「システム環境設定」あたりでしょうか…
「システム環境設定」だとしたら、リンゴマークをクリックしてすぐに開けるので、特に設定は必要なさそうです。
今後他の設定が必要になったら、個別に設定していきます。

3-4 スタートメニューの主要リンクをカスタマイズする

これも「スタートメニュー」に該当するものがMacでは何なのか分かっていないです…
でもここで設定しているのはよく使うものへのリンクなので、Dockをカスタマイズすることでできそうです。
記載があるのは「ドキュメント」「ダウンロード」「ネットワーク」「エクスプローラー」なので、該当するものが分かれば設定していきます。
* ドキュメント: 該当するものが分からないためデフォルトでDockになければFinderを追加。 * ダウンロード: デフォルトでDockに追加されているが、なければ「ダウンロード」を追加。
* ネットワーク: 「システム環境設定」の「ネットワーク」に当たると思われるが、これだけを追加することはできなさそうなので「システム環境設定」をまるごとDockに追加。
* エクスプローラー: Finderで賄えそうなのでスキップします。

3-5 メインPCのフォルダー構成を考える

Macの場合「アプリケーション」フォルダがあるので私は全部そこに入れています。
dmgをデスクトップに置いて実行→アプリをアプリケーションフォルダに入れて、dmgは削除という流れです。
パーティションに関しては、システムに影響を与える恐れがあるので一旦スキップします。

3-6 ホストOSとゲストOS間でファイルをやり取りする

ここではアプローチが5つ紹介されています。

  1. ファイルサーバーを利用する
  2. ゲストOSでFTPサービスを有効にする
  3. Windowsのファイル共有機能を利用する
  4. VirtualBoxのファイル共有機能を利用する
  5. VirtualBoxドラッグ&ドロップ機能を利用する

他に私が思いついたものとしては、AWS S3を利用する方法です。
例えばMacからVirtualBoxVMに送りたいファイルがある場合、MacからS3にアップロードして権限などを適切に設定すればVMでダウンロードできるようになります。(ざっくり)
ただ、S3は料金がかかってしまうため*1、今回はこの方法は不採用で…
「まとめ」にある1と3と4の方法を次の項以降でやっていきたいと思います。
1. ファイルサーバーを利用する→9-2
1. Windowsのファイル共有機能を利用する→3-8
1. VirtualBoxのファイル共有機能を利用する→3-7

3-7 VirtualBoxのファイル共有機能を利用する

ホストOSの設定

Macで共有フォルダーを作成し、設定を行います。

【手順】

  1. VirtualBoxと共有する用のディレクトリを作成 $ mkdir ~/shareで作成しました。
  2. VirtualBoxの共有フォルダの設定をする
    • VirtualBoxのスタート画面で該当のマシンを選択した状態で「設定」をクリック
    • 「共有フォルダー」で下記のように設定
      • フォルダーのパス: /Users/USERNAME/share (Mac側のフルパス)
      • フォルダー名: share (VirtualBox側の名前)
      • 読み込み専用: チェックしない
      • 自動マウント: チェックする
ゲストOSにGuest Additionsを適用する 以降

このあたりはMacでもWindowsでも変わらないので、割愛します。
デスクトップにCDアイコンが表示されなかったのですが、こちらのQiitaとFAQを参考に解決しました。

qiita.com

s-akademeia.sakura.ne.jp

3-8 メインPCの共有設定を見直す

Macでは/Usersディレクトリの共有はデフォルトでオフになっているみたいです。
Finderで/Usersディレクトリを見てみると、下記のフォルダがあると思います。

  • ユーザ名のフォルダ
  • ゲスト
  • 共有

右クリックで「情報を見る」で確認してみて、「共有フォルダ」のチェックがされていなければOKだと思います。
フォルダ共有でのデータのやり取りは基本的にしない方向で進めたいと思います。

3-9 Windows Updateを管理する

やることとしては、

  • アップデートの自動更新を解除する
  • 更新データがあったとしてもしばらく様子を見て、問題がなければ手動で適用する

です。
Macの場合、自動で更新が走ることはないと思うので、特に何もしません。

3-10 アンチウイルスの設定を見直す

Macの場合デフォルトではアンチウイルスソフトは入っていないと思います。
私もアンチウイルスソフトは入れていないので、ここはスキップします。

まとめ

前編はここで終了です。
また近いうちに後半を進めていきたいと思います。

*1:AWSアカウントを作って1年以内であれば無料利用枠があります。アカウント作りたての場合この方法もいいかもしれません。https://aws.amazon.com/jp/s3/pricing/

Google Analyticsを導入してみる

まえがき

そこはかとなくアクセス数が増えてきたので、Google Analyticsを導入してみようと思います。
中学生の時にもちょろっとブログをやっていたのですが、その時とは全然桁が違って、ネット世界(?)が発達したな〜と感じます。
?

Google Analytics初期設定

はてなブログのヘルプに導入方法の項があったので、こちらを見ながら進めます。

help.hatenablog.com

「新しいアカウント」設定画面

このブログの場合、設定内容はこんな感じです。

  • ラッキングの対象: ウェブサイト
  • アカウント名: mizukichi3-hatena_blog
  • ウェブサイトの名前: yyp٩( 'ω' )و
  • ウェブサイトのURL: mizukichi3.hatenablog.jp
  • 業種: オンライン コミュニティ
  • レポートのタイムゾーン: 日本
  • データ共有設定: 全てにチェック

個人でやってるブログなのでそんなに気を使わずに設定を行いました。
「アカウント名」については複数のサービスに導入する場合、プレフィクスとかつけると良さそうですね。
今回も他に解析したいものが出てきた場合に備えて{自分のアカウント名}-{サービス名}でつけてみました。

「トラッキングIDを取得」をクリックし、サービス規約に同意したらGoogle Analytics側の設定は完了です。

はてなブログ側の設定

ヘルプに記載の通り、ブログの詳細設定画面の「解析ツール」に「Google Analytics埋め込み」という項目があるので、そこにUAから始まるトラッキングIDを記載します。 これで設定は完了です。
あんまりこの辺りの知識がないので、「記事書く時にいちいちトラッキングタグ埋め込んだりするのかな…」とか思ってたんですが、とても簡単ですね…!

Google Analytics追加設定

フィルタリング設定

自分のPCからのアクセスをカウントしないように設定します。
こちらもヘルプに記載があるのでその通り進めます。
下記サイト等で自分のグローバルIPアドレスを調べます。

www.cman.jp

そのIPアドレスを「フィルタパターン」欄に記入します。

ただ、個人の場合このIPアドレスは一時的なものであることが多いと思います。
IPアドレスは枯渇するかもしれないと問題になっているため、空いているIPを融通する仕組みが使われています。
そのためここでIPアドレスを設定しても、変わってしまう可能性があります。
IPアドレス枯渇問題についてはこちらの解説がわかりやすかったです。

www.nic.ad.jp

私はあんまり気にしないので、試しにやってみた程度ですが、 気になる場合はまず自分が固定IPを持っているかどうか(ご家庭のインターネット契約時にオプション等で取得しているかもしれません)確認して、 持っていない場合は、多分お金はかかりますが固定IPを取得するのもありかもしれないですね。
でも多くの場合はそこまでしなくていいとは思います。

ちょっと使ってみる

まだ導入しただけなので全然わかりませんが、色々できそうです。
カスタムのレポートの作成とかもできるみたいですね。

まとめ

はてなブログへのGoogle Analyticsの導入は特につまづくことなくできました。
ただ、私はWebサイト運営とかマーケティング周りの知見がほぼないのでどう活用できるのかがあんまり分からないな〜って感じです。
もしかしたら導入しただけで終わりになっちゃうかもしれませんが、今後もしもっと興味が湧いたら遊んでみようかな〜と思います。

GitHubにpushされたらLambdaのテストを自動で実行したい(願望)

背景・目標

前回の続き、Lambda関数の中身を作成しているのですが、
ローカルで編集→GitHubにpush→Lambdaコンソールにコピペしてテストという流れが結構面倒です。
Lambdaコンソールでテストしながらコードの修正をしてもいいのですが、そうすると自分がどこで間違ったのか残らないのでまた同じところで詰まりそうです。

なので、タイトルの通りGitHubにpushされたらLambdaのテストを自動で実行する仕組みを作りたいと思って試行錯誤中です。
この記事の結末としては、まだ実行環境は作れていないです。
解決方法を求めてここに辿り着いた方がもしいたら申し訳ありません。

環境

以前AWS上でのCI/CDハンズオンの勉強会に行ったことを思い出し、AWS CodePipelineで出来るような気がするので、一旦CodePipelineを使う方法で進めます。

Pipelineの作成

早速Pipelineを作っていきます。
CodePipeline > パイプライン > パイプラインを作成する で作成画面に移ります。

Step1 パイプラインの設定を選択する

この画面ではパイプラインの名前と、IAMロールを設定します。
パイプライン名はわかりやすい名前をつけて、ロールについてはパイプライン用のロールがまだないので、"New Service Role"を選んで新しく作ります。
こんな感じ↓
f:id:mizukichi3:20190429111120p:plain

Step2 ソースステージを追加する

この画面ではコードのソースを設定します。
今回はGitHubにpushされたらテストが動くように設定したいので、「ソースプロバイダー」はGitHubを選択します。
リポジトリ名とブランチ名はテストしたいリポジトリとブランチを選択します。
検出オプションはGitHubウェブフックを選択します。
GitHubウェブフックの説明文の「GitHub でウェブフックを使用して、変更が発生したときにパイプラインを自動的に開始」が今回やりたいことなので。
こんな感じです↓
f:id:mizukichi3:20190429112210p:plain

Step3 ビルドステージを追加する

この画面ではビルドする環境を追加します。
「プロバイダーを構築する」ではAWS CodeBuildとJenkinsが選択できるようになっています。
今回はAWS CodeBuildを使ってみたいと思います。
リージョンはTokyoを選択し、「プロジェクトを作成する」をクリックすると、ビルド環境の作成ページに移ります。
f:id:mizukichi3:20190429112814p:plain

ビルド環境の作成

この画面では実行環境を作成していきます。
Project configurationではProject nameにわかりやすい名前をつけます。
EnvironmentではManaged imageを選択し、各パラメータを↓のように設定します。
f:id:mizukichi3:20190429113902p:plain すぐ下にある「追加設定」と"Buildspec"はデフォルトのままにしています。
"Logs"はCloudWatch logsにチェックを入れます。
ここまで設定したら、"Continue to CodePipeline"をクリックしてからCodePipelineの作成ページに戻ります。
↓のように正常に作成されたメッセージが表示されていればOKです。
f:id:mizukichi3:20190429114846p:plain

Step4 デプロイステージを追加する

この画面ではデプロイ先を設定します。
今回はCodeDeployを使ってLambdaにデプロイしたいと思います。

CodeDeployでアプリケーションを作成する

まずCodeDeployでデプロイするアプリケーションの設定をします。
一旦CodeDeployの画面を別タブで開き、「アプリケーションの作成」をクリックして作成画面に移ります。
アプリケーション名にわかりやすい名前をつけて、「コンピューティングプラットフォーム」でAWS Lambdaを選択します。
f:id:mizukichi3:20190429115535p:plain 次にデプロイグループを作成します。
デプロイグループ名はわかりやすい名前をつけます。
サービスロールは"AWSCodeDeployForLambda"のポリシーを付与したロールをIAMコンソールで作成して選択します。
デプロイ設定は一旦デフォルトのままにします。
下の方にある「詳細」もデフォルトのままにします。
これでCodeDeploy側の設定は完了したので、デプロイステージの追加画面に戻ります。
アプリケーション名とデプロイグループで先ほど作ったものを選択します。

Step5 レビュー

設定内容を確認して、「パイプラインを作成する」で完了です。
作成後すぐにパイプラインが動きますが、初回だからということだと思います。
今後はpushしたら動く感じになるはずです…!

CodePipelineを動かしてみる

とりあえずHelloWorldでpushしてみます。
コードはLambdaを作成した時に最初に書いてあるものを使いました。

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

pushするとパイプラインが動き始めましたが、Buildの段階で失敗してしまいました。
詳細をみてみると、 YAML_FILE_ERROR: YAML file does not existというエラーが出ています。
buildspec.ymlを作ってGitHubに置かないといけないっぽいですね。

buildspec.ymlを作成

とりあえずこんな感じで作ってみました。
参考: docs.aws.amazon.com

version: 0.2

phases:
  install:
    commands:
      - pip install boto3
artifacts: 
  files:
    - '**/*'

今度はビルドは成功しましたが、デプロイに失敗しました。
詳細をみてみると、BundleType must be either YAML or JSONというメッセージが出ています。
調べてみると、appspec.ymlというファイルが必要みたいです。

appspec.ymlを作成

こちらを参考にappspec.ymlを作成してみました。

docs.aws.amazon.com

作成したappspec.ymlはこちら。

version: 0.0
resources:
  - name-of-function-to-deploy:
    type: "AWS::Lambda::Function"
    properties:
      name: HelloWorld
      alias: HelloWorld
      currentversion: "1"
      targetversion: "1"
hooks:
  - BeforeAllowTraffic: "LambdaFunctionToValidateBeforeTrafficShift"
  - AfterAllowTraffic: "LambdaFunctionToValidateAfterTrafficShift"

こちらのファイルをpushしてみましたが、また同様のBundleType must be either YAML or JSONというメッセージが出てしまいました。
どうにも原因がわからないので、CodeDeployから手動でデプロイしてみます。
するともう少し詳し目のエラーメッセージが出ました。

The deployment failed because the AppSpec file that specifies the AWS Lambda deployment configuration is missing or has an invalid configuration. The input AppSpec file is a not well-formed yaml. The template cannot be parsed.

ymlファイルがどこか間違っているみたいです。
ここからはymlファイルを直しても全然進むことができなかったため、一旦保留にしたいと思います。
本当にやりたいのはLambdaを動かすことで、こちらの環境構築をやっているとLambdaの方が進まなくなっちゃいそうなので…

こちらの記事は自分用の手順書として残しておくことにします…
前回の記事のLambdaが作り終わったらこちらを再開してみようかなと思います。