kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Zenn Book で「LocalStack 実践入門 | AWS x Pulumi 入門ワークショップ」を公開しました

2025年10月17日に Zenn Book で完全無料の学習コンテンツ「LocalStack 実践入門 | AWS x Pulumi 入門ワークショップ」を公開しましたー🎉

AWS エミュレーターの LocalStack に実践的に入門しつつ「Pulumi の基礎」を学べるワークショップです❗️

zenn.dev

概要 🚀

今まで LocalStack の便利さを伝えつつ,AWS を学べる学習コンテンツとして「LocalStack 実践入門」シリーズを3つ公開しました.

zenn.dev

zenn.dev

zenn.dev

今までのワークショップは Infrastructure as Code (IaC) ツールとして AWS CloudFormation / AWS SAM / Terraform を使っていて,他の選択肢として LocalStack と Pulumi の組み合わせで学びたいというニーズもあるだろうな〜と考えて,今回 AWS アカウントを作らずに Pulumi を学べるワークショップの開発を企画しました.

www.pulumi.com

読者層 🎃

このワークショップは「LocalStack 未経験者」はもちろん「Pulumi 初学者」にもおすすめです❗️LocalStack を使えば AWS の課金を気にせず試せるため,特に「試しながら学ぶ」のに最適だと思います👌また Terraform / AWS CDK は使ったことがあるけど Pulumi は使ったことがなくてどんな感じなんだろう?と思っている方にもおすすめです.

ワークショップ構成 🧪

ワークショップは Chapter.1 から Chapter.9 まであります.pulumi previewpulumi up を実行する基本的な操作からインポート・ステートファイルの理解まで,Pulumi を使う上で知っておくと良いかな〜と思う内容をできる限り含めました.そして Chapter.10 は「応援購入」のための付録です.ワークショップに関連する小ネタを紹介しています.次のワークショップを企画するモチベーションにも繋がりますので,よろしければぜひ❗️

  • Chapter.1: ワークショップ環境をセットアップしよう
  • Chapter.2: Amazon S3 バケットをデプロイしよう
  • Chapter.3: Amazon S3 バケットを変更しよう
  • Chapter.4: AWS Lambda 関数をデプロイしよう (Function)
  • Chapter.5: AWS Lambda 関数をデプロイしよう (CallbackFunction)
  • Chapter.6: サーバレスアプリケーションをデプロイしよう
  • Chapter.7: リソースの置換を確認しよう
  • Chapter.8: 既存リソースをインポートしよう
  • Chapter.9: ステートファイルの基礎を学ぼう
  • Chapter.10: 付録(応援購入)

アーキテクチャ図 🎨

Chapter.2

Chapter.3

Chapter.4

Chapter.5

Chapter.6

Chapter.7

Chapter.8

Chapter.9

まとめ 🐸

気になるな〜と思ってもらえたら「LocalStack 実践入門 | AWS x Pulumi 入門ワークショップ」をお試しくださいませ❗️

zenn.dev

ポスト 🦜

関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

S3 バケットのライフサイクルでオブジェクトタグを使って削除する

Amazon S3 ライフサイクルで自動的に削除するオブジェクトのフィルタ条件として,よく使う「キープレフィックス」以外に「オブジェクトタグ」も使える.最近使う機会があって検証したログをまとめておく.

docs.aws.amazon.com

準備

まず Amazon S3 バケットにオブジェクトを3種類アップロードしておく❗️

オブジェクト1つ目(残る)

1つ目はオブジェクトタグなしでアップロードする.ライフサイクルポリシーの条件に合致せずに残る.

$ aws s3api put-object \
  --bucket kakakakakku-sandbox-lifecycle-tags \
  --key Arch_Amazon-Simple-Storage-Service_64_1.png \
  --body Arch_Amazon-Simple-Storage-Service_64.png

$ aws s3api get-object-tagging \
  --bucket kakakakakku-sandbox-lifecycle-tags \
  --key Arch_Amazon-Simple-Storage-Service_64_1.png
{
    "TagSet": []
}

オブジェクト2つ目(自動的に消える)

2つ目はオブジェクトタグありでアップロードする(AutoDelete: true).ライフサイクルポリシーの条件に合致するため自動的に消える.

$ aws s3api put-object \
  --bucket kakakakakku-sandbox-lifecycle-tags \
  --key Arch_Amazon-Simple-Storage-Service_64_2.png \
  --body Arch_Amazon-Simple-Storage-Service_64.png \
  --tagging "AutoDelete=true"

