m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

AWSのサブネットについて・・・

いまいち理解できてないので整理

普段よくやる使い方

リソース CIDR 備考
VPC 172.16.0.0/16
サブネット1 172.16.1.0/24 172.16.0.0〜172.16.0.254まで使える
サブネット2 172.16.1.0/24 172.16.1.0〜172.16.1.254まで使える
サブネット3 172.16.2.0/24 172.16.2.0〜172.16.2.254まで使える
サブネット4 172.16.3.0/24 172.16.3.0〜172.16.3.254まで使える

AWSでは5IP分予約領域となるらしい

ここの/16とか/24ってなんだっけ?

IPのブロックサイズみたいなもので使用できるIP数の指標みたいなものらしい
IPv4は「192.168.40.128/32」の場合は「192.168.40.128」となり、「192.168.40.0/24」の場合は「192.168.40.0〜192.168.40.254」を表現する感じ

IPv4は4バイト

192.168.100.50のように0-254までの数字を4つ使用してIPアドレスとして定義している /32の場合は32bit、/24の場合は24bitが明示的に指定された値のため変化せず、余ったbit分が割り当て可能な領域になる感じか・・・

表にしたらこんな感じ?

IPブロック bit mask IP数
/8 11111111 00000000 00000000 00000000 16,777,216
/9 11111111 10000000 00000000 00000000 8,388,608
/10 11111111 11000000 00000000 00000000 4,194,304
/11 11111111 11100000 00000000 00000000 2,097,152
/12 11111111 11110000 00000000 00000000 1,048,576
/13 11111111 11111000 00000000 00000000 512,288
/14 11111111 11111100 00000000 00000000 262,144
/15 11111111 11111110 00000000 00000000 131,072
/16 11111111 11111111 00000000 00000000 65,536
/17 11111111 11111111 10000000 00000000 32,768
/18 11111111 11111111 11000000 00000000 16,384
/19 11111111 11111111 11100000 00000000 8192
/20 11111111 11111111 11110000 00000000 4096
/21 11111111 11111111 11111000 00000000 2048
/22 11111111 11111111 11111100 00000000 1024
/23 11111111 11111111 11111110 00000000 512
/24 11111111 11111111 11111111 00000000 256
/25 11111111 11111111 11111111 10000000 128
/26 11111111 11111111 11111111 11000000 64
/27 11111111 11111111 11111111 11100000 32
/28 11111111 11111111 11111111 11110000 16

AWSで構成する場合

リソース 備考
VPC 1
パブリックサブネット 2 2つのアベイラビリティゾーンを利用する場合
プライベートサブネット 2 2つのアベイラビリティゾーンを利用する場合

/16って結構余裕あったなー
まあ、多少はね・・・

VPCのCIDRを/24にした場合はどのようにサブネットを切るか

最大で256から5IP抜いて251だが ぎっちり詰めるよりは少し余裕持たせておくことを念頭にしてみる

リソース CIDR IP数 備考
VPC 172.16.70.0/24 251
サブネット1 172.16.70.0/28 11 172.16.70.0〜172.16.70.15まで使える
サブネット2 172.16.70.16/28 11 172.16.70.16〜172.16.70.31まで使える
サブネット3 172.16.70.32/28 11 172.16.70.32〜172.16.70.47まで使える
サブネット4 172.16.70.48/28 11 172.16.70.48〜172.16.70.63まで使える

もう少しIPを確保したい場合

リソース CIDR IP数 備考
VPC 172.16.70.0/24 251
サブネット1 172.16.70.0/27 27 172.16.70.0〜172.16.70.31まで使える
サブネット2 172.16.70.16/27 27 172.16.70.32〜172.16.70.63まで使える
サブネット3 172.16.70.32/27 27 172.16.70.64〜172.16.70.95まで使える
サブネット4 172.16.70.48/27 27 172.16.70.96〜172.16.70.127まで使える

いったんこんな感じ

まとめ

試験環境では雑でもよいが
VPCのIPブロックに応じてサブネットのIP数を調整する必要がある
仕事などではVPCのIPなどを指定されるため、IPブロック数を意識したCIDRの割り当てができるようになるとよい

