| 14 | |
| 15 | |
| 16 | class EC2InstanceStack(Stack): |
| 17 | |
| 18 | def __init__(self, scope: Construct, id: str, **kwargs) -> None: |
| 19 | super().__init__(scope, id, **kwargs) |
| 20 | |
| 21 | # VPC |
| 22 | vpc = ec2.Vpc(self, "VPC", |
| 23 | nat_gateways=0, |
| 24 | subnet_configuration=[ec2.SubnetConfiguration(name="public",subnet_type=ec2.SubnetType.PUBLIC)] |
| 25 | ) |
| 26 | |
| 27 | # AMI |
| 28 | amzn_linux = ec2.MachineImage.latest_amazon_linux( |
| 29 | generation=ec2.AmazonLinuxGeneration.AMAZON_LINUX_2, |
| 30 | edition=ec2.AmazonLinuxEdition.STANDARD, |
| 31 | virtualization=ec2.AmazonLinuxVirt.HVM, |
| 32 | storage=ec2.AmazonLinuxStorage.GENERAL_PURPOSE |
| 33 | ) |
| 34 | |
| 35 | # Instance Role and SSM Managed Policy |
| 36 | role = iam.Role(self, "InstanceSSM", assumed_by=iam.ServicePrincipal("ec2.amazonaws.com")) |
| 37 | |
| 38 | role.add_managed_policy(iam.ManagedPolicy.from_aws_managed_policy_name("AmazonSSMManagedInstanceCore")) |
| 39 | |
| 40 | # Instance |
| 41 | instance = ec2.Instance(self, "Instance", |
| 42 | instance_type=ec2.InstanceType("t3.nano"), |
| 43 | machine_image=amzn_linux, |
| 44 | vpc = vpc, |
| 45 | role = role |
| 46 | ) |
| 47 | |
| 48 | # Script in S3 as Asset |
| 49 | asset = Asset(self, "Asset", path=os.path.join(dirname, "configure.sh")) |
| 50 | local_path = instance.user_data.add_s3_download_command( |
| 51 | bucket=asset.bucket, |
| 52 | bucket_key=asset.s3_object_key |
| 53 | ) |
| 54 | |
| 55 | # Userdata executes script from S3 |
| 56 | instance.user_data.add_execute_file_command( |
| 57 | file_path=local_path |
| 58 | ) |
| 59 | asset.grant_read(instance.role) |
| 60 | |
| 61 | app = App() |
| 62 | EC2InstanceStack(app, "ec2-instance") |