$ aws s3api get-object-tagging \
  --bucket kakakakakku-sandbox-lifecycle-tags \
  --key Arch_Amazon-Simple-Storage-Service_64_2.png
{
    "TagSet": [
        {
            "Key": "AutoDelete",
            "Value": "true"
        }
    ]
}

オブジェクト3つ目(自動的に消える)

3つ目はオブジェクトタグなしでアップロードしつつ,別途オブジェクトタグを設定する(AutoDelete: true).何かしらの処理によって削除可能だとマークされたときにオブジェクトタグを設定するようなイメージ.ライフサイクルポリシーの条件に合致するため自動的に消える.

$ aws s3api put-object \
  --bucket kakakakakku-sandbox-lifecycle-tags \
  --key Arch_Amazon-Simple-Storage-Service_64_3.png \
  --body Arch_Amazon-Simple-Storage-Service_64.png

$ aws s3api put-object-tagging \
  --bucket kakakakakku-sandbox-lifecycle-tags \
  --key Arch_Amazon-Simple-Storage-Service_64_3.png \
  --tagging 'TagSet=[{Key=AutoDelete,Value=true}]'

$ aws s3api get-object-tagging \
  --bucket kakakakakku-sandbox-lifecycle-tags \
  --key Arch_Amazon-Simple-Storage-Service_64_3.png
{
    "TagSet": [
        {
            "Key": "AutoDelete",
            "Value": "true"
        }
    ]
}

ライフサイクルを設定する

最後に Amazon S3 ライフサイクルを設定する.AutoDelete: true というオブジェクトタグをフィルタ条件にして1日で削除する.今回は Terraform で実装した👌

resource "aws_s3_bucket" "sandbox" {
  bucket = "kakakakakku-sandbox-lifecycle-tags"
}

resource "aws_s3_bucket_public_access_block" "sandbox" {
  bucket = aws_s3_bucket.sandbox.id

  block_public_acls       = true
  block_public_policy     = true
  ignore_public_acls      = true
  restrict_public_buckets = true
}

resource "aws_s3_bucket_lifecycle_configuration" "sandbox" {
  bucket = aws_s3_bucket.sandbox.id

  rule {
    id     = "delete-objects-automatically"
    status = "Enabled"

    filter {
      tag {
        key   = "AutoDelete"
        value = "true"
      }
    }

    expiration {
      days = 1
    }
  }
}

動作確認

数日待つとライフサイクルが実行されて,期待通りに「オブジェクト1つ目」のみ残っていた \( 'ω')/

Before

$ aws s3 ls kakakakakku-sandbox-lifecycle-tags
2025-10-05 16:19:24       2770 Arch_Amazon-Simple-Storage-Service_64_1.png
2025-10-05 16:21:47       2770 Arch_Amazon-Simple-Storage-Service_64_2.png
2025-10-05 16:22:09       2770 Arch_Amazon-Simple-Storage-Service_64_3.png

After

$ aws s3 ls kakakakakku-sandbox-lifecycle-tags
2025-10-05 16:19:24       2770 Arch_Amazon-Simple-Storage-Service_64_1.png

関連記事

kakakakakku.hatenablog.com

Pulumi Deployments: Pulumi Cloud から AWS アカウントに自動デプロイ

Pulumi Cloud の Pulumi Deployments を使うとマネージド CI/CD 環境として自動的に pulumi previewpulumi up を実行できる.今回は Pulumi Deployments で AWS にデプロイする仕組みを構築してみた❗️

www.pulumi.com

セットアップ

Pulumi Cloud から AWS アカウントを操作できるようにするために ID プロバイダーと IAM Role をセットアップする.ドキュメントにはマネジメントコンソールでセットアップする流れが載っている.

www.pulumi.com

今回は pulumi new aws-typescript コマンドで初期化した Pulumi プロジェクトで ID プロバイダーと IAM Role を実装して,ローカル環境から pulumi up コマンドでデプロイしておくことにした.

ID プロバイダーの URL は https://api.pulumi.com/oidc・対象者 (Audience) には Pulumi 組織名を設定する.サムプリントは AWS 側で解決してくれるため適当な値で OK👌あと IAM Role には Amazon ECR のフルアクセス権限を付けておく.最小権限の原則を意識しつつも CI/CD 環境はどうしても権限が強くなってしまうと思う.

import * as aws from "@pulumi/aws";

const oidcProvider = new aws.iam.OpenIdConnectProvider("pulumi-deployments-oidc", {
    url: "https://api.pulumi.com/oidc",
    clientIdLists: ["kakakakakku"],
    thumbprintLists: ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"],
});

