Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CloudFormationコンソールから、実際に作られたリソースを辿れるようになろう!
Search
amixedcolor
November 12, 2025
Technology
300
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CloudFormationコンソールから、 実際に作られたリソースを辿れるようになろう!
【ジュニチャン大盛】みんなのAWS CDK事情大公開スペシャル#4 で登壇した内容です!
https://classmethod.connpass.com/event/373496/
amixedcolor
November 12, 2025
More Decks by amixedcolor
See All by amixedcolor
レビューしきれない?それは「全て人力でのレビュー」だからではないでしょうか
amixedcolor
0
440
エイミは何を成したのか? - 任期中の活動を振り返る
amixedcolor
1
190
インプットと「セットで」考えるアウトプットのすすめ
amixedcolor
0
95
enPiTとアジャイルと新規事業開発 − enPiT出身のエンジニアが株式会社Relicで成していること、この先成そうとしていること
amixedcolor
1
130
新規事業開発でのAWS活用
amixedcolor
1
280
Outputをもう一歩先へ 〜あなたの現在地に合わせた、量や質など「もう一歩先の」Output〜
amixedcolor
3
460
コラボセッション 〜地元の若手とJr.Championsで、「活動の原点」を語る〜
amixedcolor
0
53
スタートアップで高速検証するためのAmplify Gen 2 〜利便性と、ハマるS3認可や一覧画面実装の解決テンプレート〜
amixedcolor
3
170
バイブスに「型」を!Kent Beckに学ぶ、AI時代のテスト駆動開発
amixedcolor
3
1k
Other Decks in Technology
See All in Technology
cccccc
moznion
0
1.9k
シンガポールで登壇してきます
yama3133
0
110
CIで使うClaude
iwatatomoya
0
240
知らん間に、回ってる
ming_ayami
0
520
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
410
Empower GenAI with Agile - あなたのアジャイルが生成AIのバフになる仕組み
hageyahhoo
1
180
Road to SRE NEXTの今までとこれから
hiroyaonoe
0
310
DMM.com 購入改善推進チーム におけるCodeRabbitを用いた レビューフロー改善の一例
ysknsid25
2
620
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
1
160
Kaggleで成長するために意識したこと
prgckwb
2
310
凡エンジニアがこの先生きのこるためには。〜TypeScript完全に理解したい〜
alchemy1115
2
170
Keeping applications secure by evolving OAuth 2.0 and OpenID Connect
ahus1
PRO
1
160
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
760
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.7k
4 Signs Your Business is Dying
shpigford
187
22k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2k
Between Models and Reality
mayunak
4
370
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
460
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Discover your Explorer Soul
emna__ayadi
2
1.2k
Leo the Paperboy
mayatellez
8
1.9k
sira's awesome portfolio website redesign presentation
elsirapls
0
300
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
190
Transcript
株式会社Relic エンジニア 保 龍児(エイミ/amixedcolor) CloudFormationコンソールから、 実際に作られたリソースを辿れるように なろう!
2 • CDKをこれから使いたい • CloudFormationを使ったことはない 想定聴衆
3 今日のゴール CloudFormationコンソールから 実際に作られたリソースを 辿れるようになる
4 今日のゴール CloudFormation コンソールから 実際に作られた リソースを 辿れるようになる
5 おまけ CDKによる簡便な記法を体感する
6 自己紹介 保 龍児(エイミ/amixedcolor) 2025 Japan AWS Jr. Champion 業務内容
: 自社新規事業SaaS開発リーダー エンジニア(WebアプリFE/BE/インフラ) 好きなトピック : アジャイル、スクラム、新規事業開発、 AWS、完全没入型仮想現実 よくいるコミュニティ : AWSコミュニティ、アジャイルコミュニティ @amixedcolor
7 • 「コンソールからリソースを辿れるようになる」に焦点を当てて いるため、周辺の説明はざっくりとしたものです 留意事項
8 CDKでVPCをデプロイした!
9 デプロイしたVPCを見てみよう!
10 わっ!?
11 「どれだ…?」
12 そんなあなたに聞いて欲しい!
13 そもそも・・・
14 Q: CDKはどうやってリソースを 構築する?
15 Q: CDKはどうやってリソースを 構築する?
16 A: CloudFormationテンプレートを 介して構築する
17 A: CloudFormationテンプレートを 介して構築する
18 A: CloudFormationテンプレート を 介して構築する
19 構築されたリソースは CloudFormationコンソール から辿れる!
20 今回デプロイするリソースの説明
21 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
22 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
23 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
24 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
25 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
26 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
27 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
28 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
29 構成図 AWS Cloud Virtual private cloud (VPC) Internet gateway
Public subnet Public subnet Amazon Elastic Compute Cloud (Amazon EC2) Role Permissions AmazonSSMManagedInstanceCore Internet
30 #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import
{ CdkLtStack } from '../lib/cdk-lt-stack'; import { CdkLtStack as CdkLtStackPredeployed } from '../lib/cdk-lt-stack’; const app = new cdk.App(); new CdkLtStack(app, 'CdkLtDemoStack', {}); new CdkLtStackPredeployed(app, 'CdkLtDemoStackPredeployed', {}); cdk.Tags.of(app).add('Project', 'CDK-LT-Demo'); cdk.Tags.of(app).add('Deletion Policy', '202511'); cdk.Tags.of(app).add('CreatedBy', 'tatsuji.ho'); ソースコード①:bin/app.ts
31 import * as cdk from 'aws-cdk-lib'; import { Construct
} from 'constructs'; import * as ec2 from 'aws-cdk-lib/aws-ec2'; // EC2 (VPC, Instance) import * as iam from 'aws-cdk-lib/aws-iam'; // IAM (Role) ソースコード②:cdk-lt-stack.ts(1/4)
32 export class CdkLtStack extends cdk.Stack { constructor(scope: Construct, id:
string, props?: cdk.StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'MyVpc', { vpcName: 'cdk-lt-vpc', maxAzs: 2 subnetConfiguration: [ { cidrMask: 24, name: 'Public', subnetType: ec2.SubnetType.PUBLIC, }, ], }); cdk.Tags.of(vpc).add('Name', 'cdk-lt-vpc'); ソースコード②:cdk-lt-stack.ts(2/4)
33 const ec2Role = new iam.Role(this, 'Ec2SsmRole', { assumedBy: new
iam.ServicePrincipal('ec2.amazonaws.com'), managedPolicies: [ iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'), ], }); const instance = new ec2.Instance(this, 'MyEc2Instance', { vpc: vpc, instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO), machineImage: ec2.MachineImage.latestAmazonLinux2023(), vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC, }, associatePublicIpAddress: true, role: ec2Role, }); cdk.Tags.of(instance).add('Name', 'cdk-lt-instance'); ソースコード②:cdk-lt-stack.ts(3/4)
34 new cdk.CfnOutput(this, 'VpcIdOutput', { value: vpc.vpcId, description: 'Created VPC
ID', exportName: 'CdkLtDemoVpcId', // 他のスタックから参照する場合の名前 }); new cdk.CfnOutput(this, 'InstanceIdOutput', { value: instance.instanceId, description: 'Created EC2 Instance ID', }); new cdk.CfnOutput(this, 'InstancePublicIpOutput', { value: instance.instancePublicIp, description: 'EC2 Instance Public IP', }); } } ソースコード②:cdk-lt-stack.ts(4/4)
35 実際に辿ってみる
36 CloudFormationコンソールにアクセス スタック名はapp.tsで渡した文字列(引数としてはid)
37 #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import
{ CdkLtStack } from '../lib/cdk-lt-stack'; import { CdkLtStack as CdkLtStackPredeployed } from '../lib/cdk-lt-stack’; const app = new cdk.App(); new CdkLtStack(app, 'CdkLtDemoStack', {}); new CdkLtStackPredeployed(app, 'CdkLtDemoStackPredeployed', {}); cdk.Tags.of(app).add('Project', 'CDK-LT-Demo'); cdk.Tags.of(app).add('Deletion Policy', '202511'); cdk.Tags.of(app).add('CreatedBy', 'tatsuji.ho'); ソースコード①:bin/app.ts 再掲
38 #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import
{ CdkLtStack } from '../lib/cdk-lt-stack'; import { CdkLtStack as CdkLtStackPredeployed } from '../lib/cdk-lt-stack’; const app = new cdk.App(); new CdkLtStack(app, 'CdkLtDemoStack', {}); new CdkLtStackPredeployed(app, 'CdkLtDemoStackPredeployed', {}); cdk.Tags.of(app).add('Project', 'CDK-LT-Demo'); cdk.Tags.of(app).add('Deletion Policy', '202511'); cdk.Tags.of(app).add('CreatedBy', 'tatsuji.ho'); ソースコード①:bin/app.ts 再掲
39 スタックを選択すると横に情報が出てくる
40 「リソース」タブに切り替えることでリソースを辿れる デフォルトのビューは「ツリービュー」
41 「フラットビュー」で一覧表示もできる
42 例えばMyVpcを開くと、押せそうなリンクがある その左の「論理ID」はコード上で指定した名前(id)
43 export class CdkLtStack extends cdk.Stack { constructor(scope: Construct, id:
string, props?: cdk.StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'MyVpc', { vpcName: 'cdk-lt-vpc', maxAzs: 2 subnetConfiguration: [ { cidrMask: 24, name: 'Public', subnetType: ec2.SubnetType.PUBLIC, }, ], }); cdk.Tags.of(vpc).add('Name', 'cdk-lt-vpc'); ソースコード②:cdk-lt-stack.ts(2/4) 再掲
44 export class CdkLtStack extends cdk.Stack { constructor(scope: Construct, id:
string, props?: cdk.StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'MyVpc', { vpcName: 'cdk-lt-vpc', maxAzs: 2 subnetConfiguration: [ { cidrMask: 24, name: 'Public', subnetType: ec2.SubnetType.PUBLIC, }, ], }); cdk.Tags.of(vpc).add('Name', 'cdk-lt-vpc'); ソースコード②:cdk-lt-stack.ts(2/4) 再掲
45 リンク先に飛ぶと(リソースにもよるがVPCは)一覧画面で、 物理IDによるフィルタがされている状態になる
46 従来通りその行をクリックして詳細を見れる
47 タグを確認すると、アプリケーション全体につけたタグは 個別のリソースにもついている(仕組み上のものもある)
48 #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import
{ CdkLtStack } from '../lib/cdk-lt-stack'; import { CdkLtStack as CdkLtStackPredeployed } from '../lib/cdk-lt-stack’; const app = new cdk.App(); new CdkLtStack(app, 'CdkLtDemoStack', {}); new CdkLtStackPredeployed(app, 'CdkLtDemoStackPredeployed', {}); cdk.Tags.of(app).add('Project', 'CDK-LT-Demo'); cdk.Tags.of(app).add('Deletion Policy', '202511'); cdk.Tags.of(app).add('CreatedBy', 'tatsuji.ho'); ソースコード①:bin/app.ts 再掲
49 #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import
{ CdkLtStack } from '../lib/cdk-lt-stack'; import { CdkLtStack as CdkLtStackPredeployed } from '../lib/cdk-lt-stack’; const app = new cdk.App(); new CdkLtStack(app, 'CdkLtDemoStack', {}); new CdkLtStackPredeployed(app, 'CdkLtDemoStackPredeployed', {}); cdk.Tags.of(app).add('Project', 'CDK-LT-Demo'); cdk.Tags.of(app).add('Deletion Policy', '202511'); cdk.Tags.of(app).add('CreatedBy', 'tatsuji.ho'); ソースコード①:bin/app.ts 再掲
50 コードで指定した通り、サブネットは2つ作られている
51 export class CdkLtStack extends cdk.Stack { constructor(scope: Construct, id:
string, props?: cdk.StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'MyVpc', { vpcName: 'cdk-lt-vpc', maxAzs: 2 subnetConfiguration: [ { cidrMask: 24, name: 'Public', subnetType: ec2.SubnetType.PUBLIC, }, ], }); cdk.Tags.of(vpc).add('Name', 'cdk-lt-vpc'); ソースコード②:cdk-lt-stack.ts(2/4) 再掲
52 export class CdkLtStack extends cdk.Stack { constructor(scope: Construct, id:
string, props?: cdk.StackProps) { super(scope, id, props); const vpc = new ec2.Vpc(this, 'MyVpc', { vpcName: 'cdk-lt-vpc', maxAzs: 2 subnetConfiguration: [ { cidrMask: 24, name: 'Public', subnetType: ec2.SubnetType.PUBLIC, }, ], }); cdk.Tags.of(vpc).add('Name', 'cdk-lt-vpc'); ソースコード②:cdk-lt-stack.ts(2/4) 再掲
53 少し覗いてみると、リンクになっていない物理IDもある この場合はまず、このIDをコピーする
54 コピーしたIDで、対応するサービス上で検索をかける
55 対応するサービスは「タイプ」から大まかに把握できるが、たま にVPCのように「EC2」タイプでも「VPC」サービスになる
56 こちらのリソースにも同様にタグがつけられている
57 #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import
{ CdkLtStack } from '../lib/cdk-lt-stack'; import { CdkLtStack as CdkLtStackPredeployed } from '../lib/cdk-lt-stack’; const app = new cdk.App(); new CdkLtStack(app, 'CdkLtDemoStack', {}); new CdkLtStackPredeployed(app, 'CdkLtDemoStackPredeployed', {}); cdk.Tags.of(app).add('Project', 'CDK-LT-Demo'); cdk.Tags.of(app).add('Deletion Policy', '202511'); cdk.Tags.of(app).add('CreatedBy', 'tatsuji.ho'); ソースコード①:bin/app.ts 再掲
58 #!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import
{ CdkLtStack } from '../lib/cdk-lt-stack'; import { CdkLtStack as CdkLtStackPredeployed } from '../lib/cdk-lt-stack’; const app = new cdk.App(); new CdkLtStack(app, 'CdkLtDemoStack', {}); new CdkLtStackPredeployed(app, 'CdkLtDemoStackPredeployed', {}); cdk.Tags.of(app).add('Project', 'CDK-LT-Demo'); cdk.Tags.of(app).add('Deletion Policy', '202511'); cdk.Tags.of(app).add('CreatedBy', 'tatsuji.ho'); ソースコード①:bin/app.ts 再掲
59 他のリソースのリンクの貼られ具合はこんな感じ
60 コードの「CfnOutput」で指定した出力も見れる
61 new cdk.CfnOutput(this, 'VpcIdOutput', { value: vpc.vpcId, description: 'Created VPC
ID', exportName: 'CdkLtDemoVpcId', // 他のスタックから参照する場合の名前 }); new cdk.CfnOutput(this, 'InstanceIdOutput', { value: instance.instanceId, description: 'Created EC2 Instance ID', }); new cdk.CfnOutput(this, 'InstancePublicIpOutput', { value: instance.instancePublicIp, description: 'EC2 Instance Public IP', }); } } ソースコード②:cdk-lt-stack.ts(4/4) 再掲
62 new cdk.CfnOutput(this, 'VpcIdOutput', { value: vpc.vpcId, description: 'Created VPC
ID', exportName: 'CdkLtDemoVpcId', // 他のスタックから参照する場合の名前 }); new cdk.CfnOutput(this, 'InstanceIdOutput', { value: instance.instanceId, description: 'Created EC2 Instance ID', }); new cdk.CfnOutput(this, 'InstancePublicIpOutput', { value: instance.instancePublicIp, description: 'EC2 Instance Public IP', }); } } ソースコード②:cdk-lt-stack.ts(4/4) 再掲
63 • スタック > リソース > ビューを選択 • ツリービュー:属しているツリーがわかる/ツリーを知りたい •
フラットビュー:一覧でいち早く見つけたい/名称が不明 • 物理IDで辿る • リンクになっている:リンクを押下 • リンクになっていない: • まずIDをコピーする • タイプをもとに各サービスのコンソールに移動(必要に応じてWebで調べる) • 対応するリソースの検索窓にペーストし検索 • Outputもコンソールで閲覧可能 辿り方の整理
64 今日のゴール CloudFormationコンソールから 実際に作られたリソースを 辿れるようになる
大志ある挑戦を創造し、日本から世界へ 想いを持った挑戦者と共に走り、共に創る