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の割り当てができるようになるとよい
参考
AWS App RunnerでRDSに接続
前回の記事
今回やりたいこと
ほとんどの機能がApp Runner側で内包指定て管理は簡単なんですけど RDSとかに接続する場合はどうするのか不明だったので試したい
やること一覧
- RDS構築
- セキュリティグループ作成
- App RunnerにカスタムVPC設定
準備していること
今回利用するソースリポジトリ
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のチュートリアルをやってみた
このチュートリアルです
元はこれらしい
で、App Runnerって何なの?
ふむ、要は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
簡単にいうと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
実行
ひとまずはここまで
参考
CI/CDを試したい
CI/CDって?
wikiによると
CI / CDは、アプリケーションの構築、テスト、および展開の自動化を実施することにより、開発および運用アクティビティとチームの間のギャップを埋める。
らしい
普段というか仕事とかではそういった環境って継続的に運用するからお金かかるってイメージなんで 自前のシェルスクリプトとかで対応しているんですよね・・・ 一部のプロジェクトで使っているようなので勉強がてら触ってみることにする
今回は触りなのでちょっとだけ
イメージ
多分、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
Lambda コンテナイメージの作成 - AWS Lambda
AWS Lambda の新機能 – コンテナイメージのサポート | Amazon Web Services ブログ