const pulumiDeploymentsRole = new aws.iam.Role("pulumi-deployments-role", {
    name: "pulumi-deployments-role",
    assumeRolePolicy: {
        Version: "2012-10-17",
        Statement: [
            {
                Effect: "Allow",
                Principal: {
                    Federated: oidcProvider.arn,
                },
                Action: "sts:AssumeRoleWithWebIdentity",
                Condition: {
                    StringEquals: {
                        "api.pulumi.com/oidc:aud": "kakakakakku",
                    },
                    StringLike: {
                        "api.pulumi.com/oidc:sub": "pulumi:deploy:org:kakakakakku:project:sandbox-pulumi-aws-deployments:*"
                    }
                },
            },
        ],
    }
});

new aws.iam.RolePolicyAttachment("pulumi-deployments-role-ecr", {
    role: pulumiDeploymentsRole.name,
    policyArn: "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryFullAccess",
});

スタック設定

次に Pulumi Cloud のスタックで Pulumi Deployments の設定をする.大きく以下の2種類を設定しておけば OK👌

  • Source settings(GitHub リポジトリとブランチ)
  • OpenID Connect(ID プロバイダーと IAM Role)

Pulumi Deployments で preview

今回は Amazon ECR リポジトリを1つ追加して,GitHub リポジトリにプルリクエストを作る.

new aws.ecr.Repository("sandbox-pulumi-aws-deployments", {
    name: "sandbox-pulumi-aws-deployments",
});

すると Pulumi Cloud で自動的にデプロイ(現時点では preview)が実行された👌右側に Preview succeeded と表示されている.

Pulumi Cloud で preview 結果も確認できた.

また GitHub リポジトリのプルリクエストにも自動的にコメントが投稿されていた.

Pulumi Deployments で up

preview 結果を確認して,プルリクエストをマージすると自動的にデプロイ(今度は up)が実行された👌右側に Update succeeded と表示されている.

Amazon ECR を確認すると期待通りに sandbox-pulumi-aws-deployments リポジトリが追加されていた❗️

関連記事

他にもプルリクエストを作ったら自動的に専用の環境が構築される「Review stacks」や TTL を設定して自動的に削除される「Time-to-live (TTL) スタック」など気になる機能があるので試してみよう👀

www.pulumi.com

www.pulumi.com

読んだ本を振り返る(2025年7-9月)

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

📕 2025年7月: 4冊

ダイナミックリチーミング 第2版

チームトポロジー

ソフトウェアアーキテクチャの基礎

「いつも時間がない人」のためのタスク管理の結論

📕 2025年8月: 3冊

技術広報入門

やさしいMCP入門

ハッキングAPI

📕 2025年9月: 4冊

DuckDB実践入門

ChatGPTでやってみたい100のこと

Laravelの教科書 バージョン12対応

生成AIと著作権の論点

過去の振り返り

CloudWatch アラームを無効化する

たとえば計画メンテナンス中などに "想定している" アラートが鳴ってしまうことを許容するという選択肢もあるけど,個人的には抑制できるなら抑制するのが良いと思っているんだけどな〜😀という話をしていたら,実は Amazon CloudWatch アラームを一時的に無効化できることが知られていなかったという背景があったらしく,せっかくならテックブログを書いておこうと思った \( 'ω')/

docs.aws.amazon.com

マネジメントコンソール

マネジメントコンソールで Amazon CloudWatch アラームを無効化する場合は アクション > アラームアクション > 無効化 と選択すれば OK👌

Terraform

Terraform の aws_cloudwatch_metric_alarm で Amazon CloudWatch アラームを無効化する場合は actions_enabledfalse に設定すれば OK👌(デフォルトは true)以下の例は ALB (Application Load Balancer) の HTTPCode_ELB_5XX_Count メトリクスに Amazon CloudWatch アラームを設定している🚨

resource "aws_cloudwatch_metric_alarm" "alb_5xx_errors" {
  alarm_name          = "alb-5xx-errors"
  alarm_description   = "alb-5xx-errors"
  namespace           = "AWS/ApplicationELB"
  metric_name         = "HTTPCode_ELB_5XX_Count"
  statistic           = "Sum"
  threshold           = "5"
  comparison_operator = "GreaterThanThreshold"
  period              = "300"
  evaluation_periods  = "1"
  treat_missing_data  = "notBreaching"
  alarm_actions       = ["arn:aws:sns:ap-northeast-1:000000000000:xxxxx"]
  actions_enabled     = "false"

  dimensions = {
    LoadBalancer = "app/sandbox/xxxxxxxxxxxxxxxx"
  }
}