kakakakakku blog

Weekly Tech Blog: Keep Learning!

習慣化 振り返り(2026年1-6月)

2024年から Habitify を使って個人的な習慣化管理を楽しんでいる❗️

Habitify 最高〜 \( 'ω')/

www.habitify.me

2026年前半(1-6月)の習慣化を振り返る.過去の振り返りは以下にまとめてある📝

朝活🌅

2023年2月から「朝活」を続けていて,2024年からは Habitify で活動内容を毎日記録している.

2026年前半(1-6月)で朝活を「181日」継続できたー👏

ちなみに朝活を skip して OK という個人的な条件として

  • 飲み会の翌朝で睡眠を優先したい日
  • 出張の翌朝で睡眠を優先したい日
  • 体調不良の日

という3つがあるけど,2026年前半(1-6月)では skip なしだった!

朝活メトリクス

朝活で取り組んだこと

Habitify API を使って Habitify メモを集計してみた.毎日コツコツとインプットできて引き続き朝活最高だった❗️あまりにも仕事に忙殺された時期もあって 7 仕事優先日 という記録もあるw(もはやそれは朝活なのか!?)

   7 ZennBook: LocalStack 実践入門バージョンアップ
   7 GH-200 対策
   7 仕事優先日
   6 ZennBook: テックブログのネタ探し入門 更新
   5 Terraform x SOPS を試す
   5 Terraform Google Cloud Provider を試す
   5 Claude Code 公式ドキュメントをすべて読む
   5 Agent Skills with Anthropic
   4 tflint-ruleset-aws の Deep Checking を試す
   4 LocalStack App Inspector を試す
   4 CloudWatch アラームのミュートルールを Terraform でデプロイする
   4 CloudFront VPC Origin を試す
   3 ZennBook: ブログネタ執筆
   3 Stategraph の Quickstart を試す
   3 LocalStack x lambroll を試す
   3 Lambda の AZ metadata を試す
   3 Hurl x GitHub Actions を試す
   3 Hurl x aws-sigv4 を試す
   3 Hurl を試す
   3 Dify: Human Input Node を試す
   3 Cognito x Google を試す
   3 CodePipeline で terraform apply を試す
   3 CloudFront v2 ログ x Terraform を試す
   3 Cloudflare Zero Trust x Google を試す
   3 Cloud Run の Startup CPU boost を試す
   3 Cloud Digital Leader 対策
   3 AWS What's New 確認
   3 AppSheet を試す
   3 ALB x Google OIDC を試す
   2 tfprune を実装する
   2 Terraform x SOPS x KSM を試す
   2 Terraform Google Cloud Provider x Trivy を試す
   2 Terraform Google Cloud Provider の google_iam_workload_identity_pool を試す
   2 Terraform Google Cloud Provider の google_cloud_tasks_queue を試す
   2 Terraform の Partial Configuration を試す
   2 Terraform の aws_athena_named_query を試す
   2 lstk を試す
   2 LocalStack x GitHub Actions デモ環境を作る
   2 Lambda Managed Instances を試す
   2 Habitify API v2 を試す
   2 Google Workspace Studio を試す
   2 Google Workspace をセットアップする
   2 Google Cloud Associate Cloud Engineer 対策
   2 Google Cloud の PAM を試す
   2 Google AI Studio を試す
   2 GitHub Actions の EC2 Self-managed runner を試す
   2 Floci の Athena サポートを試す
   2 Dify 1.13.1 を試す
   2 Cloud Run + IAP を試す
   2 Bref x AWS Parameters and Secrets Lambda Extension を試す
   2 Bref の SSM パラメータストア連携を試す
   2 Bref の MAINTENANCE_MODE を試す
   2 AWS IP Ranges Viewer 開発
   1 Terraform Google Cloud Provider の google_project_service を試す
   1 Terraform Google Cloud Provider の google_cloud_scheduler_job を試す
   1 Terraform Google Cloud Provider の google_cloud_run_v2_service を試す
   1 Terraform Google Cloud Provider の google_cloud_run_v2_job を試す
   1 Terraform Google Cloud Provider の google_billing_budget を試す
   1 Terraform Google Cloud Provider の google_artifact_registry_repository を試す
   1 Security Hub CSPM: EC2.182 を調べる
   1 Redocly Respect を試す
   1 LocalStack v4.13.0 確認
   1 Hurl の User-Agent を試す
   1 Hono Getting Started: Basic を試す
   1 GitHub Actions の schedule で timezone を試す
   1 GitHub Actions の ready_for_review を試す
   1 Feedly アップデート確認
   1 Cloudscape を試す
   1 CloudFormation の AWS::UXC::AccountCustomization を試す
   1 aws_uxc_account_customizations を試す
   1 ADOT ドキュメントを読む
   1 2025年の振り返りと2026年の抱負

