8月4週

土曜:

kubernates

  • kubeconfigファイル
    • 接続先(コントロールプレーン )のURL、認証情報、NameSpaceなどを保持している

      podの削除でハマった

  • kubectl delete pod nginx-podでやるとconnectエラーになっていた
  • 正しくはkubectl delete pods nginx-podsが必要だった

アプリケーション運用を考えたときに作成する手順としては

  • ベースとなる環境(VPCなど)の作成
  • データベースの作成とアクセス用の踏み台サーバの作成
  • 踏み台サーバにて必要なツールのインストール
  • データベースにDDL及びサンプルデータの投入をする

System Manager

  • 踏み台サーバへ入りツールをインストールしたいときなどに使える
  • 踏み台サーバではgitとpostresClientをインストールする:
    • git:sudo yum install -y git
    • postgresqlClientのインストールはamazon linux 2では→のようにするsudo amazon-linux-extras install -y postgresql10

データベースのエンドポイントアドレスの確認

  • アプリケーションで必要なのは以下3点
    • データベースのエンドポイントアドレス:cloudFormationsから確認する
    • データベース管理者用パスワード:secretsmanagerから確認する
    • アプリケーション用データベースユーザのパスワード

PostgresqlでのDDL実行

  • コンソールから\i スクリプトの場所で実行できる

ECRへのログイン

  • パイプで繋いでshコマンドでログインできる。shコマンドの挙動はよくわかんないけど・・・
  • aws ecr get-login --no-include-email | sh

imageのタグ付け

  • まずはローカルでビルド:$ docker build -t k8sbook/batch-app:1.0.0 --build-arg JAR_FILE=build/libs/batch-app-1.0.0.jar .
  • ecrのURIでタグ付け:$ docker tag k8sbook/batch-app:1.0.0 ECRのURI:1.0.0
  • push:

クラッシュしたら

  • ログを見る(当たり前)
  • kubectl logs --previous YOUR-POD_NAME

サービス(ロードバランサ)の作成

apiVersion: v1
kind: Service
metadata:
  name: backend-app-service
spec:
  type: LoadBalancer
  selector:
    app: backend-app
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  • kubectl get allするとフロントエンドから叩くべきURL(EXTERNAL-IP)が追加されている f:id:yosuke0517:20200822113036j:plain
  • コンソールからも確認する(ステータスがInServiceになっていること f:id:yosuke0517:20200822113422j:plain

    s3 + cloudFrontにてフロントエンドアプリケーションのデプロイ

  • ビルド:BASE_URL=http://ロードバランサのEXTERNAL-IP:8080 npm run build
  • S3へプッシュ:aws s3 sync dist s3://バケット名 --delete --include "*" --acl public-read

    cloudFrontのキャッシュの無効化

  • キャッシュを見に行かないようにする:aws cloudfront create-invalidation --distribution-id E3DCTCVMANTC9N --path "/*"

aws-cliのバージョンによってaws ecr get-loginのオプションが異なる

  • v1だとget-login-passwordが使えない(パスワードのみ出力)
  • とりあえずコレ使う:aws ecr get-login | sh

全体の手順

f:id:yosuke0517:20200822154534j:plain

Podを直接デプロイしない理由

  • リクエスト量や処理の負荷に応じてPod数を増減させたり、Podが以上終了した際に別のPodを起動したりできない
  • Deploymentを使用することでそれができるようになる

yamlファイルに変数を渡したい場合

  • envsubstを使って渡すことができる
  • こんな感じ
$ ECR_HOST=999999999978777.dkr.ecr.ap-northHOGEHOGHO envsubst < deployment.yaml kubectl apply -f -

Podの管理

  • readinessProbe:正常性監視・・・ヘルスチェック に失敗するとServiceからのトラフィックを停止する。
  • livenessProbe:死活監視・・・コレに失敗するとPodの再起動をする。※readinessProbeが成功してからコレを行わないともしlivenessProbeに異常があった場合、再起動の無限ループになる。

月曜:

react

  • オブジェクトに対するuseStateのsetの仕方
  • ...productを付与することでオブジェクトの要素を展開して、別々にセットできる。コレがないと初期化されてしまう。
import React, { useState } from 'react';

export const Basic = (props) => {
    const clickHandler = () => {
        alert('click')
    }

    const [product, setProduct] = useState({name: '', price: ''})
    return (
        <>
            <fonm>
                <input type='text' value={ product.name }
                onChange={evt => {setProduct({...product, name: evt.target.value})}}/>
            </fonm>
        </>
    );
};

export default Basic

テンプレートの挿入の仕方

  • イロイロなテンプレートがWebstormに用意されているがrsfって打つと基本のテンプレートが展開される f:id:yosuke0517:20200825155841j:plain f:id:yosuke0517:20200825155902j:plain

useEffect

  • vueでいうcomputedみたいなもの

useContext

  • 親から孫のコンポーネントに直接値を渡せるようになるもの(Propsを使わないので可読性があがる)
  • キーワード:createContext, ProviderとConsumer, useContext

useReducer

  • 単一コンポーネント内での状態管理(mutation的な)

    グローバルな状態管理をするには(孫からdispatchをして親の状態を変えるには)

  • useReducerとuseContextを使う

水曜:

  • Docker image 全削除
  • docker rmi $(docker images -a -q) -f

PostmanとmodHeader(クロム拡張)で動作確認がラクになりそう

  • PostmanはBodyに情報追加したりHeaderにも追加できる f:id:yosuke0517:20200827015533j:plain
  • modHeaderはHeaderをセットできるのでadmin画面で認証情報を追加するときなどに使える f:id:yosuke0517:20200827015301j:plain