Terraform入門

はじめに

  • 僕は、Terraformを実務で触ったことがありませんでした。また個人的な学習でも何から触っていいかもわからんしまぁひとまずなんかインフラをコードでどうこうできるんしょくらいの認識でいました。

  • 本記事では、書籍に沿って行った学習過程で書籍に記載がない点と「ん?」ってなった点を取り上げたいと思います。

    • 書籍詳細に関しては、省きます。

教材

  • 同僚の方にお勧めいただいたこちらを使用して学習を始めることにしました。

amzn.to

学習方法

  • 基本的には、書籍の内容に沿ってハンズオンしながら理解を進めていけたらなと思ってます。

書籍の中身

  • 前提としてAWSを題材にした書籍になってます。また目次をみていただければ記載あるのでご覧ください。
  • 個人的にいいなって思っているのはサンプルコードが200以上ある点です。

Terraformとは?

  • 下記記事を参考にしてください。

10分で理解するTerraform - Qiita

AWSでTerraformに入門 | Developers.IO

今回ハンズオンで行ったこと

  • 上記に記載しているQiitaの記事と似通っていますが以下を学習しました。

  • AWS

    • AMI
    • IAM
    • EC2
  • Terraform

    • plan
    • apply
    • destroy

学習の流れ

  • 学習の流れは、EC2インスタンをTrraformで作成し、更新を行い、またmust be replacedと表示されるような変更を行い最後にリソースの削除を行いました。
    • コード、書籍の手順等は、割愛します。

学習の際に困った点

1. 書籍の第1章セットアップでは、いきなりIAMの作成から始まってますが指示通り作成します。

日を跨いで学習を行う場合やターミナルを別タブで行う場合があまり想定されていません、環境変数の設定で使用するシークレットアクセスキーに関しては、IAM作成時にコピーして控えておいた方がいいです。 もし忘れてしまったりメモし忘れてしまった場合、下記画像を参考に新たにシークレットアクセスキーの作成を行えば再度取得ができます。(僕はこの方法しかたどり着けなかったので他に方法があるなら知りたいです!!)

f:id:hironekosun:20200718192501p:plain

  • ターミナル上で入手したアクセスIDとシークレットアクセスキーを環境変数に設定します。これで書籍の指示通りにAWSアカウントIDが出力されます。
2. 書籍に記載ないけど.....
「第2章」でAMIの使用が前提になっており肝心のAMIの作成に関してが記載ありません。作成手順がないのでAWS初心者にとっては、なんのことよ!!!!ってなると思います。

*ここでAMIの詳細については、割愛させていただきます。

AWSが公開しているAMIを使用します

参考にした記事:CloudFormationで最新のAmazon Linux 2のAMI IDを取得してEC2を構築する | Developers.IO

  • 参考記事で紹介されているコマンドを使用したいと思います。

    • 今回は、amazon linuxのAMIの使用を想定しています。
  • コマンドを実行するとAMI IDが出力されますのでそれを使用しましょう。

$ aws ssm get-parameter \
        --name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2 \
        --query "Parameter.Value" \
        --region ap-northeast-1 
 "ami-06ad9296e6cf1e3cf"

これで書籍のハンズオンが進められるようになります。

学習をしてみて

  • 大きな障害もなく終えれてよかったです。入門内容から触ってみて実際に実務で触った内容の理解が進んだり、自分の手でインスタンスが作成されたぜやっほいって気持ちとかを感じレたりしたのでハンズオン形式での学習は大事だなって改めて思いました。

  • 次は、第3章からですが内容を読むと第5章までは一気に進められる内容になっているので頑張ろうと思います。またこれを期にAWSに関しての知識も実践で使えるものに変換できていけたらならと個人的には思っています。

最後に

  • 今回、在籍する会社のCTOにAMIを作成しなくても学習できるとアドバイスをいただきました。当初公開した際の記事では、下記に示すように自分でAMIを作成する手順で書籍の内容を進めてましたがAWSが提供しているAMIを使用する手順へ変更しました。ご興味ある方は、下記手順でオリジナルのAMIを作成することが可能なので、tryしてみてください。

  • また今回記載している内容は、2020/07/21現在で動作確認が取れた内容となっています。

修正前の内容は以下です。

自身で作成する
  • AMIを作成する

    • 手順はすごく簡単です。適当に無料枠対象のEC2インスタンスを作成します。
    • 作成されたEC2インスタンスを元にAMIの作成を行います。
      f:id:hironekosun:20200718194120p:plain
      • 上記画像のように作成ができれば作成したインスタンスを選択して右クリックから イメージ > イメージの作成 を行います。名称がわかりやすいように適宜名称をつけておきましょう。
  • AMIのIDを取得

    • こちらは左にあるメニューからAMIを選択し上記で作成したAMIのIDをコピーします。
