cloudformation-to-pulumi
AWS CloudFormationのスタックやテンプレートをPulumiプログラムに変換・移行・インポートする際に使用するスキルです。CFNテンプレートの変換、CloudFormation管理リソースのPulumiへの取り込み、またはcdk-importerに関する質問など、CloudFormationからPulumiへの移行に関するあらゆる場面でロードされます。
description の原文を見る
Convert, migrate, or import AWS CloudFormation stacks or templates into Pulumi programs. Load this skill whenever a user wants to move from CloudFormation to Pulumi, convert a CFN template, import existing CloudFormation-managed resources into Pulumi, or asks about CloudFormation-to-Pulumi migration in any form. Also load when the user mentions cdk-importer in a migration context.
SKILL.md 本文
重要: プラン調整が必要です
このスキルを読み込む前に既に移行プランを作成している場合は:
- 既存のプランをこのスキルのワークフローと要件に対して見直してください
- ギャップ、漏れたステップ、または不正確な仮定を特定してください
- このスキルのガイダンスに合わせてプランを更新および修正してください
- 進める前に調整されたプランをユーザーに伝えてください
重大な成功要件
移行の成果物は以下のすべてを満たす必要があります:
-
リソースの完全なカバレッジ
- すべての CloudFormation リソースは Pulumi プログラムで表現されるか、最終レポートで明確に正当化される必要があります。
-
CloudFormation Logical ID をリソース名として使用
- 重大: すべての Pulumi リソースは CloudFormation Logical ID をリソース名として使用する必要があります。
- これにより、
cdk-importerツールが自動的にインポート ID を見つけることができます。 - リソースの名前を変更しないでください。論理 ID を変更するとインポートが失敗します。
-
デプロイの成功
- 生成された Pulumi プログラムは構造的に有効で、(適切な設定を前提として) 成功した
pulumi previewが可能である必要があります。
- 生成された Pulumi プログラムは構造的に有効で、(適切な設定を前提として) 成功した
-
ゼロデルタ インポート検証 (既存リソースをインポートする場合)
- インポート後、
pulumi previewは更新、置換、作成、または削除を表示してはいけません。
- インポート後、
-
最終的な移行レポート
- 常に Pull Request に適した形式の移行レポートを出力してください。
情報が不足している場合
ユーザーが CloudFormation テンプレートを提供していない場合は、スタック名を使用して AWS から取得する必要があります。
移行ワークフロー
このワークフローに正確にこの順序で従ってください:
1. 情報収集
1.1 AWS 認証情報を確認する (ESC)
AWS コマンドを実行するには、Pulumi ESC を介して読み込まれた認証情報が必要です。
- ユーザーが既に ESC 環境を提供している場合は、それを使用してください。
- ESC 環境が指定されていない場合は、進める前にどの ESC 環境を使用するかをユーザーに尋ねてください。
詳細な ESC 情報については: スキル pulumi-esc を使用してください。
AWS リージョンをユーザーに確認する必要があります。
1.2 CloudFormation テンプレートを取得する
ユーザーがテンプレート ファイルを提供している場合: テンプレートを直接読みます。
ユーザーがスタック名のみを提供している場合: AWS からテンプレートを取得します:
aws cloudformation get-template \
--region <region> \
--stack-name <stack-name> \
--query 'TemplateBody' \
--output json > template.json
1.3 リソース インベントリを構築する
スタック内のすべてのリソースをリストアップします:
aws cloudformation list-stack-resources \
--region <region> \
--stack-name <stack-name> \
--output json
これにより以下が提供されます:
LogicalResourceId- これを Pulumi リソース名として使用してくださいPhysicalResourceId- 実際の AWS リソース IDResourceType- CloudFormation リソース タイプ
1.4 テンプレート構造を分析する
テンプレートから以下を抽出します:
- パラメータとそのデフォルト値
- マッピング
- 条件
- 出力
- リソースの依存関係 (Ref、GetAtt、DependsOn)
2. コード変換 (CloudFormation → Pulumi)
重要: CloudFormation の自動変換ツールはありません。各リソースを手動で変換する必要があります。
2.1 リソース名の規約 (重大)
すべての Pulumi リソースは CloudFormation Logical ID を名前として使用する必要があります。
// CloudFormation:
// "MyAppBucketABC123": { "Type": "AWS::S3::Bucket", ... }
// Pulumi - 正しい方法:
const myAppBucket = new aws.s3.Bucket("MyAppBucketABC123", { ... });
// Pulumi - 間違った方法 (これをしないでください - インポートが失敗します):
const myAppBucket = new aws.s3.Bucket("my-app-bucket", { ... });
この名前付け規約は、cdk-importer ツールが名前でリソースをマッチングするため、必須です。
2.2 プロバイダー戦略
⚠️ 重大: デフォルトでは常に aws-native を使用してください ⚠️
- 特に理由がない限り、すべてのリソースに
aws-nativeを使用してください。 - CloudFormation タイプは aws-native に直接マップされます (例:
AWS::S3::Bucket→aws-native.s3.Bucket)。 - aws-native が必要な機能をサポートしていない場合にのみ、
aws(クラシック) を使用してください。
これは cdk-importer でのインポートの成功に必須です。 cdk-importer は CloudFormation リソースを Pulumi リソースにマッチングすることで動作し、CloudFormation は aws-native に 1:1 でマップされます。クラシック aws プロバイダーを使用するとインポート失敗の原因になります。
2.3 CloudFormation 組み込み関数
CloudFormation 組み込み関数を Pulumi の同等のものにマップします:
| CloudFormation | Pulumi の同等のもの |
|---|---|
!Ref (リソース) | リソース出力 (例: bucket.id) |
!Ref (パラメータ) | Pulumi config |
!GetAtt Resource.Attr | リソース プロパティ出力 |
!Sub "..." | pulumi.interpolate |
!Join [delim, [...]] | pulumi.interpolate または .apply() |
!If [cond, true, false] | 三項演算子 |
!Equals [a, b] | === 比較 |
!Select [idx, list] | .apply() を使用した配列のインデックス付け |
!Split [delim, str] | .apply(v => v.split(...)) |
Fn::ImportValue | スタック参照またはconfig |
例: !Sub
// CloudFormation: !Sub "arn:aws:s3:::${MyBucket}/*"
// Pulumi:
const bucketArn = pulumi.interpolate`arn:aws:s3:::${myBucket.bucket}/*`;
例: !GetAtt
// CloudFormation: !GetAtt MyFunction.Arn
// Pulumi:
const functionArn = myFunction.arn;
2.4 CloudFormation 条件
CloudFormation 条件を TypeScript ロジックに変換します:
// CloudFormation:
// "Conditions": {
// "CreateProdResources": { "Fn::Equals": [{ "Ref": "Environment" }, "prod"] }
// }
// Pulumi:
const config = new pulumi.Config();
const environment = config.require("environment");
const createProdResources = environment === "prod";
if (createProdResources) {
// 本番環境のみのリソースを作成
}
2.5 CloudFormation パラメータ
パラメータを Pulumi config に変換します:
// CloudFormation:
// "Parameters": {
// "InstanceType": { "Type": "String", "Default": "t3.micro" }
// }
// Pulumi:
const config = new pulumi.Config();
const instanceType = config.get("instanceType") || "t3.micro";
2.6 CloudFormation マッピング
マッピングを TypeScript オブジェクトに変換します:
// CloudFormation:
// "Mappings": {
// "RegionMap": {
// "us-east-1": { "AMI": "ami-12345" },
// "us-west-2": { "AMI": "ami-67890" }
// }
// }
// Pulumi:
const regionMap: Record<string, { ami: string }> = {
"us-east-1": { ami: "ami-12345" },
"us-west-2": { ami: "ami-67890" },
};
const ami = regionMap[aws.config.region!].ami;
2.7 カスタム リソース
CloudFormation カスタム リソース (AWS::CloudFormation::CustomResource または Custom::*) には特別な処理が必要です:
- 目的を特定する: Lambda 関数コードを読んでその動作を理解する
- ネイティブ置換を探す: Pulumi に同じ機能を提供するネイティブ リソースがあるかどうかを確認する
- 置換がない場合: 移行レポートで手動実装が必要であることを記録する
2.8 TypeScript 出力処理
aws-native の出力には未定義が含まれることがあります。! null でない assert を避けてください。常に .apply() で安全にアンラップしてください:
// 間違った方法
functionName: lambdaFunction.functionName!,
// 正しい方法
functionName: lambdaFunction.functionName.apply(name => name || ""),
3. リソース インポート
変換後、Pulumi で管理するために既存リソースをインポートします。
3.0 インポート前検証 (必須)
インポートを進める前に、コードを検証してください:
- プロバイダー使用を確認する: コードをスキャンして、すべてのリソースが
aws-nativeを使用していることを確認する - 例外を記録する:
aws(クラシック) プロバイダーの使用は正当化される必要があります - リソース名を確認する: すべてのリソースが CloudFormation Logical ID を名前として使用していることを確認する
3.1 cdk-importer でのインポートの自動化
CloudFormation Logical ID をリソース名として使用しているため、cdk-importer ツールを使用してリソースを自動的にインポートできます。
詳細なインポート手順については、cfn-importer.md に従ってください。
3.2 失敗したリソースの手動インポート
自動インポートに失敗したリソースの場合:
cloudformation-id-lookup.mdに従ってインポート ID 形式を見つけますpulumi importを使用します:
pulumi import <pulumi-resource-type> <logical-id> <import-id>
3.3 インポート後のプレビューを実行する
インポート後、pulumi preview を実行してください。以下のようなものはないはずです:
- 更新
- 置換
- 作成
- 削除
変更がある場合は、調査してプログラムを更新し、プレビューが完全になるまで修正します。
出力形式 (必須)
移行を実行するときは、常に以下を生成します:
- 概要 (高レベルの説明)
- 移行プランの概要
- Pulumi コード出力 (TypeScript; ファイル別に編成)
- リソース マッピング テーブル:
| CloudFormation Logical ID | CFN タイプ | Pulumi タイプ | プロバイダー |
|---|---|---|---|
MyAppBucketABC123 | AWS::S3::Bucket | aws-native.s3.Bucket | aws-native |
MyLambdaFunction456 | AWS::Lambda::Function | aws-native.lambda.Function | aws-native |
- カスタム リソースの概要 (存在する場合)
- 最終的な移行レポート (PR 対応)
- 次のステップ (インポート手順)
詳細なドキュメントについては
公式 Pulumi ドキュメントからコンテンツを取得します:
ライセンス: Apache-2.0(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- pulumi
- リポジトリ
- pulumi/agent-skills
- ライセンス
- Apache-2.0
- 最終更新
- 不明
Source: https://github.com/pulumi/agent-skills / ライセンス: Apache-2.0
関連スキル
superpowers-streamer-cli
SuperPowers デスクトップストリーマーの npm パッケージをインストール、ログイン、実行、トラブルシューティングできます。ユーザーが npm から `superpowers-ai` をセットアップしたい場合、メールまたは電話でサインインもしくはアカウント作成を行いたい場合、ストリーマーを起動したい場合、表示されたコントロールリンクを開きたい場合、後で停止したい場合、またはソースコードへのアクセスなしに npm やランタイムの一般的な問題から復旧したい場合に使用します。
catc-client-ops
Catalyst Centerのクライアント操作・監視機能 - 有線・無線クライアントのリスト表示・フィルタリング、MACアドレスによる詳細なクライアント検索、クライアント数分析、時間軸での分析、SSIDおよび周波数帯によるフィルタリング、無線トラブルシューティング機能を提供します。MACアドレスやIPアドレスでのクライアント検索、サイト別やSSID別のクライアント数集計、無線周波数帯の分布分析、Wi-Fi信号の問題調査が必要な場合に活用できます。
ci-cd-and-automation
CI/CDパイプラインの設定を自動化します。ビルドおよびデプロイメントパイプラインの構築または変更時に使用できます。品質ゲートの自動化、CI内のテストランナー設定、またはデプロイメント戦略の確立が必要な場合に活用します。
shipping-and-launch
本番環境へのリリース準備を行います。本番環境へのデプロイ準備が必要な場合、リリース前チェックリストが必要な場合、監視機能の設定を行う場合、段階的なロールアウトを計画する場合、またはロールバック戦略が必要な場合に使用します。
linear-release-setup
Linear Releaseに向けたCI/CD設定を生成します。リリース追跡の設定、LinearのCIパイプライン構築、またはLinearリリースとのデプロイメント連携を実施する際に利用できます。GitHub Actions、GitLab CI、CircleCIなど複数のプラットフォームに対応しています。
tracking-application-response-times
API エンドポイント、データベースクエリ、サービスコール全体にわたるアプリケーションのレスポンスタイムを追跡・最適化できます。パフォーマンス監視やボトルネック特定の際に活用してください。「レスポンスタイムを追跡する」「API パフォーマンスを監視する」「遅延を分析する」といった表現で呼び出せます。