参考

VPC のサブネット - Amazon Virtual Private Cloud

AWSサブネットの切り方を考えてみた | DevelopersIO

AWS App Runnerにドメインを設定

ドメイン指定したい場合

多分、route53とかでCNAMEとかエイリアスでどうにかできそうなんですが、 App Runnerで「カスタムドメイン」というのがあったので試してみる。

対象にしたいドメイン

freenomで作成

testmail-20211204.ml

route53

ホストゾーンを作成し、NSをfreenom側のDNSへ設定

App Runner

ドメインをリンク」を押下

ドメイン名を設定してリンクボタンを押下

route53に設定

確認

良い感じ^ ^
結局、route53経由するんだった・・・

参考

AWS App Runnerのカスタムドメインリンクを試してみた | DevelopersIO

AWS App RunnerでRDSに接続

前回の記事

m-shige1979.hatenablog.com

今回やりたいこと

ほとんどの機能がApp Runner側で内包指定て管理は簡単なんですけど RDSとかに接続する場合はどうするのか不明だったので試したい

やること一覧

  1. RDS構築
  2. セキュリティグループ作成
  3. App RunnerにカスタムVPC設定

準備していること

  • VPC構築(VPC、サブネット、DBサブネットグループなど)
  • App Runnerサービス
  • 踏み台用サーバ

今回利用するソースリポジトリ

https://github.com/mshige1979/simple-express-app/tree/typescript

ローカル環境でDBより取得していることを確認

現在のApp Runnerの設定

RDS構築

RDS作成パラメータ設定

無料枠をベースに構築する

しばらく待ったら作成されます

踏み台サーバを利用して接続

データベースを新規作成

テーブル及びデータ登録

CREATE TABLE `users` (
    `id` INT PRIMARY KEY
    , `name` VARCHAR(50) NOT NULL
    , `age` INT NOT NULL
);

REPLACE INTO `users` (
    `id`, `name`, `age`
) VALUES 
    (1, 'aaaa', 10)
    , (2, 'bbbb', 15)
    , (3, 'cccc', 21)
    , (4, 'dddd', 23)
;

セキュリティグループ作成

App runnerに設定用

デフォルトのままで良い(RDS連携用)

RDS用

App Runner設定

サービス設定

ネットワーク設定

デプロイして確認

所感

RDSへ接続できることを確認 IP経由で繋いだりすることも可能な感じに見える。 S3や他のサービスもおそらくだがロール経由でできるのではないかと推測

AWS App Runnerのチュートリアルをやってみた

このチュートリアルです

github.com

元はこれらしい

www.apprunnerworkshop.com

で、App Runnerって何なの?

aws.amazon.com

ふむ、要はECSとかをわざわざ準備しないで簡易的なデプロイ環境を準備してくれるって感じかな ECRとgithubの2つしかないのが難点とかかね

とりあえず、やってみました。

準備

ソースリポジトリgithub

https://github.com/mshige1979/simple-express-app

※時間が経ったら消すと思います

手順

ローカルで動作検証するためにdockerを用意

# FROM
FROM node:12.22

# 環境変数
ENV TZ Asia/Tokyo
ENV LANG C.UTF-8

# 開発用パッケージインストール
RUN apt-get update -qq && \
    apt-get clean && \
    rm -rf /var/cache/apt

# 作業ディレクトリ
WORKDIR /app

# コピー
COPY . /app

# npm install
RUN cd /app && \
    npm install

# ポート
EXPOSE 5000

# パラメータ未指定時の起動コマンド
CMD bash -c "npm install && node index.js"

package.json

{
  "name": "apprunner_example",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "express": "^4.17.1"
  },
  "devDependencies": {},
  "author": "",
  "license": "ISC"
}

index.js

const express = require("express");
const app = express();
const port = 5000;

