ようへいの日々精進XP

よかろうもん

2020 年 07 月 28 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

楽しく走れるようになりたい. 苦痛な日々が続く.

ギョーム

  • お休み

お中元やら博多阪急やら

  • ギョームはお休みを頂いていたので, お昼から博多阪急にてお中元の手配を済ませた
  • 遅めのお昼ごはんを阪急地下のお寿司屋さんで (ちょっと残念だった

CircleCI もくもく会

circleci.connpass.com

初めてのオンラインもくもく会, どんな感じになるか心配だったけど, 概ね良い感じですすめることが出来た.

CircleCI オフィシャル各種 orbs の .circleci/config.yml を読み比べてみたけど, orb によって書き方がマチマチで面白かった.

ディナー

  • 博多阪急で買ってきた唐揚げとか焼き鳥を食べた (調子に乗って買いすぎた

AWS Samurai 2019 に選ばれていました

aws.amazon.com

これまでもくもく会や勉強会の会場を提供してくださった皆さま, ありがとうございましたmm

2020 年 07 月 27 日 (月)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • お休み
  • 右大腿裏に強い張りがある

ギョーム (ではないけど

  • 新オフィスに出社
  • 徒歩 15 分圏内というのが素晴らしい
  • 色々とバタバタ, 新オフィスになったからというわけではない細かい案件でバタバタ, 優先度, 優先度!

ディナー

  • スタミナ豚ちゃん, エリンギが入っていて美味しゅうございました

2020 年 07 月 26 日 (日)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

10 マイルリベンジ, またまた失敗. 足が動かず...

ギョーム (ではないけど

  • おやすみ
  • ふつうの Linux プログラミングを読みすすめる, まずは最後までざーっと読んでみる

ディナー

  • 昨日のハンバーグをデミグラスソースでアレンジ, ソースが甘酸っぱくて美味しゅうございました
  • 最近のお気に入り, タコとゴーヤのオイスターソース和えもお酒のアテに最高でございました

2020 年 07 月 25 日 (土)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

お休み.

ギョーム (ではないけど

オフィスの移転作業で社内ネットワーク周りのお手伝い. 今まで何度かオフィス移転に携わってきたけど, こんなにもいたれりつくせりな移転作業は初めてだった. 荷物の梱包は引越し業者さんが雇ったおばちゃん達があっという間にやってくれるし, 物理的なネットワーク配線も事前に済んでいたし, ルーターの疎通確認と無線 LAN 設定をちょこっとやるだけだった. 色々と事前に手配してくれたバックオフィスチームにスーパー感謝.

ディナー

  • 奥さんの得意技, おろしハンバーグが今日はふっくらジューシーに仕上がっていて, ここ最近では最も美味しいハンバーグだった
  • 椎茸のバター焼きも美味しゅうございました

2020 年 07 月 24 日 (金)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

体調は悪くなかったけど, 全然思ったように走れなかった (ラップタイム的に).

ギョーム (ではないけど

ふつうのLinuxプログラミング 第2版 〜 Linuxの仕組みから学べるgccプログラミングの王道 〜 を読み始めた.

www.sbcr.jp

今日は第 3 章まで読んだ. せっかくだから読んだことをどこかに纏めていきたい.

ミニのホイールキャップを変えた

ホイールキャップを変えて、更に愛着が湧きました。#mini

ディナー

  • ポークカレー, 前回のカレー同様にカレー粉から作るタイプで汁気た多いタイプで飲み物ように食べた
  • 季節の野菜をトッピングしたり, 椎茸のソテーが添えられていたりして美味しゅうございました
  • 美味しゅうございました

Terraform で Lambda@Edge を設定する個人的なテンプレート

tl;dr

個人的に Lambda のデプロイは Serverless Framework 一択のつもりだったけど, Terraform で CloudFront を作っておいて, Lambda@Edge だけ Serverless Framework でデプロイするというのは違うかな...と思って Terraform でデプロイすることにしたのでメモしておきます.

尚, Lambda@Edge の用途としては, サイトのサブディレクトリで Directory Index を実現したいと思います.

Lambda 関数を書き散らす

以下のような超シンプルな Lambda 関数を書きます.

'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const current_uri = request.uri;
    let replace_uri = '';
    if (current_uri != '/index.html') { 
      replace_uri = current_uri.replace(/\/$|$/, '\/index.html');
    } else {
      replace_uri = current_uri;
    }

    request.uri = replace_uri;
    return callback(null, request);
};

この関数を適当なディレクトリを作成して index.js というファイル名で保存します. 今回は,

lambda-at-edge/src/index.js

というパスとファイル名で保存しています.

尚, この Lambda 関数が適用されると, 以下のようなリクエストに対して, サブディレクトリ配下の /index.html にパスを書き換えます.

https://example.com/foo -> https://example.com/foo/index.html
https://example.com/foo/ -> https://example.com/foo/index.html

また, ルートの場合には, CloudFront の Default Root Object の設定がよしなに捌いてくれます.

https://example.com -> https://example.com/index.html
https://example.com/ -> https://example.com/index.html

Lambda@Edge を設定する

必要なリソースとしては以下の通り.

  • IAM Role (ポリシーはマネージドポリシーの arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole を付与)
  • Lambda ファンクション

これらデプロイする Terraform コードのサンプルは以下の通り. 尚, Terraform のバージョンは 0.12.x を利用していて, 且つ, Terraform workspace で開発環境, 本番環境を分けて apply することを想定しています.

provider "aws" {
  region = "us-east-1"
  alias  = "virginia"
}

resource "aws_iam_role" "lambda-edge" {
  name               = "lambda-edge-${terraform.workspace}"
  assume_role_policy = data.aws_iam_policy_document.lambda-assume-role.json
}

data "aws_iam_policy_document" "lambda-assume-role" {
  statement {
    actions = ["sts:AssumeRole"]

    principals {
      type = "Service"
      identifiers = [
        "lambda.amazonaws.com",
        "edgelambda.amazonaws.com"
      ]
    }
  }
}

resource "aws_iam_role_policy_attachment" "lambda-edge-basic-role" {
  role       = aws_iam_role.lambda-edge.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"
}

data "archive_file" "lambda-edge-function" {
  type        = "zip"
  source_dir  = "lambda-at-edge/src"
  output_path = "lambda-at-edge/dst/index_access.zip"
}

resource "aws_lambda_function" "lambda-edge-function" {
  provider         = aws.virginia
  filename         = data.archive_file.lambda-edge-function.output_path
  function_name    = "subdir-redirect-function-${terraform.workspace}"
  role             = aws_iam_role.lambda-edge.arn
  handler          = "index.handler"
  source_code_hash = data.archive_file.lambda-edge-function.output_base64sha256
  runtime          = "nodejs12.x"

  publish = true

  memory_size = 128
  timeout     = 3
}

CloudFront ビヘイビアに Lambda@Edge を設定

あとは, CloudFrontビヘイビアに Lambda@Edge を設定します.

resource "aws_cloudfront_distribution" "aws_cloudfront_distribution" {
... 略 ...
  default_cache_behavior {
... 略 ...
    lambda_function_association {
      event_type   = "origin-request"
      lambda_arn   = aws_lambda_function.lambda-edge-function.qualified_arn
      include_body = false
    }
  }
... 略 ...
}

上記の例では, デフォルトのキャッシュビヘイビアに設定しています.

あとは, terraform apply で CloudFront に Lambda@Edge の設定が行われます.

参考

以下を参考にさせて頂きました. ありがとうございました.

docs.aws.amazon.com

qiita.com

S3 Cloudfront Lambda Edgeでサブディレクトリへアクセス | STAY FREE

2020 年 07 月 23 日 (木)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

昨日は完全休養だったので, 今日は良い感じで走れるのかなって思ったいたけど...

ギョーム

  • 連休初日
  • 時間を見つけて Netlify について調べたり Lambda@Edge を触っていた

ディナー

  • ポークカレー, 前回のカレー同様にカレー粉から作るタイプで汁気た多いタイプで飲み物ように食べた
  • 季節の野菜をトッピングしたり, 椎茸のソテーが添えられていたりして美味しゅうございました
  • 美味しゅうございました

2020 年 07 月 22 日 (水)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

  • 完全休養

ギョーム

  • 午前お休みを頂いて, 奥さんを香椎の病院に連れていく
  • 久しぶりに出社, そして, 最後の綱場町オフィス
  • 綱場町最後のランチはあづま屋の担々麺, 夜になっても辛さがお腹に残っていてシクシクしている
  • 1on1
  • いくつの問い合わせ対応
  • インフラ周りの移転準備を少しお手伝い
  • ALB の暖機申請
  • 少し早めに切り上げて, オフィスの中でちょっとしたお別れ会

ディナー

  • 定番の鮭の南蛮漬け, タコとゴーヤのピリ辛和え, お酒との相性もばっちりでうっかり飲みすぎになるところだった
  • 今日も美味しゅうございました

AWS Batch で利用する Managed なコンピューティング環境の EBS ボリュームサイズを拡張する (Amazon Linux 1 編)

tl;dr

AWS Batch で利用するマネージドなコンピューティング環境 (Amazon Linux 1) で EBS ボリュームサイズ不足によりエラーになった際の対処 (ボリュームサイズの拡張と Docker ストレージの拡張) についてメモしておきます.

尚, AWS Batch のコンピューティング環境では, Amazon Linux 1 及び Amazon Linux 2, 及びカスタマイズした AMI を利用することが可能ですが, 本記事では Amazon Linux 1 向けの対処方法についてのみ 記載します.

対処

概要

以下のような対応を行います.

  1. Launch Template を利用してコンピューティング環境にて利用する EBS ボリュームの拡張
  2. Docker ストレージの拡張
  3. コンピューティング環境の作成
  4. ジョブキューの修正 (3. で作成したコンピューティング環境を設定する)

EBS ボリュームサイズの拡張

コンピューティング環境の構成を変更したい場合, Launch Template を利用することが出来るので, 以下のように Launch Template 用の JSON ファイルを用意します. ファイル名は任意の名前で問題ありませんが, 今回は launch-template.json で作成します.

{
    "LaunchTemplateName":"my-aws-batch-launch-template",
    "LaunchTemplateData": {
        "BlockDeviceMappings": [
          {
            "Ebs": {
              "DeleteOnTermination": true,
              "VolumeSize": 50,
              "VolumeType": "gp2"
            },
            "DeviceName": "/dev/xvdcz"
          }
        ]
  }
}

AWS Batch のコンピューティング環境で利用される Amazon Linux 1 では, EBS ボリューム (/dev/xvda および /dev/xvdcz) が付属していますが, 今回は Docker が利用する /dev/xvdcz のみを拡張する為, 上記のような内容となります. もし, /dev/xvda も拡張したい場合には, 以下のように記載する必要があります.

{
    "LaunchTemplateName":"increase-all-volume",
    "LaunchTemplateData": {
        "BlockDeviceMappings": [
          {
            "Ebs": {
              "DeleteOnTermination": true,
              "VolumeSize": 50,
              "VolumeType": "gp2"
            },
            "DeviceName": "/dev/xvda"
          },
          {
            "Ebs": {
              "DeleteOnTermination": true,
              "VolumeSize": 75,
              "VolumeType": "gp2"
            },
            "DeviceName": "/dev/xvdcz"
          }          
        ]
  }
}

以下のように AWS CLI (aws ec2 create-launch-template) を利用して Launch Template を作成します.

$ aws ec2 create-launch-template --cli-input-json file://launch-template.json

以下のように出力されます.

{
    "LaunchTemplate": {
        "LaunchTemplateId": "lt-xxxxxxxxxxxxxxxxxxxxxxx",
        "LaunchTemplateName": "my-aws-batch-launch-template",
        "CreateTime": "2020-07-20T06:53:30+00:00",
        "CreatedBy": "arn:aws:iam::270040163539:user/xxxxxxxxxxxxxxxx",
        "DefaultVersionNumber": 1,
        "LatestVersionNumber": 1
    }
}

この状態では, 単にボリュームサイズを拡張するだけでなので, 以下を実行して Docker が利用するストレージ自体も拡張する必要があります.

Docker ストレージの拡張

Docker ストレージの拡張

Docker が利用するストレージ (以後, Docker ストレージ) を拡張する場合, /etc/sysconfig/docker に以下のような設定を書き込む必要があります.

OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"

この設定は, ざっくり言うと, Docker ストレージを 50GB で起動する設定で, Docker デーモン (厳密に言うとストレージドライバ) の起動パラメータとして指定します. dm.basesize のデフォルトは 10GB となっています.

この設定を EC2 が起動するタイミングで /etc/sysconfig/docker に書き込む必要がある為, cloud-init-per ユーティリティを利用します.

cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"' >> /etc/sysconfig/docker

cloud-init-per コマンドは, 指定した頻度でインスタンスのブートフックコマンドを作成するために使用します. 上記の場合には once なので, 起動時に 1 回書き込まれることになります.

インスタンス起動時に実行させる

先述の cloud-init-per コマンドをインスタンスの起動時に実行したいので, 以下のようなシェルスクリプトを UserData に書き込みます.

#cloud-boothook
#!/bin/bash
cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"' >> /etc/sysconfig/docker

但し, Launch Template の UserData 項目には以下のように MIME タイプを指定して書き込むか...

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0
--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"
#cloud-boothook
#!/bin/bash
cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"' >> /etc/sysconfig/docker
--==BOUNDARY==

先述のシェルスクリプトBase64エンコードして以下のようにテンプレート JSON に含める必要があります.

{
    "LaunchTemplateName": "base64-user-data",
    "LaunchTemplateData": {
        "UserData": "ewogICAgIkxhdW5jaFRlbXBsYXRlTmFtZSI6ICJpbmNyZWFzZS1jb250YWluZXItdm9sdW..."
    }
}

コンピューティング環境の作成

コンピューティング環境を作成する際, 下図のように Launch Template を指定して作成します.

f:id:inokara:20200721231302p:plain

合わせて, テンプレートバージョンも指定する必要があります. $Latest を指定すると, 常に最新の Launch Template を利用することが可能です.

尚, 一度作ったコンピューティング環境の Launch Template は変更が出来ないので, 変更したい場合には Launch Template を再作成する必要があります.

ジョブキューの修正

コンピューティング環境はジョブキューに紐付いている為, ジョブキューの修正を行います.

f:id:inokara:20200721231246p:plain

上図の通り, ジョブキューには複数のコンピューティング環境を紐付けることが出来ます. また, 順番を指定することが出来るので, 必要に応じて順番を変更することも可能なので, 動作確認も行い易いと思います.

以上

ざっくりとですがメモでした.

以下の参考に掲載されているドキュメントに全て記載されていることをただなぞっただけですが, 手を動かしてみたことで, 今まで触らず嫌いだった AWS Batch がそこまで難しいサービスではないことが解りました. また, cloud-init や Dockerd についても細かいパラメータの意味等を知ることが出来て良かったです.

参考

aws.amazon.com

aws.amazon.com

aws.amazon.com

docs.aws.amazon.com

docs.docker.com

2020 年 07 月 21 日 (火)

アクティビティ (今までの走行 (歩行) 距離)

https://pixe.la/v1/users/inokappa/graphs/fitbit-activity

Fitibit Charge2 のアクティビティから走行 (歩行) 距離を Fitbit Web API で取得して Pixela で草生やしている. 色が濃くなれば濃くなる程強度が高い (歩行, 走行距離が長い) ということで. 実装の詳細はこちら.

ジョギング

朝の一仕事が終わってから.

仕事が終わってから.

ギョーム

  • 早朝メンテ, 無事終了
  • Terraform で一発もののインフラ構築
  • Github Actions に移行したデプロイの仕組みを少し修正など

ディナー

  • 茄子と豚バラの甘辛おろし, 鶏ハムとボリューミーで美味しゅうございました
  • ちょっと食べ過ぎたかな...