10分間読書📕

2024年2月から「10分間読書」という習慣化に取り組んでいる.過去の10分間読書に関しては以下の記事にまとめてある📕

2026年前半(1-6月)で10分間読書を「181日」継続できたー👏

10分間読書メトリクス

10分間読書で読んだ本

Habitify API を使って Habitify メモを集計してみた.

  16 エンジニアリングチームのリード術
  14 業務設計の教科書
  13 技術記事を書く技術
  13 バイブコーディングを超えて
  13 GIVE & TAKE
  12 研修デザインハンドブック
  11 アーキテクチャモダナイゼーション
  11 APIファースト
  10 タイタン
  10 エンジニアリングマネージャーお悩み相談室
   8 実践Apache Iceberg
   8 メール技術の教科書
   7 経理AIエージェント
   7 Google Cloudのしくみと技術がこれ1冊でしっかりわかる教科書
   6 Gemini AI活用 最強の教科書
   5 Google AppSheet ノーコード開発入門
   4 内部監査が変われば社会が動く
   4 Google AppSheet 注文管理アプリ編
   3 エンジニアのための自己管理入門
   3 Google AppSheet Gemini 連携 & 自動化編
   3 AIエージェント 人類と協働する機械

OSS コードを読む🧑‍💻

2024年11月から「OSS コードを読む」という習慣化に取り組んでいる.過去に読んだ OSS コードは習慣化振り返りにまとめてある🧑‍💻

2026年前半(1-6月)で OSS コードを読むのを「181日」継続できたー👏

OSS メトリクス

コードを読んだリポジトリ

最近は AWS Serverless Patterns Collection(serverless-patterns リポジトリ)のコードを読みながらプルリクエストを送る時間として使うことが増えてるけど,他には terraform-linters/tflint-ruleset-awsbrefphp/brefnektos/act のコードを読んでいた日もあった.

  11 serverless-patterns/apigw-rest-stepfunctions-express-sync-bedrock-sam
  11 brefphp/bref
  10 terraform-linters/tflint-ruleset-aws
   9 serverless-patterns/lambda-managed-instances-tf
   8 serverless-patterns/sfn-glue-sam
   6 serverless-patterns/terraform-lambda-ecr-integration
   6 serverless-patterns/sfn-glue-terraform
   6 serverless-patterns/lambda-durable-scheduled-tasks-sam
   6 serverless-patterns/lambda-durable-order-processing-sam
   5 serverless-patterns/s3-eventbridge-terraform
   5 serverless-patterns/eventbridge-sfn-terraform
   5 serverless-patterns/eventbridge-cloudwatch-terraform
   5 brefphp/laravel-bridge
   4 serverless-patterns/terraform-ecs-efs-integration
   4 serverless-patterns/sns-sqs-cdk
   4 serverless-patterns/lambda-durable-human-approval-sam
   4 serverless-patterns/eventbridge-cloudwatch-cdk
   4 serverless-patterns/apigw-stepfunctions-lambda-bedrock-s3-sns
   4 nektos/act
   4 awslabs/mcp/postgres-mcp-server
   3 serverless-patterns/terraform-sqs-lambda
   3 serverless-patterns/sfn-sqs-cdk
   3 serverless-patterns/s3-sqs-terraform
   3 serverless-patterns/s3-sqs-cdk
   3 serverless-patterns/s3-sns-terraform
   3 serverless-patterns/lambda-sns-sms-cdk
   3 serverless-patterns/fargate-secretsmanager
   3 serverless-patterns/eventbridge-sqs-terraform
   3 serverless-patterns/eventbridge-sqs-cdk
   3 serverless-patterns/eventbridge-sns-terraform
   3 serverless-patterns/apigw-lambda-bedrock-js-sam
   3 serverless-patterns/apigw-dynamodb-terraform
   3 brefphp/secrets-loader
   2 serverless-patterns/sns-sqs-terraform
   2 serverless-patterns/s3-lambda-bedrock-js-sam
   2 serverless-patterns/lambda-sqs-terraform
   2 serverless-patterns/lambda-durable-testing-typescript-sam
   2 serverless-patterns/eventbridge-sns-cdk
   2 serverless-patterns/eventbridge-schedule-to-ec2-terraform
   2 serverless-patterns/eventbridge-schedule-to-cloudwatch-terraform
   2 serverless-patterns/apigw-lambda-sfn-transcribe-translate-polly-sam
   1 serverless-patterns/sns-sqs-fanout-tf
   1 serverless-patterns/eventbridge-schedule-to-sns-tf
   1 serverless-patterns/eventbridge-fan-in-terraform
   1 serverless-patterns/apigw-lambda-rekognition
   1 antonbabenko/terraform-best-practices

