Closed8

AWS CDK を Go で書いたときのメモ

michimanimichimani

スタックのリージョン、アカウント ID の取得

import (
  "github.com/aws/aws-cdk-go/awscdk/v2"
  "github.com/aws/constructs-go/constructs/v10"
)

func NewHogeStack(scope constructs.Construct) {
  region := awscdk.Stack_Of(scope).Region()
  accountID := awscdk.Stack_Of(scope).Account()
}
michimanimichimani

ただ、 CDK の EventPattern は *[]*string で指定する必要があるので、各種演算子を使用したい場合は Low Level Construct を使う必要がある。

michimanimichimani

多分こんな感じでやる気がするけど、途中で心が折れたのでまた時間があるときに別のリソースで試す。

const eventPatternFormat = `
{
  "source": [%s]
  "detail-type": [%s],
  "resources": [{"prefix":"arn:aws:cloudformation:%s:%s:stack/%s"}],
}
`

region := awscdk.Stack_Of(scope).Region()
accountID := awscdk.Stack_Of(scope).Account()

awsevents.NewCfnRule(scope, jsii.String("CloudFormationEventsRule"), &awsevents.CfnRuleProps{
	Name:         jsii.String(util.ToKebabCase("events-rule-of-cloud-formation-events")),
	EventBusName: jsii.String("default"),
	State:        jsii.String("ENABLED"),
	EventPattern: fmt.Sprintf(eventPatternFormat,
		`"aws.cloudformation"`,
		`"CloudFormation Resource Status Change","CloudFormation Stack Status Change","CloudFormation Drift Detection Status Change"`, 
		*region,
		*accountID,
		`NotificationTest`,
	),
})
michimanimichimani

interface{} のところはそれ用の構造体作って json タグ振ったりする形かもしれない。
どちらにしても、 Go だと辛そう。

michimanimichimani

Low Level Construct、

interface{} のところはそれ用の構造体作って json タグ振ったりする形かもしれない。

これは間違い。

map[string]interface{} で記述していくのが正しそう。

awsevents.NewCfnRule(scope, jsii.String("CloudFormationEventsRule"), &awsevents.CfnRuleProps{
	Name:         jsii.String(util.ToKebabCase("events-rule-of-cloud-formation-events")),
	EventBusName: jsii.String("default"),
	State:        jsii.String("ENABLED"),
	EventPattern: &map[string]interface{}{
		"detail-type": &[]*string{
			jsii.String("CloudFormation Resource Status Change"),
			jsii.String("CloudFormation Stack Status Change"),
			jsii.String("CloudFormation Drift Detection Status Change"),
		},
		"region": region,
		"resources": &[]interface{}{
			&map[string]*string{
				"prefix": jsii.String(fmt.Sprintf("arn:aws:cloudformation:%s:%s:stack/NotificationTest", *region, *accountID)),
			},
		},
	},
})
このスクラップは2023/01/26にクローズされました