早速手順に従いterraform applyを行いインスタンスを作成するぞーって気持ちをいきなり砕きます
Error: Error launching source instance: InvalidAMIID.NotFound: The image id '[ami-id]' does not exist
    status code: 400, request id: request_id(英数字が並んでいる)
  • 何が原因か?
    • 環境変数AWS_DEFAULT_REGION東京リージョンに設定していたからです。
    • おまえ東京なんだからあってんだろって初心者の方なら思うかもしれませんが、AWSってそもそも何も考えず何も気にせずに上記のEC2インスタンスの作成を行うと、リージョンが東京ではありません。
    • なので環境変数の変更が必要です。適宜自分の環境にあった環境変数に変更しましょう。

オハイオに設定するなら下記をターミナル上で実行すればOKです。

$ export AWS_DEFAULT_REGION=us-east-2

ターミナルのshellの読み込みが遅い

タイトルの通り

  • 個人的にあまり気にしてなかったけどやたら遅かった

やったこと

  • preztoを排除
  • anyenv をrehashを都度行わないように変更

結果

  • めっちゃ早くなった(それでも遅いとは思う)

記述

  • 僕は、zshを使用しているので以下を.zshrc に追加しました。
eval "$(anyenv init - --no-rehash)"

蛇足

  • 今回preztoを排除し新たにstarshipというのを採用しました。

starship.rs

まとめ

  • こちらからは以上です

AtCoder参加してみた

使用する言語

せっかくなら触ったことがない言語で学びながらやろうって気持ちでこの二つの言語を使用してます

なんで二つの言語かは、気分です

標準入力

  • AtCoderをやるまでは、標準入力なんてきにしたことなかったのであたふたしました

  • AtCoderにも載っている例やQiitaを参考にしました

  • Go

var n int
fmt.Scanf("%d", &n)

※fmt.Scan(&n)でもいけます

i = input()
  • 複数の入力値を受け取る場合

  • Go

var n1 n2 int
fmt.Scanf("%d %d", &n1, &n2)
a, b, c = map(int, input(.split()))

標準入力が理解できればあとは処理書くぞ

  • Aは単純な問題の場合が多くなっております。

    • 例えば、if else文で解ける問題も多いです。
    • 実際に問題を解いて提出をしたら、予めAtCoder側が用意したテストが自動で行われます。すべて通過すれば「AC」となり得点が獲得できます
  • Bの問題なのですがここから少しずつレベルが上がっていきます。

  • Cの問題からは数学的知識が必要になってくるので僕は、算数も危ういので中学数学から勉強しようと思ってます。

過去問

  • 実際に参加する前に過去問を解くことも可能です。個人的にはA,Bはマストで回答できるようになりたいので過去問をしつつ、開催時は参加するようにしてます

  • 実際にAC(正解)になったコードを晒したいと思います。

  • 第166回目のA, Bをpythonで解いたコードになります

    • 問題文は、下記URLを参照してください。

atcoder.jp

  • この問題は非常に簡単でした。
i = input()
if i == "ABC":
    print("ARC")
else:
    print("ABC")
  • B
n, k = map(int, input().split())
d = [0]*n  # 0 * n個分の要素数の配列を作成 ex. [0, 0, 0, 0, .....]
for _ in range(k):
    input()
    l = (list(map(int, input().split())))
    for i in l:
        d[i - 1] = 1  # 0を1に変更する

print(d.count(0))  # 0の要素の個数をカウント
  • せっかくなのでGoで解いたコードも晒します(別の問題になります)

    • 第160回目のA,B
  • A

package main

func main() {
    var a string
    fmt.Scanf("%s", &a)
    l := strings.Split(a, "")
    if l[2] == l[3] && l[4] == l[5] {
        fmt.Printf("Yes")
    } else {
        fmt.Printf("No")
    }
}
  • B
package main

func main() {
    var a int
    fmt.Scanf("%d", &a)
    b := a % 500
    r := a/500*1000 + b/5*5

    fmt.Println(r)
 
}

他者の解答

  • AtCoderのいい点としては、自分が正解不正解かかわらず、他者の正解したコードを閲覧できアルゴリズムのバリエーションを学ぶことができます
  • 解けなかった場合はとても参考になりますし、正解だった場合でも僕は、みるようにして次のコンテストや過去問を解くのに生かせるようにしてます

参加した感想

  • 各問題を解けたときは、嬉しく楽しいです
  • 普段の業務では、JS、PHPを使用していますが言語は違えどアルゴリズムという観点で考えると業務に活かせる場面が出てくるので引続き時間が許す限りAtCoderのコンテストには参加していこうと思っています

まとめ

  • 競プロ系のサービスは、考える力の向上や他者の考えもみれたりできるのでおもしろいです
  • せっかくなので今後も続けていきレーティングを少しずつ上げていけたらなとおもいます

AtCoder初参加

結果

  • 恥ずかしながら0点でした

理由

  • 自分のPCであまり確認せずひとまず実行を繰り返し、phpで書いたんですがローカルで動くプログラムがかけていても「WA」を連発してしまった。なぜWAになったのか不明。
    • 同じ問題を同じようにGoとpythonで書いたら問題なかった
  • Cの問題をみたけどまったく日本語が理解できなかった

今後

  • 個人的には、できるだけ参加してABは、回答できるようになる。
  • Cに挑戦できるようにする。

まとめ

  • エンジニアなら解けるだろうって思うかもしれないけど数学的要素がはいるとからっきし だめなんですよね自分。ただの言い訳になるけども今後は、数学的な知識もしっかりと身につけていかなければなーって思いました。