その他

他にも習慣化を管理している💪

  • Write Code Every Day(毎日)
  • ビタミンを摂る(毎日)
  • 1週間を振り返る(毎週)

習慣化に悩む人におすすめの一冊

僕自身は興味のあることを習慣化するのが得意だとは思うけど,もし習慣化に悩む人がいたら「小さな習慣」「続ける思考」をおすすめしたい📕

kakakakakku.hatenablog.com

まとめ

2026年後半も毎日 Habitify を使って習慣化を楽しむぞー❗️

関連記事

Habitify API に関しては以下にまとめてある.

kakakakakku.hatenablog.com

実は Habitify API v2 もリリースされているけど習慣化を振り返るには使いにくく,今回も従来の Habitify API v1 を使った👌

kakakakakku.hatenablog.com

読んだ本を振り返る(2026年4-6月)

2026年4月から2026年6月までに読んだ本とその感想(書評記事 or X ポスト)をまとめておこうと思う📝2024年2月から「毎日10分間読書」という習慣化に取り組んでいる📕3ヶ月間で「計11冊」読むことができた.

📕 2026年4月: 3冊

経理AIエージェント

経理AIエージェント 「デジタル労働力」で仕事が回る

経理AIエージェント 「デジタル労働力」で仕事が回る

  • 作者:黒﨑賢一
  • クロスメディア・パブリッシング(インプレス)
Amazon

タイタン

Google Cloudのしくみと技術がこれ1冊でしっかりわかる教科書

📕 2026年5月: 3冊

実務で使えるメール技術の教科書

技術記事を書く技術

業務設計の教科書

📕 2026年6月: 5冊

Gemini AI活用 最強の教科書

研修デザインハンドブック

研修デザインハンドブック

研修デザインハンドブック

Amazon

手を動かして学ぶ Google AppSheet

過去の振り返り

2026年(4-6月)のプルリクエストを振り返る

2016年から毎年送ったプルリクエストを振り返る記事を書いている📅

2026年(4-6月)は「計26件」だった❗️

プルリクエストを振り返るための検索

プルリクエストを振り返るために GitHub の検索条件を使う.

今回は「2026年(4-6月)」に限定するため created:2026-04-01..2026-06-30 とする.

is:pr is:public author:kakakakakku -user:kakakakakku created:2026-04-01..2026-06-30

2026/04

antonbabenko/terraform-best-practices

