眠気.jl

投稿=不定期

AWS CDK 2.47.0でDynamoDBの作成: 備忘録

準備

npm i -g aws-cdk
npm i @aws-cdk/aws-dynamodb

実行

mkdir fanzamodb
cd fanzamodb
cdk init sample-app --language=typescript

lib/fanzamodb-stack.tsを編集

import * as dynamodb from "aws-cdk-lib/aws-dynamodb";
import { Duration, Stack, StackProps, RemovalPolicy } from "aws-cdk-lib";
import { Construct } from "constructs";
import * as lambda from "@aws-cdk/aws-lambda";

export class FanzamodbStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    const table = new dynamodb.Table(this, "Table", {
      partitionKey: { name: "id", type: dynamodb.AttributeType.STRING },
      billingMode: dynamodb.BillingMode.PROVISIONED,
      readCapacity: 20,
      writeCapacity: 20,
      removalPolicy: RemovalPolicy.DESTROY,
      sortKey: { name: "createdAt", type: dynamodb.AttributeType.NUMBER },
      pointInTimeRecovery: true,
      tableClass: dynamodb.TableClass.STANDARD_INFREQUENT_ACCESS,
    });

    table.addLocalSecondaryIndex({
      indexName: "statusIndex",
      sortKey: { name: "status", type: dynamodb.AttributeType.STRING },
      projectionType: dynamodb.ProjectionType.ALL,
    });

    const readScaling = table.autoScaleReadCapacity({
      minCapacity: 1,
      maxCapacity: 50,
    });

    readScaling.scaleOnUtilization({
      targetUtilizationPercent: 50,
    });

    const globalTable = new dynamodb.Table(this, "Table", {
      partitionKey: { name: "id", type: dynamodb.AttributeType.STRING },
      replicationRegions: ["us-east-1", "us-east-2", "us-west-1"],
      billingMode: dynamodb.BillingMode.PROVISIONED,
      replicationTimeout: Duration.hours(3),
    });
    globalTable
      .autoScaleWriteCapacity({
        minCapacity: 1,
        maxCapacity: 10,
      })
      .scaleOnUtilization({ targetUtilizationPercent: 75 });
  }
}
cdk deploy

確認

AWSコンソール->DynamoDB->リージョン ["us-east-1", "us-east-2", "us-west-1"]それぞれにテーブルが作成されていることを確認

Stripeの契約ダッシュボードをNext.jsに埋め込む :備忘録

Stripe側の準備

userにmanage subscriptionの権限を付与しておく
与えたい契約の選択肢を追加しておく

ページ側

  const router = useRouter();
  const loadPortal = async () => {
    const { data } = await axios.get("/api/portal");
    router.push(data.url);
  };
  return (
    <div>
      <button onClick={loadPortal}>サブスクの管理ページにジャンプする</button>
    </div>
  );

api

    const session = await stripe.billingPortal.sessions.create({
      customer: stripe_customer, // stripeのcustomer.id
      return_url: http://localhost:3000, // dev
    });
    res.send({
      url: session.url,
    });

日記

1

React Dropzoneとreact-hook-form組み合わせしんどそうと思ったんですがこの人パクったらうまく行きました

react-hook-form-with-react-dropzone - CodeSandbox

バリデーションはYupとかZodとか死ぬほどあってどれ選べばいいんでしょうか?
フロントはチンパンだから無限に似たようなツール生えるってろいさんが言っててそういう見方もあるなぁとなりました

2

RustのWebの本が届いた(Webアプリ開発で学ぶ Rust言語入門)
乱雑に目を通して目次を把握しました、これから読んでいきます
コードがGitHubでしっかりと公開されていて、追試しやすく助かりそうです 6章構成で
1,2: Rust入門
3:axumでのhttpリクエストハンドリング
4:sqlxでCRUD構成
5: React導入
6: Todoへのラベル付
となってます
RustでAPIさばくのはactixしか使ったことがなくて気になってます.
actix:7.4k
axum:6.3k でactixの方が人気そうですがこれも変わるんでしょうか
GitHub - tokio-rs/axum: Ergonomic and modular web framework built with Tokio, Tower, and Hyper GitHub - actix/actix: Actor framework for Rust.

3

よふかしのうた最終回が性癖にぶっ刺さってよかった

supabaseでプロジェクトのマイグレーションを行ったメモ

旧プロジェクト(テーブルあり、データあり)→新プロジェクト(テーブル無し)への引っ越し作業をしたのでメモ

準備

postgreを手元にも入れる
$OLD_DB_URL, $NEW_DB_URLにそれぞれのURLを入れておく

この際に用いるURLはURLではなくSettings->Database->Connection Stringでした
https://app.supabase.com/project/[projectid]/settings/database から確認可能です

手順

旧プロジェクトでやること

(supabaseのSQLEditorで)
ALTER ROLE postgres SUPERUSER

(手元のシェルで)
pg_dump --clean --if-exists --quote-all-identifiers -h $OLD_DB_URL -U postgres > dump.sql

(supabaseのSQLEditorで)
ALTER ROLE postgres NOSUPERUSER

新プロジェクトでやること

(supabaseのSQLEditorで)
ALTER ROLE postgres SUPERUSER

(手元のシェルで)
psql -h $NEW_DB_URL -U postgres -f dump.sql

(supabaseのSQLEditorで)
ALTER ROLE postgres NOSUPERUSER

これで完了した

supabase.com

既存のsupabaseプロジェクトをsupabase-cliで触る

状況

repo/があり、その中でprisma経由でsupabaseいじっている
supabaseにアクセスするのが面倒なのでsupabase cliを入れてみる

手順

brew install supabase/tap/supabase
supabase login
# https://app.supabase.com/account/tokens に飛ばされるので、tokenを作成してコピー、貼り付けをします
supabase init
# supabase/config.tomlが生成されます
supabase start
# Studio URLへ行くとローカルにsupabaseのGUI環境が出来ています

supabase link --project-ref [project-id]
# linkさせる

supabase remote commit
# remoteの変更をローカルに適用する
# この状態で http://localhost:54323/project/default へ行くとリモートのデータが含まれている
# プロジェクト名は強制的にdefaultになってしまう(ここも自動で本番と同名にしてほしい...)

名前はdefaultになってしまっているがテーブルはカラムと型がついていた

supabase local

参考

親の顔より見たクラメソ様の記事
※この記事では'API URL'にアクセスとなっていますが、'Studio URL'かと思います

dev.classmethod.jp