メモ

Rye

Contentful : Organization は削除できない

  • 管理者の最後のアカウントが削除されたら削除できる

AWS Secret Manager: 再作成

このエラーは、Secrets Manager がシークレットを直ちに削除せず、復旧期間(通常 7 日間)を設けているために発生します。この期間中は同じ名前のシークレットを再作成することができません ¹。

ただし、AWS CLI を使用して、復旧期間を設けずにシークレットを完全に削除することが可能です。以下の手順を試してみてください:

  1. 削除予定のシークレット ID を取得:

    • AWS Secrets Manager コンソールを開きます。
    • ナビゲーションペインで「Secrets」を選択します。
    • 「設定」アイコンを選択し、「詳細設定」で「削除予定のシークレットを表示」を選択します。
    • 「Secrets」ペインで、削除予定のシークレットの ID を確認します。
  2. AWS CLI を使用してシークレットを完全に削除:

    • 以下のコマンドを実行します(your-secret-nameをシークレット ID または ARN に、your-regionを AWS リージョンに置き換えてください):
      1
      
      aws secretsmanager delete-secret --secret-id your-secret-name --force-delete-without-recovery --region your-region
      
  3. 削除が完了したことを確認:

    • 以下のコマンドを実行して、シークレットが完全に削除されたことを確認します:
      1
      
      aws secretsmanager describe-secret --secret-id your-secret-name --region your-region
      
    • 「Secrets Manager can’t find the specified secret」というエラーが表示されれば、シークレットは正常に削除されています。

これで、同じ名前のシークレットを再作成できるようになります ¹。

何か他にお手伝いできることがあれば教えてください!

¹: Secrets Manager のシークレットを削除して同じ名前の新しいシークレットを作成する

ソース: Copilot との会話、 2024/8/15 (1) Secrets Manager のシークレットを削除して同じ名前の新しい …. https://repost.aws/ja/knowledge-center/delete-secrets-manager-secret. (2) Secrets Manager のシークレットを削除して同じ名前の新しい …. https://bing.com/search?q=terraform+secrete+manager+%e3%82%b7%e3%83%bc%e3%82%af%e3%83%ac%e3%83%83%e3%83%88+%e4%bd%9c%e6%88%90+%e3%82%a8%e3%83%a9%e3%83%bc+%e5%89%8a%e9%99%a4+%e5%86%8d%e4%bd%9c%e6%88%90. (3) terraform destroy したら Error: error creating Secrets Manager …. https://zenn.dev/marimoofficial/scraps/fc99247acd1346. (4) Terraform を用いて RDS で作成した secret manager の ARN を参照 …. https://zenn.dev/sdb_blog/articles/4b135af4406def.

pgvector

pgvector の紹介:

  • ベクトルデータの類似性検索機能を提供する PostgreSQL の拡張機能
  • 近似値の算出はユークリッド距離、内積、コサイン距離による距離計算が提供
  • 最大で 16000 次元 ベクトル

ベクトルデータのインデックス:

  • IVFFlat
  • HNSW

象使いのための pgvector 入門 (1):

  • docker pull ankane/pgvector

Implementing the pgvector extension for a PostgreSQL database:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
services:
  db:
    hostname: db
    image: ankane/pgvector
    ports:
     - 5432:5432
    restart: always
    environment:
      - POSTGRES_DB=vectordb
      - POSTGRES_USER=testuser
      - POSTGRES_PASSWORD=testpwd
      - POSTGRES_HOST_AUTH_METHOD=trust
    volumes:
     - ./init.sql:/docker-entrypoint-initdb.d/init.sql

terraform: destroy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
resource "aws_s3_bucket" "default" {
  bucket        = "bucket-name"
}

# https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource
resource "null_resource" "default" {
  triggers = {
    bucket   = aws_s3_bucket.default.bucket
  }
  depends_on = [
    aws_s3_bucket.default
  ]
  provisioner "local-exec" {
    when = destroy
    command = "aws s3 rm s3://${self.triggers.bucket} --recursive"
  }
}

null_resource