Terraform Best Practices というサイトを参考にすることがある.日本語翻訳もあるんだけど,一部最新のアップデートに追随されていないところがあるから1つ修正した.merge してもらえれば他にもコツコツと修正しようと思ったけど,今のところまだプルリクエストは見てもらえてなくて様子見👀

github.com

aws-samples/serverless-patterns

2025年から Serverless Land にある AWS Serverless Patterns Collection にコントリビュート(パターンのメンテナンス)するという活動をしていて,引き続きコツコツとプルリクエストを送った.2026年(4-6月) もたくさん直せたかな〜と思う😀

github.com github.com github.com github.com github.com github.com github.com

2026/05

aws-samples/serverless-patterns

github.com github.com github.com github.com github.com github.com github.com

mingrammer/diagrams

Diagrams にアイコンを追加する活動もコツコツと続けている.最近だと Noto Sans CJK フォントが取得できなくなってビルドが落ちていたのを直したり,Poetry 2.3.0 で Python 3.9 のサポートがなくなったことによって CI が落ちているのを直したりもした.プルリクエストは定期的に merge してもらえるけど,ライブラリとしては2025年11月にリリースされた diagrams 0.25.1 から止まっていて,ちょっと今後のメンテナンスに不安がある.何かしらお手伝いできるのであればやるぞー✋️

github.com github.com

2026/06

aws-samples/serverless-patterns

github.com github.com github.com github.com github.com github.com github.com

mingrammer/diagrams

github.com github.com

過去の振り返り記事

Cloud Run の Identity-Aware Proxy (IAP) 直接統合でお手軽にアクセスを制限する

はじめに

Google Cloud の Cloud Run で動かすアプリケーションへのアクセスを制限したいときに Identity-Aware Proxy (IAP) が使える.IAP を使うとアプリケーション側のコードを変更せずに Google アカウント認証を設定できる.

cloud.google.com

2026年3月のリリースで Cloud Run と Identity-Aware Proxy (IAP) を直接統合できるようになって使いやすくなった👏 アプリケーションロードバランサが不要になるぞ!

cloud.google.com

さっそく Terraform で試してみる \( 'ω')/

環境

  • Terraform 1.15.6
  • hashicorp/google 7.37.0

前提

詳細な手順は以下のドキュメントに書いてある.アクセス制限をする対象として3種類載っていて,よく使うのは Google Workspace の組織に限定するような仕組みだけど,今回は個人の Google アカウント1つに限定してアクセス制限をするような仕組みで構築する.あくまで検証として!

  • Inside the organization(組織内)
  • Outside the organization(組織外)
  • No organization(組織なし)

docs.cloud.google.com

事前準備として Google Cloud プロジェクトで OAuth 同意画面の設定と OAuth 2.0 クライアントを発行しておく.「承認済みのリダイレクト URI」はドキュメントを参考に https://iap.googleapis.com/v1/oauth/clientIds/CLIENT_ID:handleRedirect というフォーマットにする.

docs.cloud.google.com

Cloud Run

Cloud Run の実装はシンプルで google_cloud_run_v2_serviceiap_enabled = true を追加すれば OK👌コンテナは何でもよくて cloud-run-hello を使っている.

resource "google_service_account" "cloud_run_iap" {
  account_id   = "cloud-run-iap-sa"
  display_name = "Cloud Run IAP Service Account"
}

resource "google_cloud_run_v2_service" "iap" {
  name     = "sandbox-iap"
  location = "asia-northeast1"
  ingress  = "INGRESS_TRAFFIC_ALL"

  iap_enabled = true

  template {
    service_account = google_service_account.cloud_run_iap.email

    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"

      ports {
        container_port = 8080
      }
    }
  }
}

Identity and Access Management (IAM)

まずは google_cloud_run_v2_service_iam_member を使って IAP サービスエージェントに roles/run.invoker を割り当てる.サービスアカウントはドキュメントに serviceAccount:service-[PROJECT-NUMBER]@gcp-sa-iap.iam.gserviceaccount.com と書いてあった.