app.get("/", (req, res) => {
  res.send("Hello World!");
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

ローカル環境で動作することを確認

AWS App runnerで「サービスを作成」を選択

「ソースリポジトリ」を選択し、「新規追加」を行う

↓ 認証する

↓ 接続名を設定し、新しい接続をセットアップする

↓ アカウントまたは組織を選択する

↓ 対象リポジトリを指定

↓ 次へ

リポジトリやブランチを設定して次へ

初期設定パラメータなどを設定し、次へ

サービス情報を定義

設定情報を確認し、デプロイ実施

5-10分くらい待つ

自動デプロイ用にコードを書き換えてプッシュ

index.js

const express = require("express");
const app = express();
const port = 5000;

app.get("/", (req, res) => {
  res.send("Hello World! App Runner Test");
});

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

デプロイ時間はこんな感じ

所感

ある程度自動でやってくれるところはありがたい
きちんと全部自前のサービスの細かいところを制御したい場合は自前になるのかも

ネットワーク環境とかがApp runner内で制御されているけどVPCを設定してなんかできそうか試してみる RDSに繋げないとかだとほとんど使い道なさそうなんで・・・

Electronを試す【今更感】

Electron

www.electronjs.org

簡単にいうとhtmlとかでデスクトップアプリを作成できるものらしい 基本Webアプリのことをメインにやってきてデスクトップアプリ開発とかやってないが 自分がなんかで使えそうなツールを開発するのに利用できそうと思いチュートリアルをやってみる

環境

Mac node14.20.0(nodenv)

クイックスタート

ディレクトリ作成

アプリ用のディレクトリを準備

mkdir electron-samples && cd electron-samples
mkdir app1 && cd app1
yarn init --private -y

パッケージ追加

electronを追加

yarn add --dev electron

関連コード

今回はチュートリアルのため、既存コードをそのまま添付

index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.

  </body>
</html>

index.js

// アプリケーションの寿命の制御と、ネイティブなブラウザウインドウを作成するモジュール
const { app, BrowserWindow } = require("electron");
const path = require("path");

const createWindow = () => {
  // ブラウザウインドウを作成します。
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, "preload.js"),
    },
  });

  // そしてアプリの index.html を読み込みます。
  mainWindow.loadFile("index.html");

  // デベロッパー ツールを開きます。
  // mainWindow.webContents.openDevTools()
};

// このメソッドは、Electron の初期化が完了し、
// ブラウザウインドウの作成準備ができたときに呼ばれます。
// 一部のAPIはこのイベントが発生した後にのみ利用できます。
app.whenReady().then(() => {
  createWindow();

  app.on("activate", () => {
    // macOS では、Dock アイコンのクリック時に他に開いているウインドウがない
    // 場合、アプリのウインドウを再作成するのが一般的です。
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
  });
});

// macOS を除き、全ウインドウが閉じられたときに終了します。 ユーザーが
// Cmd + Q で明示的に終了するまで、アプリケーションとそのメニューバーを
// アクティブにするのが一般的です。
app.on("window-all-closed", () => {
  if (process.platform !== "darwin") app.quit();
});

preload.js

// All the Node.js APIs are available in the preload process.
// Chrome 拡張機能と同じサンドボックスも持っています。
window.addEventListener("DOMContentLoaded", () => {
  const replaceText = (selector, text) => {
    const element = document.getElementById(selector);
    if (element) element.innerText = text;
  };

  for (const dependency of ["chrome", "node", "electron"]) {
    replaceText(`${dependency}-version`, process.versions[dependency]);
  }
});

ビルド用パッケージも追加

yarn add --dev @electron-forge/cli
npx electron-forge import

実行

ひとまずはここまで

参考

クイック スタート | Electron

CI/CDを試したい

CI/CDって?

wikiによると

CI / CDは、アプリケーションの構築、テスト、および展開の自動化を実施することにより、開発および運用アクティビティとチームの間のギャップを埋める。

CI/CD - Wikipedia

らしい

普段というか仕事とかではそういった環境って継続的に運用するからお金かかるってイメージなんで 自前のシェルスクリプトとかで対応しているんですよね・・・ 一部のプロジェクトで使っているようなので勉強がてら触ってみることにする

今回は触りなのでちょっとだけ

イメージ

多分、jenkinsとか使ってもいんだろうけど今回は Gitlabでやってみる

手順

gitlabのアカウント準備

gitlabアカウントにサインアップして適当なリポジトリを作成する

CD/CDよりRunner を選択