null_resource を使って ECR レポジトリのコンテンツを削除することができます。以下はその方法の一例です。

まず、ECR レポジトリのイメージを削除するためのスクリプトを作成します。例えば、delete_ecr_images.sh という名前のスクリプトを作成し、以下の内容を記述します:

1
2
3
4
5
6
#!/bin/bash
REPOSITORY_NAME=$1
aws ecr list-images --repository-name $REPOSITORY_NAME --query 'imageIds[*]' --output json | \
  jq -c '.[]' | while read imageId; do
    aws ecr batch-delete-image --repository-name $REPOSITORY_NAME --image-ids "$imageId"
  done

次に、Terraform の設定ファイルに null_resource を追加し、このスクリプトを実行するように設定します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
resource "null_resource" "delete_ecr_images" {
  provisioner "local-exec" {
    command = "bash delete_ecr_images.sh ${aws_ecr_repository.my_repo.name}"
  }

  triggers = {
    always_run = "${timestamp()}"
  }
}

resource "aws_ecr_repository" "my_repo" {
  name = "my-repo"
  lifecycle {
    prevent_destroy = false
  }

  depends_on = [null_resource.delete_ecr_images]
}

この設定により、terraform destroy を実行する際に null_resource がトリガーされ、ECR レポジトリのイメージが削除されます。その後、ECR レポジトリ自体が削除されます。

この方法で試してみてください。何か他に質問があれば教えてくださいね!

ソース: Copilot との会話、 2024/8/14 (1) terraform の null_resource が便利だよ!という話 #AWS - Qiita. https://qiita.com/eigo_s/items/0dd6ffc84e1732eff703. (2) [terraform] 用意されてない resource は null_resource で対応する. https://qiita.com/hiko1129/items/11b028362ef2421baba6. (3) Terraform で一部のリソースだけ削除したい|テスト環境での利用 …. https://qiita.com/ryomoucmei/items/71377b05bb9b3c87cdeb. (4) null_resource - Terraform Registry. https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource.html. (5) undefined. https://github.com/hashicorp/terraform/issues/23679.

RDS が消せない

RDS が一時停止中の場合、Terraform で削除するにはいくつかの手順を踏む必要があります。以下の方法を試してみてください:

  1. RDS の設定を変更する:

    • deletion_protectionfalse に設定します。
    • skip_final_snapshottrue に設定します。
    • これらの設定を変更した後、terraform apply を実行して設定を反映させます。
  2. RDS を再起動する:

    • RDS インスタンスを一時停止から再起動します。AWS マネジメントコンソールから再起動するか、CLI を使用して再起動できます。
  3. Terraform で削除を実行する:

    • 設定が反映されたら、terraform destroy を再度実行します。

具体的なコード例は以下の通りです:

1
2
3
4
5
6
resource "aws_db_instance" "example" {
  # 他の設定
  deletion_protection = false
  skip_final_snapshot = true
  apply_immediately   = true
}

これで問題が解決するはずです。もしまだ削除できない場合は、手動で RDS インスタンスを削除することも検討してください ¹²³。

何か他にお手伝いできることがあれば教えてください!

ソース: Copilot との会話、 2024/8/14 (1) Terraform で RDS インスタンスを削除する方法 - Zenn. https://zenn.dev/kobakichi/articles/terraform-rds-destroy. (2) Terraform destroy できなくて困ったとき #Terraform - Qiita. https://qiita.com/ezaqiita/items/46811b5e4bf3ff5398ca. (3) Terraform で RDS インスタンスを削除する方法 - Zenn. https://bing.com/search?q=RDS+%e4%b8%80%e6%99%82%e5%81%9c%e6%ad%a2+terraform+destroy+RDS+%e5%89%8a%e9%99%a4. (4) amazon web services - terraform delete rds instance - Stack …. https://stackoverflow.com/questions/49439405/terraform-delete-rds-instance. (5) undefined. https://app.terraform.io/.well-known/terraform.json. (6) undefined. https://registry.terraform.io/v1/providers/hashicorp/aws/versions.