さらに google_iap_web_cloud_run_service_iam_member を使って IAP 経由で Cloud Run にアクセスする個人の Google アカウントに対して roles/iap.httpsResourceAccessor を割り当てる.

data "google_project" "current" {}

resource "google_cloud_run_v2_service_iam_member" "iap_invoker" {
  name     = google_cloud_run_v2_service.iap.name
  location = google_cloud_run_v2_service.iap.location
  role     = "roles/run.invoker"
  member   = "serviceAccount:service-${data.google_project.current.number}@gcp-sa-iap.iam.gserviceaccount.com"
}

resource "google_iap_web_cloud_run_service_iam_member" "user" {
  project                = data.google_project.current.project_id
  location               = google_cloud_run_v2_service.iap.location
  cloud_run_service_name = google_cloud_run_v2_service.iap.name
  role                   = "roles/iap.httpsResourceAccessor"
  member                 = "user:y.yoshida22@gmail.com"
}

IAP 側でカスタム OAuth を設定する

最後に IAP 側で「カスタム OAuth(特定の制御、ブランディング、外部ユーザー用)」を選択して「カスタム クライアント ID とシークレット」を設定すれば OK👌

動作確認

Cloud Run の URL にアクセスすると Google のログイン画面にリダイレクトされた.

個人の Google アカウントでログインすると期待通りにアプリケーションにアクセスできた❗️

また検証用で契約している Google Workspace の Google アカウントでログインすると今度は You don't have access というエラーになって同じく期待通りだった \( 'ω')/

まとめ

Cloud Run と Identity-Aware Proxy (IAP) を直接統合できるようになって便利👏 最近よく Cloud Run + Identity-Aware Proxy (IAP) という組み合わせを聞く気がする.

特に最近は Vibe Coding の普及もあって社内で使うアプリケーションを気軽に実装できるようになったけど,安全に社内に共有するにはどうしたら良いんだろう!?という相談が増えていると思う.今回紹介した Cloud Run + Identity-Aware Proxy (IAP) も使えるし,他にも AWS で Application Load Balancer (ALB) + Google WorkspaceCloudflare Access + Google Workspace も使える.

多くの選択肢を試しておきたいなーと思う💪

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

SOPS (Secrets OPerationS) で鍵をローテーションする

はじめに

前回の記事では Terraform と SOPS (Secrets OPerationS) を組み合わせてシークレット値を扱う流れをまとめた.SOPS と age を使ってシークレット値を暗号化して,terraform-provider-sops(carlpett/sops プロバイダー)を使って Terraform で扱う感じ.詳しくは記事を参照で❗️

kakakakakku.hatenablog.com

今回は SOPS と age で「シークレットの追加」「鍵のローテーション」を試してみようと思う\( 'ω')/ 今回も暗号化のバックエンドとして「age」を使う🔐

getsops.io

環境

  • SOPS 3.13.1
  • age v1.3.1

シークレットを追加する

まずは前回の記事で使ったサンプルのシークレットに new_key: new_value を追加する.sops コマンドを実行すると自動的にエディタが立ち上がるのは前回と一緒👌

$ sops sandbox.enc.yaml

sops decrypt コマンドでシークレット値を確認できた.

$ sops decrypt sandbox.enc.yaml
example_key: example_value
example_array:
    - example_value1
    - example_value2
example_number: 1234.56789
example_booleans:
    - true
    - false
new_key: new_value

鍵をローテーションする

鍵をローテーションするためにまずは age-keygen コマンドで新しい鍵を作る.ファイル名は keys-new.txt にしておく.

$ age-keygen -o keys-new.txt
Public key: age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw

次に新しく作った公開鍵を .sops.yaml に追加する.カンマ区切りにするのを忘れずに⚠️ 最初間違えてエラーになった!

creation_rules:
  - age: >-
      age1udwhv8n287suzrvuhgrqm2efcjfm446ax2uw2zn29d7umt5j539sq8wvyu,
      age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw

.sops.yaml に公開鍵を追加しただけではダメで sops updatekeys コマンドを実行する必要がある.すると Is this okay? (y/n) という確認が入るため y を入力する.