リモート作業で使っているアイテム

椅子

  • 以前は、ニトリのこちらの椅子を使用してました

www.nitori-net.jp

  • 今回会社の支援金を使い購入したもの

www.ergohuman.jp

感想

  • まぁー別格です。
  • あらためて椅子の大事さを知った。基本PC作業の人は椅子に投資は惜しんだら体に直接的なダメージが積み重なっていくとおもう

デスク

  • イケアのデスクです
  • こちらは、天板と足を別で買って組み立てたものになります。
  • 二人用のデスクなのでわりと広めです

キーボード

  • 自宅には3個ほどあるんですがずっと欲しかったこちらを使ってました

www.archisite.co.jp

  • ただこれの青軸を買って(軸の知識がなかったため欲しさのあまりあまりみずに買ってしまった)しまったため以下の問題がありました
  • 問題点としては、青軸なのでリモートでのペアプロMTG中にキーボードのうるささが目立ってしまう。また十字キーが存在しないのでまぁまぁ難易度がたかった(自分にとって)
    • Fn + I or K or L or J で移動なんだけど指の置き方が疲れた
  • 悩みに悩んでこちらに変更した

www.archisite.co.jp

パームレスト

  • これはFlicoのスポンジみたいなやつの厚めの方を書いました。

感想

  • 個人的にmd600からの変更で打ちづらさが最初はあったけどかなりいい感じ
    • 一番よかったのは、静音赤軸(HHKBの最新作と同じ?)にして音が全くなくなったことです
  • またPC作業でよく起こる問題としての巻き肩や姿勢の悪さへの改善も見込めてだいぶ快適に過ごしてます

モニター

  • こちらは、あまりこだわりがないので型とインチが異なるLGのモニターを二枚使用してます。
  • モニターアームを使用しているので縦置きと横置き(スタンダード)で使用してます。

感想

  • 個人的には、曲面のデカいモニターにすればよかったなと気持ちもあるが今の環境に満足している

ガジェットの紹介は以上です

  • いかがでしたでしょうか?
  • って締める文章は嫌いです

総括

  • このご時世なのでリモートで作業されている人も多いと思います。より快適な作業環境を模索してみてはどうでしょうか?お金も時間もかかるかもしれませんが快適なリモート生活を手に入れて少しでもストレスを減らしましょう。

composerでのちょっとした楽

Composerがある環境

  • 例えばLaravelを使用している場合
    • 環境構築ってまぁまぁめんどい多くが下のコマンドのような流れのはず
git clone https:/xxxxxxx
composer install
cp env-example .env
php artisan key:generate
php artisan migrate
  • これすらめんどいわけで。。。
    • docker 環境だったとしたらdocker-compose up -d --buildした時点でshellが走るようにしてればいいんだけども
    • 環境がそれぞれのPCに依存している場合とかだとまぁーめんどいしREADMEに書くのもだるい

めんどいのcomposer.jsonに書けばいい

  • rails とかだと用意されているんだけど(もちろんプロジェクト単位での追記はあると思うけど)setupコマンドを作っとけばいい
    • composer のscriptsって箇所に追記すればいい。例えば下記のように
       "set-up": [
            "composer install",
            "cp .env.example .env",
            "php artisan key:generate"
        ]
  • って書いておけば
composer set-up
  • 一回で済む話。

  • もしまだやったことがなくコマンド都度打つような環境なら最初の段階であらかじめ追記しておいた方がいい。そうしたらドキュメントも一行で済むし、他の作業者が間違えることなく初期環境構築が終えられると思う。できる限り日々小さなことでもめんどーは避けたい。

レガシーなPHPシステムにPHPUnitを入れてみる

目的

  • 単体テストがなく、なんの動作保証もない実装がすぐにローンチされている環境をなくしたい
  • 色々とメンテナンスされていないライブラリを消し去りたい
  • 他にも色々と理由はあった・・・・気がするけど主にこのへん

現状

  • レガシーのシステムなのでPHPのversionはもちろんサポ外ですよ

    • なので極力対象のシステムが動く環境で検証実装
    • 既存の秘伝のタレで作成されるvagrant環境を参考にdockerの環境構築に着手した
      • しかし大きな問題が発生。メンテされていない、ドキュメントも少ない、安全な保証なしってことで消し去りたいライブラリを入れられないって問題。あまり時間も取られたくないのでひとまず秘伝のタレでできているvagrant 環境で実装することに※実際みる限り問題なく動いてはいるはず。
  • 単体テストを使用しようとした痕跡はあるけどもそれ自体がテストとして成立してないものなので、即全削除。0からの実装が確定

調査・事前準備

  • 該当のPHP versionで動くPHPUnitDbUnitの組み合わせで検証プロトタイプの作成
  • その後秘伝のタレのvagrant環境で動作確認

先々考えるとしんどい

  • 理由
    • PHPUnit, DbUnitのversionをPHPのversionに伴ってあげるとpathが変わる。
    • そこを考慮して実装しないと世代アップにも時間が取られることになる。

次のブログで導入手順を書く