terraform: 実際のリソースを消したくないので状態から消したことにする

1
tofu -chdir=tofu/rag state rm module.apigw.aws_ecr_repository.kb

jq :JSON オブジェクトを key=value に変換

jq コマンドを使って JSON オブジェクトを key=value のリストに変換するには、以下のようなコマンドを使用できます。

例えば、以下のような JSON オブジェクトがあるとします:

1
2
3
4
5
{
  "name": "Alice",
  "age": 30,
  "city": "Tokyo"
}

この JSON オブジェクトを key=value の形式に変換するには、次のように jq コマンドを使用します:

1
echo '{"name": "Alice", "age": 30, "city": "Tokyo"}' | jq -r 'to_entries | .[] | "\(.key)=\(.value)"'

このコマンドの出力は以下のようになります:

name=Alice
age=30
city=Tokyo

この方法では、to_entries を使って JSON オブジェクトをキーと値のペアのリストに変換し、それを key=value の形式で出力しています。

他に質問があれば教えてください!

ソース: Copilot との会話、 2024/8/7 (1) jq コマンドで JSON からキー名をいい感じに取得する #JSON - Qiita. https://qiita.com/kai_kou/items/a982682131d1ad93a259. (2) jq を使って Json の深いネストにあるキーの値を抽出する方法(上の …. https://qiita.com/KuwaK/items/166dc668b67b6bee1143. (3) jq を活用して API レスポンス等から欲しい情報だけを抽出する …. https://bing.com/search?q=jq+%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89+json+%e3%82%aa%e3%83%96%e3%82%b8%e3%82%a7%e3%82%af%e3%83%88+key%3dvalue+%e3%83%aa%e3%82%b9%e3%83%88. (4) jq コマンドで JSON データから特定のキーをもつ配列オブジェクト …. https://shiro-secret-base.com/jq%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7json%E3%83%87%E3%83%BC%E3%82%BF%E3%81%8B%E3%82%89%E7%89%B9%E5%AE%9A%E3%81%AE%E3%82%AD%E3%83%BC%E3%82%92%E3%82%82%E3%81%A4%E9%85%8D%E5%88%97%E3%82%AA/. (5) #jq コマンドで #json のオブジェクトの配列から複数のキーを指定 …. https://zenn.dev/yumainaura/articles/qiita-2019-04-20t09_07_11-09_00-. (6) jq を活用して API レスポンス等から欲しい情報だけを抽出する …. https://dev.classmethod.jp/articles/road-to-jq-master-apprentice/. (7) undefined. https://qiita.com/withelmo/items/b0e1ffba639dd3ae18c0. (8) undefined. https://stedolan.github.io/jq/manual/. (9) undefined. https://qiita.com/wit. (10) undefined. https://bing.com/search?q=.

Bedrock KnowlegeBase

SQLAlchemy / Alembic

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from __future__ import print_function

"""
Print the raw DDL for a sqlalchemy declarative mapping
"""

from sqlalchemy import create_engine
from sqlalchemy.schema import CreateTable
engine = create_engine('postgresql://')

from myapp.model import Base  # your declarative_base

for table in Base.metadata.tables.values():
  print(CreateTable(table).compile(engine))
brew install libpq
apt install libpq-dev gcc

AWS Lambda 固定 IP 化

Lambda Hyperplane ENI

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "main" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-northeast-1a"
}