$ sops updatekeys sandbox.enc.yaml
2026/06/19 08:23:23 Syncing keys for file /Users/kakakakakku/xxx/sandbox.enc.yaml
The following changes will be made to the file's groups:
Group 1
    age1udwhv8n287suzrvuhgrqm2efcjfm446ax2uw2zn29d7umt5j539sq8wvyu
+++ age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw
Is this okay? (y/n):y
2026/06/19 08:23:32 File /Users/kakakakakku/xxx/sandbox.enc.yaml synced with new keys

ここで sandbox.enc.yaml を確認すると,sops.age に2つの enc: ブロックが追加されていた.ようするにこの時点では2種類の秘密鍵で復号できることを意味している.

example_key: ENC[AES256_GCM,data:3JoNQXeN9ArDANGsow==,iv:fXdh6tGbXwZLlW6eYHGFmeKMmck7fUxBZt2Cxbz2hfY=,tag:MdzfSPGLr+8JfV3kes+GYA==,type:str]
example_array:
    - ENC[AES256_GCM,data:eXicRcKAQZZlcfKovEA=,iv:XJQPlqB1sIU2LQao5v51QPJQJYs2FLLOkM416t1bwe4=,tag:5l+HCkVA/cHqRgWcNVJZHQ==,type:str]
    - ENC[AES256_GCM,data:hi1/Cq2RdUwqMgZy+cg=,iv:J1h2WaiDKlH0u7h5UohmjuEmsp8KXxFtWBH/r6yfkWM=,tag:7s8SW08w6p4invTem+Xe6A==,type:str]
example_number: ENC[AES256_GCM,data:ojoifALrZETniA==,iv:1KURyR0b7DGnnj7TdvBnl1FoRdq5sCkyipBz9P4Qpa0=,tag:H1w/Gs+y1o7fvq5BKh6Sig==,type:float]
example_booleans:
    - ENC[AES256_GCM,data:H48Eag==,iv:D3tycWiSPkH8zYUDu94wNVt5d/vbv3hdY3a/LE/GNeM=,tag:KJ/eeaItBuau4e+IXtk/vw==,type:bool]
    - ENC[AES256_GCM,data:tavixiM=,iv:L0CkLwKUJZfmDP7DewlBBmeMhEYHrNECGbSJ4thBnC4=,tag:dH47EaqUBLd5x/Cxbxq72Q==,type:bool]
new_key: ENC[AES256_GCM,data:XIHrl8V10hKy,iv:7vLZQfrDIkUnSVSk8q9+VRgC1Mb9as30f8fcoxilkkQ=,tag:jEUtdP0hqbGsRHHlGVHVuw==,type:str]
sops:
    age:
        - enc: |
            -----BEGIN AGE ENCRYPTED FILE-----
            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA3ak5hc0FTUC9GdTNuWEdJ
            cEJ3NG1TZzBhWkEvcDA3RXVnWjl6TjFnSUNjCjV6WFZWS3lNRkoxVVU0a3l2UmtN
            cUtIL3JIUjVzendYcjFMR2J4NEtrakkKLS0tIDBYQmVLVFFIWm42RndUMkZGaGtE
            ZGtzUVlWelJtZDkreEVRa2hEdHhnZXMKV3YmA0etoFNdwr0xvoyu9p0q6e2HPTHi
            euBllhVNYHvm7c8uk8VsWR9W4g1nsC+Mprxrt1n21lb9QfvmwIfyrw==
            -----END AGE ENCRYPTED FILE-----
          recipient: age1udwhv8n287suzrvuhgrqm2efcjfm446ax2uw2zn29d7umt5j539sq8wvyu
        - enc: |
            -----BEGIN AGE ENCRYPTED FILE-----
            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBDQmVINWtSSWNNZGxDV3ZD
            eVUwOE9mMGpGSDkxY205cFJkcWVmUVAzMWd3Ck1YdzlHR0JRM0Y5Q05CMmRpZHlK
            QU5Ed2J0dUpIWGlaZ3ZRZWVvTFBJKzgKLS0tIGZLeE92RUlabjUwNGJ0Z1JneG9x
            VVU0V3FZS0dBd0djNHo3eXdxWUY0RTAKXCaSdywxakb0M95zrmANsd7aP4hzJLZJ
            ZkN00wZDzVy7vsGJiZSbCb7fvjKGSxutxRHdpDXGfHZvBUQlqURgCw==
            -----END AGE ENCRYPTED FILE-----
          recipient: age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw
    lastmodified: "2026-06-18T23:05:33Z"
    mac: ENC[AES256_GCM,data:ThbH+/nvGlDSy1dQ9NxpKOFfAaKwoD+a4+nkD7slV6lM/eYpsAIoC1d8+GlvzBp8ylmD3Zx+49wcMs4VOHRuTBgQtG3etqgvFG9PkuYn5LFuHLmg7SWKOVhscxHaYA5KV8HSBhmmgrQCbY/d4CGmlj5a+peTexyjdU74ocuLsqY=,iv:FQdDVlNhMnUM2utQh8a92pCjCDruq+T94PB3bIGugrY=,tag:V4+Dn4HbRFRcRyfvZFojqQ==,type:str]
    unencrypted_suffix: _unencrypted
    version: 3.13.1

