Web系エンジニアのアウトプット練習場

エンジニアリングと書評が中心。たまに全然関係無い話もします。
  • 2017年12月31日

    2017年の振り返り

    なかなか時間が取れず、もう年を越してしまいましたが、まとめておきます。
    thumbnail
  • 2017年12月28日

    GCPのHTTP(S)ロードバランサでセッションアフィニティを設定する

    Qiita
    問題 GKEのIngressで作成したHTTP(S)ロードバランサについて、Ingressコントローラからはセッションアフィニティが設定できません。 このページのaffinityの欄を確認すると、2017/12/28現在はnginxコントローラのみ対応しており、GCPのロードバランサは対応していないことがわかります。 つまり、以下のようにgceコントローラを使用している場合は、セッションアフィニティのannotationsは使用できません。 apiVersion: extensions/v1beta1 kind: Ingress metadata: name: eccube-ingress namespace: annotations: kubernetes.io/ingress.class: "gce" . . . 解決策 gcloudコマンドを使ってセッションアフィニティを設定できます。 Ingressがデプロイされ、HTTP(S)ロードバランサが立ち上がった後、以下のようなスクリプトを実行します。 enable-affinity.sh backend_list=(`gcloud compute backend-services list | awk -v ORS=" " '!/NAME/{gsub("\n"," ",$1); print $1 }'`) for v in "${backend_list[@]}" do gcloud compute backend-services update "$v" --session-affinity client_ip --global done 上記のスクリプトでは現存するバックエンドサービス全てに対して、セッションアフィニティClientIPを設定しています。
  • 2017年12月23日

    GKEのコンテナ内のディレクトリにGCSバケットをマウントする

    Qiita
    概要 Cloud Storage FUSEを使用して、Google Kubernetes Engine(以下、GKE)で動いてるコンテナ内のディレクトリにGoogle Cloud Storage(以下、GCS)のバケットをマウントすることを目指します。 WordPressのuploadsディレクトリなど、コンテナ間で共有したいリソースがある時に便利です。 GCP側の準備 プロジェクトを作成 コンソール画面などからプロジェクトを作成します。 今回は説明のためexampleというプロジェクト名であると仮定しています。 バケットの作成 Cloud SDKかGCPコンソール画面でバケットを作成します。 バケット名やプロジェクト名は他ユーザも含めて全プロジェクトでユニークなので、 名前が被った場合は違うバケット名を試してください。 クラスタ作成 コマンドで作成を行います。 重要なのは--scopesオプションで、必ずstorage-rwかstorage-fullを指定してください。 他のオプションはお好みで大丈夫です。 $ gcloud container clusters create example-cluster \ --machine-type f1-micro \ --scopes storage-full Cloud Storage FUSEのインストール ベースイメージを元に、FUSEがインストールされたイメージを作っていきます。 基本的には公式ドキュメントの手順に従って準備をしていきます。 ベースイメージ 今回は例としてphp:5.6-apacheを使用します。 他のイメージを使用する場合は、コマンドが異なる場合がございますのでご注意ください。 ベースイメージOSのバージョン名を確認 公式ドキュメントの通り、lsb_releaseコマンドを使用してOSバージョン名を確認します。 # docker run -it php:5.6-apache /bin/bash # apt-get install -y lsb-release # lsb_release -c -s jessie Apacheのユーザ名を確認 Apacheのユーザ名(=FUSEを使用するユーザ名)を確認します。 /etc/apache2/apache2.conf . . . # These need to be set in /etc/apache2/envvars User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} . . . /etc/apache2/envvarsで定義されている環境変数が指定されているようですので、コメントに書いてあるファイルを確認します。 . . . : ${APACHE_RUN_USER:=www-data} export APACHE_RUN_USER : ${APACHE_RUN_GROUP:=www-data} export APACHE_RUN_GROUP . . . Apacheのユーザはwww-dataであることがわかりました。 Dockerfileを用意する gcsfuseのパッケージURLを指定する際に、先程確認したOSバージョン名を使用します。 後ほどApacheユーザーでFUSEを使用するため、sudoもインストールしておきます。 私はvimをApacheの設定を確認するためにインストールしていますが、必須ではございません。 また、fuseグループを作成し、apacheのユーザをfuseグループに追加します。 末尾ではENTRYPOINTを指定しています。 ここで実行するスクリプトの詳細は後述します。 FROM php:5.6-apache WORKDIR /path/to/DocumentRoot # gcsfuse-[バージョン名]を指定する RUN echo "deb http://packages.cloud.google.com/apt gcsfuse-jessie main" | tee /etc/apt/sources.list.d/gcsfuse.list RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - RUN groupadd fuse RUN usermod -aG fuse www-data RUN apt-get update -y && apt-get install -y \ gcsfuse \ sudo \ vim COPY entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod a+x /usr/local/bin/entrypoint.sh EXPOSE 80 443 ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] ENTRYPOINTを指定 この例では、ドキュメントルートをGCSにマウントしていますが、他のディレクトリでももちろん構いません。 Apacheユーザとして、gcsfuseコマンドを実行しないと、ページにアクセスした際に、403エラーが出てしまう可能性があります。 entrypoint.sh #!/bin/bash source /etc/apache2/envvars chown -R www-data:www-data * sudo -u www-data gcsfuse example-bucket ./ exec apache2 -D FOREGROUND イメージファイルのビルド・プッシュ イメージをビルドし、GCPのContainer Registryにプッシュします。 docker build -f ./Dockerfile -t example_image:0.0.0 . docker tag example_image:0.0.0 gcr.io/example/example_image:0.0.0 gcloud docker -- push gcr.io/example/example_image:0.0.0 k8sの設定ファイルを用意 example.yaml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: example spec: replicas: 1 template: metadata: labels: app: example tier: frontend environment : production spec: containers: - image: gcr.io/example/example_image:0.0.0 imagePullPolicy: Always name: example ports: - containerPort: 80 name: example securityContext: privileged: true --- apiVersion: v1 kind: Service metadata: name: example labels: app: example spec: selector: app: example tier: frontend environment : production type: LoadBalancer ports: - port: 80 protocol: TCP targetPort: 80 GKEにデプロイする $ gcloud container clusters get-credentials example-cluster --project example $ kubectl create -f example.yaml GKEクラスタに接続して外部IPを確認 $ kubectl get svc example 上のコマンドを実行することで表示されるEXTERNAL IPを確認します。 確認 GCSにindex.htmlをアップし、ブラウザからhttp://[確認したEXTERNAL IP]/にアクセスします。 アップした内容が表示されたら成功です。 なお、GKEにデプロイするのに少し時間がかかる(イメージのプル時間とエントリポイントの実行時間)ため、表示されない場合は少し時間を置いてからアクセスしましょう。
  • 2017年12月11日

    EC-CUBEでフロント画面テンプレートを追加

    Qiita
    EC-CUBEでオリジナルのテンプレートを作成する必要があったので、手順をメモする。 DBはmysqlを接続している。 デフォルトテンプレートをコピーする $ cp -r app/template/default/ app/template/[テンプレートコード]/ $ cp -r src/Eccube/Resource/template/default/* app/template/[テンプレートコード]/ [テンプレートコード]は新たに追加するテンプレートを表す適当なコードに置き換える。 テンプレートをDBに登録する DBサーバーでmysqlクライアントを起動。 phpmyadminを使用する場合は省略。 $ mysql -u [DB_USER] -p Enter password: [PASSWORD] mysql > use [DB_NAME]; テンプレートを追加登録するため、以下のコマンドを実行。 mysql > INSERT INTO `dtb_template` (`device_type_id`, `template_code`, `template_name`, `create_date`, `update_date`) VALUES ('10', '[テンプレートコード]', '[テンプレート名]', NOW(), NOW()); device_type_id device_type_id 用途 10 PC用テンプレート、レスポンシブデザイン 1 モバイル専用 2 スマホ専用 template_code, template_name template_codeは先程作成したディレクトリ名に合わせる。 template_nameは任意の文字列。2バイト文字でも可。 確認 管理画面でオーナーズストア->テンプレート->テンプレート一覧から新しいテンプレートが追加されていることを確認できる。 ここから新しいテンプレートを選択すると開発をスタートできる。
  • 2017年12月02日

    IoTシステム技術検定試験(中級)を受けてみた

    Qiita
    2017/12/2にIoTシステム技術検定試験中級を受けてきたので所感をまとめておく。 試験内容について カリキュラムは公式や前回記事を参照のこと。 発表されているカリキュラム通りの割合で各項目、公式テキストから出題された。 苦手部分と思われたセンサに関して、 テキストではセンサ毎に回路図などを用いて仕組みを細かく解説されているが、 試験的には各センサが何に使われるかなど、概要がわかっている程度で良かったみたい。 あとは、IoTシステムの構成に関する問題や、IoTシステムの構築に必要なPANやWANの無線通信技術に関する問題が多かった気がする。 計算問題は帯域幅の計算に関する問題が1題だけあった。 出題方法について 形式は覚えている範囲で以下のパターンがあった。 〜について正しい記述の組み合わせを選択せよ 〜について適切な記述を1つ選択せよ 〜について不適切な記述を1つ選択せよ 空欄に入る適切な語句を選択せよ 2つ空欄があり、その組み合わせを回答するもの 1つだけ空欄があるもの 試験時間について 選択式80問に対して試験時間が90分。 悩む問題や計算問題がほぼ無いので、時間は50分ほどあまった。 残り時間を見直しや自己採点に当てることができた。 受験者について イケイケWebエンジニアより、古参風オッサンエンジニアが圧倒的に多かった。 若い層はIoTに手を出してる人は少ないのか、資格試験勉強よりも実践的に手を動かして頑張っているのか・・・。 後者ならいいんだけど、前者の場合は若い人にも頑張って欲しい。 オッサン達は今から勉強してもなかなかフルスタックにはなれないと思う。 まとめ 「広く浅く」な出題内容で、「IoTシステム開発入門」といった内容だった。 中級はたぶん受かったが、これに受かったからといって、製品レベルのIoTシステムが構築できるわけではない。 例えばテキストではクラウドサービスに関する情報はほぼ皆無である。 プライベートインフラが無い人にとってはGCPやAWSなどの知識は必須だろう。 また、この分野は移り変わりも激しいので、注意が必要である。 例えば、公式テキストでは分散データ処理プロダクトとして、Hadoopが挙げられているが、 個人的には最近はApache Beamが良い感じだと思っている。 常に情報にアンテナを貼る必要はあるだろう。