resource "aws_security_group" "lambda_sg" {
  vpc_id = aws_vpc.main.id

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

resource "aws_lambda_function" "my_lambda" {
  function_name = "my_lambda_function"
  role          = aws_iam_role.lambda_exec.arn
  handler       = "index.handler"
  runtime       = "nodejs14.x"
  filename      = "lambda_function_payload.zip"

  vpc_config {
    subnet_ids         = [aws_subnet.main.id]
    security_group_ids = [aws_security_group.lambda_sg.id]
  }
}

resource "aws_iam_role" "lambda_exec" {
  name = "lambda_exec_role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "lambda.amazonaws.com"
        }
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "lambda_exec_attach" {
  role       = aws_iam_role.lambda_exec.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
}

NatGateway

OpenTofu

Alembic

コードで学ぶ AWS 入門

Docker Volume ドライバ

Docker のボリュームドライバは、さまざまなストレージプロバイダーと連携し、データを永続化したりコンテナ間で共有したりするためのメカニズムを提供します。以下にいくつかのボリュームドライバの種類を紹介します:

  1. local ドライバー: ホストのローカルファイルシステムにボリュームを作成します。データはホスト内のディレクトリに保存されます ¹²。

  2. bind ドライバー: ホストのファイルまたはディレクトリをコンテナに直接マウントします。ホストとコンテナ間でデータを共有するために使用されます ⁴。

  3. tmpfs ドライバー: コンテナ内の一時的なファイルシステムを作成します。データはコンテナのライフサイクル内でのみ存在し、コンテナのパフォーマンスを向上させます ⁴。

  4. Azure File ドライバー: Microsoft Azure のファイル共有サービスと連携し、Azure ファイル共有をマウントします ⁴。

  5. Amazon EFS ドライバー: Amazon Elastic File System (EFS) と連携し、EFS ファイルシステムをマウントします ⁴。

  6. GlusterFS ドライバー: GlusterFS クラスターと連携し、分散ファイルシステムをマウントします ⁴。

これらのドライバーは、異なるストレージ要件に合わせて選択できます。⁴

ソース: Copilot との会話、 2024/8/1 (1) Docker の Volume とは?実例付きでわかりやすく解説. https://itc.tokyo/docker/docker-volume/. (2) Docker volume コマンド - とほほの WWW 入門. https://www.tohoho-web.com/docker/docker_volume.html. (3) ボリュームの使用 — Docker-docs-ja 24.0 ドキュメント. https://docs.docker.jp/storage/volumes.html. (4) docker volume ls コマンドの使い方(実例付) - めもたんす. https://www.memotansu.jp/docker/831/. (5) Getty Images. https://www.gettyimages.com/detail/news-photo/in-this-photo-illustration-the-docker-logo-seen-displayed-news-photo/1247853892.

local と bind ドライバ

Docker において local ドライバbind ドライバ の違いを説明します。

  1. ローカルドライバ (local ドライバ):

    • ローカルドライバは、コンテナごとに最大 100MB のログメッセージを保持し、ディスク容量を節約するために自動的に圧縮します ²。
    • ファイルベースのストレージを使用し、Docker デーモンのみがアクセスできるように設計されています。
  2. バインドドライバ (bind ドライバ):

    • バインドドライバは、ホスト上の正確なマウントポイントを管理できます。
    • ホストマシンと同期しているため、ファイルを修正や削除した場合はホストマシンとコンテナの両方に反映されます ⁴。
    • 開発中のソースコードやビルドファイルなど、即時反映させたいデータに適しています。

簡潔に言えば、ローカルドライバは Docker が管理し、バインドドライバはホストマシンが管理するストレージです。選択肢は、データの性質や用途に応じて検討してください。³⁵

ソース: Copilot との会話、 2024/8/1 (1) ローカルファイル・ロギング・ドライバ — Docker-docs-ja 24.0 …. https://docs.docker.jp/config/containers/logging/local.html. (2) バインドマウント、ボリューム・COPY との違い! - Zenn. https://zenn.dev/keisuke_suzuki/articles/be5df49ceef149. (3) バインド マウント(bind mount) の使用 — Docker-docs-ja 20.10 …. https://docs.docker.jp/v20.10/get-started/06_bind_mounts.html. (4) Docker のボリュームマウントとバインドマウント #Docker - Qiita. https://qiita.com/vagary/items/f0a0a1266ec3fcbc279d. (5) バインド マウント (bind mount) の使用 — Docker-docs-ja 24.0 …. https://docs.docker.jp/storage/bind-mounts.html. (6) Getty Images. https://www.gettyimages.com/detail/news-photo/in-this-photo-illustration-the-docker-logo-seen-displayed-news-photo/1247853892.