今度は使わなくなった鍵を .sops.yaml から削除する.

creation_rules:
  - age: age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw

もう一度 sops updatekeys コマンドを実行する.

$ sops updatekeys sandbox.enc.yaml
2026/06/19 08:34:59 Syncing keys for file /Users/kakakakakku/xxx/sandbox.enc.yaml
The following changes will be made to the file's groups:
Group 1
    age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw
--- age1udwhv8n287suzrvuhgrqm2efcjfm446ax2uw2zn29d7umt5j539sq8wvyu
Is this okay? (y/n):y
2026/06/19 08:35:12 File /Users/kakakakakku/xxx/sandbox.enc.yaml

最後に動作確認として,新しく作った鍵を使うと期待通りに復号できる❗️

$ export SOPS_AGE_KEY_FILE="~/sops/xxxxx/keys-new.txt"
$ sops decrypt sandbox.enc.yaml
example_key: example_value
example_array:
    - example_value1
    - example_value2
example_number: 1234.56789
example_booleans:
    - true
    - false
new_key: new_value

使わなくなった鍵では復号できなくなっていた🛑

$ export SOPS_AGE_KEY_FILE="~/sops/xxxxx/keys.txt"
$ sops decrypt sandbox.enc.yaml
Failed to get the data key required to decrypt the SOPS file.

Group 0: FAILED
  age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw: FAILED

今回は使わなくなった鍵を削除したため,最後に sops rotate コマンドを実行してデータキーも更新する.

$ sops rotate -i sandbox.enc.yaml

もう一度 sandbox.enc.yaml を確認すると,シークレット値の data:tag: の部分が更新されていた.

example_key: ENC[AES256_GCM,data:rGeGy20A8VMokhD9jA==,iv:fXdh6tGbXwZLlW6eYHGFmeKMmck7fUxBZt2Cxbz2hfY=,tag:wf7lHMEwHPjVZmwj4xtCRA==,type:str]
example_array:
    - ENC[AES256_GCM,data:265voZjXjMCM1X1x7P0=,iv:XJQPlqB1sIU2LQao5v51QPJQJYs2FLLOkM416t1bwe4=,tag:UHM4QR2ZC6EDQdUdsyENQA==,type:str]
    - ENC[AES256_GCM,data:bli8fHV3pWM+DfgSctc=,iv:J1h2WaiDKlH0u7h5UohmjuEmsp8KXxFtWBH/r6yfkWM=,tag:yiX7j5SiC0+HzNBeZ5ckcQ==,type:str]
