@@ -2,15 +2,15 @@ import * as cdk from "aws-cdk-lib";
2
2
import * as cdkConstructs from "constructs" ;
3
3
import * as ec2 from "aws-cdk-lib/aws-ec2" ;
4
4
import * as iam from "aws-cdk-lib/aws-iam" ;
5
- import * as s3 from "aws-cdk-lib/aws-s3" ;
6
- import { AmazonLinuxGeneration , AmazonLinuxImage } from "aws-cdk-lib/aws-ec2" ;
7
5
import * as s3Assets from "aws-cdk-lib/aws-s3-assets" ;
8
6
import * as configTypes from "./config/tzConfig.interface" ;
9
7
import { TzNodeSecurityGroupConstructs } from "./constructs/tz-node-security-group" ;
10
8
import * as fs from "fs" ;
11
9
import * as path from "path" ;
12
10
import * as constants from "../../constructs/constants" ;
13
- import { HANodesConstruct } from "../../constructs/ha-rpc-nodes-with-alb" ;
11
+ import * as nodeCwDashboard from "./assets/node-cw-dashboard"
12
+ import * as cw from 'aws-cdk-lib/aws-cloudwatch' ;
13
+ import { SingleNodeConstruct } from "../../constructs/single-node"
14
14
import * as nag from "cdk-nag" ;
15
15
import { SnapshotsS3BucketConstruct } from "../../constructs/snapshots-bucket" ;
16
16
@@ -23,6 +23,7 @@ export interface TzSnapshotNodeStackProps extends cdk.StackProps {
23
23
downloadSnapshot : boolean ;
24
24
snapshotsUrl : string ;
25
25
octezDownloadUri : string ;
26
+ dataVolume : configTypes . TzDataVolumeConfig ;
26
27
}
27
28
28
29
export class TzSnapshotNodeStack extends cdk . Stack {
@@ -32,9 +33,9 @@ export class TzSnapshotNodeStack extends cdk.Stack {
32
33
const REGION = cdk . Stack . of ( this ) . region ;
33
34
const STACK_NAME = cdk . Stack . of ( this ) . stackName ;
34
35
const STACK_ID = cdk . Stack . of ( this ) . stackId ;
35
- const AWS_ACCOUNT_ID = cdk . Stack . of ( this ) . account
36
- const lifecycleHookName = STACK_NAME ;
37
- const autoScalingGroupName = STACK_NAME ;
36
+ const AWS_ACCOUNT_ID = cdk . Stack . of ( this ) . account ;
37
+ const availabilityZones = cdk . Stack . of ( this ) . availabilityZones ;
38
+ const chosenAvailabilityZone = availabilityZones . slice ( 0 , 1 ) [ 0 ] ;
38
39
39
40
const {
40
41
instanceType,
@@ -45,6 +46,7 @@ export class TzSnapshotNodeStack extends cdk.Stack {
45
46
downloadSnapshot,
46
47
snapshotsUrl,
47
48
octezDownloadUri,
49
+ dataVolume,
48
50
} = props ;
49
51
50
52
// using default vpc
@@ -112,68 +114,62 @@ export class TzSnapshotNodeStack extends cdk.Stack {
112
114
actions : [ "s3:ListBucket" , "s3:*Object" , "s3:GetBucket*" ] ,
113
115
} )
114
116
) ;
115
- const snapshotNodeScript = fs . readFileSync ( path . join ( __dirname , "assets" , "user-data" , "node.sh" ) ) . toString ( ) ;
116
117
117
-
118
- const snapshotNode = new ec2 . Instance ( this , "tz-snapshot-node" , {
119
- instanceName : "tz-snapshot-node" ,
120
- instanceType : instanceType ,
118
+ // Setting up the node using generic Sync Node constract
119
+ const node = new SingleNodeConstruct ( this , "sync-node" , {
120
+ instanceName : STACK_NAME ,
121
+ instanceType,
122
+ dataVolumes : [ dataVolume ] ,
121
123
machineImage : new ec2 . AmazonLinux2023ImageSsmParameter ( {
122
124
kernel : ec2 . AmazonLinux2023Kernel . KERNEL_6_1 ,
123
125
cpuType : instanceCpuType ,
124
126
} ) ,
125
- vpc : vpc ,
126
- blockDevices : [
127
- {
128
- // ROOT VOLUME
129
- deviceName : "/dev/xvda" ,
130
- volume : ec2 . BlockDeviceVolume . ebs ( 46 , {
131
- deleteOnTermination : true ,
132
- encrypted : true ,
133
- iops : 3000 ,
134
- volumeType : ec2 . EbsDeviceVolumeType . GP3 ,
135
- } ) ,
136
- } ,
137
- ] ,
138
- detailedMonitoring : true ,
139
- propagateTagsToVolumeOnCreation : true ,
140
- role : snapshotInstanceRole ,
127
+ vpc,
128
+ availabilityZone : chosenAvailabilityZone ,
129
+ role : instanceRole ,
141
130
securityGroup : instanceSG . securityGroup ,
142
- } ) ;
143
-
144
- const modifiedSnapshotNodeScript = cdk . Fn . sub ( snapshotNodeScript , {
145
- _AWS_REGION_ : REGION ,
146
- _STACK_NAME_ : STACK_NAME ,
147
- _TZ_SNAPSHOTS_URI_ : snapshotsUrl ,
148
- _STACK_ID_ : STACK_ID ,
149
- _TZ_HISTORY_MODE_ : historyMode ,
150
- _TZ_DOWNLOAD_SNAPSHOT_ : String ( downloadSnapshot ) ,
151
- _TZ_OCTEZ_DOWNLOAD_URI_ : octezDownloadUri ,
152
- _TZ_NETWORK_ : tzNetwork ,
153
- _S3_SYNC_BUCKET_ : snapshotsBucket . bucketName ,
154
- _NODE_CF_LOGICAL_ID_ : snapshotNode . instance . logicalId ,
155
- _LIFECYCLE_HOOK_NAME_ : lifecycleHookName ,
156
- _AUTOSCALING_GROUP_NAME_ : autoScalingGroupName ,
157
- _ASSETS_S3_PATH_ : `s3://${ asset . s3BucketName } /${ asset . s3ObjectKey } ` ,
158
- _INSTANCE_TYPE_ : "SNAPSHOT" ,
159
- } ) ;
160
-
161
- snapshotNode . addUserData ( modifiedSnapshotNodeScript ) ;
162
-
163
-
164
- // Getting logical ID of the instance to send ready signal later once the instance is initialized
165
- const snapshotNodeCfn = snapshotNode . node . defaultChild as ec2 . CfnInstance ;
166
-
167
- // CloudFormation Config: wait for 15 min for the node to start
168
- const creationPolicy : cdk . CfnCreationPolicy = {
169
- resourceSignal : {
170
- count : 1 ,
171
- timeout : "PT90M" ,
131
+ vpcSubnets : {
132
+ subnetType : ec2 . SubnetType . PUBLIC ,
172
133
} ,
173
- } ;
174
-
175
-
176
- snapshotNodeCfn . cfnOptions . creationPolicy = creationPolicy ;
134
+ } ) ;
135
+
136
+ // Parsing user data script and injecting necessary variables
137
+ const userData = fs . readFileSync ( path . join ( __dirname , "assets" , "user-data" , "node.sh" ) ) . toString ( ) ;
138
+ const modifiedUserData = cdk . Fn . sub ( userData , {
139
+ _AWS_REGION_ : REGION ,
140
+ _ASSETS_S3_PATH_ : `s3://${ asset . s3BucketName } /${ asset . s3ObjectKey } ` ,
141
+ _STACK_NAME_ : STACK_NAME ,
142
+ _TZ_SNAPSHOTS_URI_ : snapshotsUrl ,
143
+ _STACK_ID_ : STACK_ID ,
144
+ _NODE_CF_LOGICAL_ID_ : node . nodeCFLogicalId ,
145
+ _TZ_HISTORY_MODE_ : historyMode ,
146
+ _TZ_DOWNLOAD_SNAPSHOT_ : String ( downloadSnapshot ) ,
147
+ _TZ_OCTEZ_DOWNLOAD_URI_ : octezDownloadUri ,
148
+ _TZ_NETWORK_ : tzNetwork ,
149
+ _LIFECYCLE_HOOK_NAME_ : constants . NoneValue ,
150
+ _AUTOSCALING_GROUP_NAME_ : constants . NoneValue ,
151
+ _INSTANCE_TYPE_ : "SNAPSHOT" ,
152
+ _S3_SYNC_BUCKET_ : snapshotsBucket . bucketName ,
153
+ } ) ;
154
+
155
+ // Adding modified userdata script to the instance prepared fro us by Single Node constract
156
+ node . instance . addUserData ( modifiedUserData ) ;
157
+
158
+ // Adding CloudWatch dashboard to the node
159
+ const dashboardString = cdk . Fn . sub ( JSON . stringify ( nodeCwDashboard . SyncNodeCWDashboardJSON ) , {
160
+ INSTANCE_ID :node . instanceId ,
161
+ INSTANCE_NAME : STACK_NAME ,
162
+ REGION : REGION ,
163
+ } )
164
+
165
+ new cw . CfnDashboard ( this , 'sync-cw-dashboard' , {
166
+ dashboardName : `${ STACK_NAME } -${ node . instanceId } ` ,
167
+ dashboardBody : dashboardString ,
168
+ } ) ;
169
+
170
+ new cdk . CfnOutput ( this , "sync-instance-id" , {
171
+ value : node . instanceId ,
172
+ } ) ;
177
173
178
174
new cdk . CfnOutput ( this , "TezosSnapshotBucket" , {
179
175
value : snapshotsBucket . bucketName ,
0 commit comments