※ビルドする際にはGitlabが提供しているものがあるみたいですけど今回はマイマシンのものを設定してみる

Specific Runnersの設定を見てインストールする

インストール

一旦、ローカルへ配置

sudo curl --output ~/work/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-darwin-amd64

ディレクトリ移動

sudo mkdir -p /usr/local/bin/
admin@adminnoMacBook-Air ~ % sudo mv ~/work/gitlab-runner /usr/local/bin/.

実行権限付与

sudo chmod +x /usr/local/bin/gitlab-runner

起動

cd ~ 
gitlab-runner install
gitlab-runner start

登録

itlab-runner register --url https://gitlab.com/ --registration-token [謎のトークン]

できたの?

お試し

「.gitlab-ci.yml」を作成して画面上よりコミット

.gitlab-ci.yml file

job:
  script:
    - ls

タグつけたので無効化

なんか動いてそう

最初だから時間かかっている感じ? シンプルな結果だけどすぐには終わらなかった・・・

dockerを使いたい場合

3つほど候補があるが今回は環境がMacだったのでDocker Desktop入れました

GitLab CI/CDによるDockerイメージのビルド | GitLab

参考

GitLab RunnerでCI/CDしてみる(前編) | DevelopersIO

【GitLab】GitLab-Runnerを試用してみた - Qiita

GitLab CI/CD 発展編 ~GitLab Runnerの使い方~ | Insight Technology

Install GitLab Runner | GitLab

所感

今回はちょっとお試しなのできちんとしたことはまだやっていない もう少し勉強してWebアプリの自動デプロイなど試してみたい github-actionsもなんか似た感じのあるみたいなので見ておこう

Lambdaをコンテナイメージより作成

概要

Lambda を作成する際にコンテナイメージを使いたい

手順

1. 関数名を決める

dockerfunc01

※まだ作成はしない

2. ECR リポジトリを作成

dockerfunc01

3. 実行コードを作成(仮)

package.json

{
  "name": "dockerfunc01",
  "license": "MIT"
}

index.js

exports.handler = async (event) => {
  const result = {
    status: 200,
    message: "hello, world",
    data: event,
  };
  return result;
};

4. Dockerfile を用意

Dockerfile

FROM public.ecr.aws/lambda/nodejs:14
COPY index.js package.json  ${LAMBDA_TASK_ROOT}
CMD ["index.handler"]

5. docker build

docker build -t dockerfunc01 .

6. コンテナ起動

docker run --rm -p 9000:8080 dockerfunc01

7. 起動確認

curl -X POST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

8. ECR ログイン

aws ecr get-login-password --profile [プロフィール] --region [リージョン] | docker login --username AWS --password-stdin ${accountId}.dkr.ecr.${region}.amazonaws.com

9. タグ付け

docker tag dockerfunc01:latest ${accountId}.dkr.ecr.${region}.amazonaws.com/dockerfunc01:latest

10. ECR Push

docker push ${accountId}.dkr.ecr.${region}.amazonaws.com/dockerfunc01:latest

11. AWS コンソールで Lambda を作成し、Docker イメージを設定

12. テスト結果

コード修正

1. コードを修正する

index.js

exports.handler = async (event) => {
  const result = {
    status: 200,
    message: "hogehoge, foofoo",
    data: event,
  };
  return result;
};

2. ビルド、最デプロイ

docker build -t dockerfunc01 .

3. タグ付け

docker tag dockerfunc01:latest ${accountId}.dkr.ecr.${region}.amazonaws.com/dockerfunc01:latest

4. ECR Push

docker push ${accountId}.dkr.ecr.${region}.amazonaws.com/dockerfunc01:latest

5. イメージを差し替え

6. 再テスト

参考

コンテナ利用者に捧げる AWS Lambda の新しい開発方式 ! - 変化を求めるデベロッパーを応援するウェブマガジン | AWS

https://jpdebug.com/p/1463020

Lambda コンテナイメージの作成 - AWS Lambda

AWS Lambda の新機能 – コンテナイメージのサポート | Amazon Web Services ブログ

公式のdockerイメージ

https://gallery.ecr.aws/lambda/