example_number: ENC[AES256_GCM,data:10+IlBDRr5E+Ag==,iv:1KURyR0b7DGnnj7TdvBnl1FoRdq5sCkyipBz9P4Qpa0=,tag:hk3z9hfpJlaqB8f1/Ey30w==,type:float]
example_booleans:
    - ENC[AES256_GCM,data:k7AzuA==,iv:D3tycWiSPkH8zYUDu94wNVt5d/vbv3hdY3a/LE/GNeM=,tag:Gpk336Kbg/Skei/0tcwK4g==,type:bool]
    - ENC[AES256_GCM,data:eZKUvek=,iv:L0CkLwKUJZfmDP7DewlBBmeMhEYHrNECGbSJ4thBnC4=,tag:g3L11/Dn0GdEgPJXUGwx4w==,type:bool]
new_key: ENC[AES256_GCM,data:pxqjfqpdZ81c,iv:7vLZQfrDIkUnSVSk8q9+VRgC1Mb9as30f8fcoxilkkQ=,tag:/rQPO/oQAuUon359Os3y9A==,type:str]
sops:
    age:
        - enc: |
            -----BEGIN AGE ENCRYPTED FILE-----
            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBob3paTUdERWlaQnBBekVo
            MWdybDA3Zm9tZTRyaEs2cEQ2RWVycG5wM1NvCjhKVmt4dDB3akI3bDlTM0gza1Z0
            dEx0UzAwWUFXa1VCaGwzMGJEWUZXZ3cKLS0tIGNSejVwZzNHbmk4TGlUOUhtMFpo
            SnhFc3g3VG5tZWl5alpqRDN3VW9wL0EKvmfnG9ie9s5xy0xS4Y6bwd+29t4/KrdO
            d9Y8lRQ6dX2Ctz+cyhaxna6p2ysRb14wUyzAMjPthqgjaLqPJq8uoA==
            -----END AGE ENCRYPTED FILE-----
          recipient: age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw
    lastmodified: "2026-06-18T23:40:15Z"
    mac: ENC[AES256_GCM,data:U/wK3odmaM4NGfWtZ5eZWpz9J+Z1kbiEaNNNrxBQH3ZGMtNBdbD1sAk/Aww0i5JJC3HThxVFi1aY9C2ILKRyQ+wmES7iVRsXnZDOh+uhC6dNXr5RKXWujzb88T7t4eFVLMQFx/pI0ecU94dNkq9UEqcp1c+pbAgAyPbyhqpA2Sk=,iv:iHn9KbwjAi2ix6Zbn2UIBnoaT1sPsXRY9LeeKk1NqJ8=,tag:WToIWCdpo63m5dsKIQW5nA==,type:str]
    unencrypted_suffix: _unencrypted
    version: 3.13.1

念のため最終確認をしておく.

$ export SOPS_AGE_KEY_FILE="~/sops/xxxxx/keys-new.txt"
$ sops decrypt sandbox.enc.yaml
example_key: example_value
example_array:
    - example_value1
    - example_value2
example_number: 1234.56789
example_booleans:
    - true
    - false
new_key: new_value

$ export SOPS_AGE_KEY_FILE="~/sops/xxxxx/keys.txt"
$ sops decrypt sandbox.enc.yaml
Failed to get the data key required to decrypt the SOPS file.

Group 0: FAILED
  age1le4qpd25ffegy9cumy258q5ksu762vkwsxkymwrj9d8lct3qh3jsmac5yw: FAILED

Terraform の差分を確認する

鍵のローテーションが完了したので,前回の記事でデプロイした AWS Systems Manager Parameter Store (SecureString) の値を確認する.Terraform 側には影響がなく No changes. になっていた❗️

$ terraform plan
No changes. Your infrastructure matches the configuration.

まとめ

SOPS (Secrets OPerationS) と age の組み合わせでシークレットの追加と鍵のローテーションを試してみた.実際に試しながら sops updatekeys コマンドと sops rotate コマンドの挙動を確認できて,最終的に Terraform への影響がないことまで確認できて良かった.次は SOPS と AWS KMS の組み合わせを試してみようと思う💪

関連記事

kakakakakku.hatenablog.com