Skip to content

Commit 17b73f3

Browse files
committed
create setup_AWS.py
1 parent f150def commit 17b73f3

1 file changed

Lines changed: 169 additions & 0 deletions

File tree

‎setup_AWS.py‎

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
import sys
2+
import boto3
3+
import json
4+
5+
iam = boto3.client("iam")
6+
sns = boto3.client("sns")
7+
lmbda = boto3.client("lambda")
8+
9+
ecsInstanceRole_policy_list = [
10+
"arn:aws:iam::aws:policy/AmazonS3FullAccess",
11+
"arn:aws:iam::aws:policy/CloudWatchFullAccess",
12+
"arn:aws:iam::aws:policy/CloudWatchActionsEC2Access",
13+
"arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceforEC2Role",
14+
"arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceRole",
15+
]
16+
LambdaFullAccess_policy_list = [
17+
"arn:aws:iam::aws:policy/AWSLambda_FullAccess",
18+
"arn:aws:iam::aws:policy/AmazonSNSFullAccess",
19+
"arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole",
20+
"arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole",
21+
"arn:aws:iam::aws:policy/AWSLambdaExecute",
22+
"arn:aws:iam::aws:policy/AmazonECS_FullAccess",
23+
"arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole",
24+
"arn:aws:iam::aws:policy/AmazonS3FullAccess",
25+
"arn:aws:iam::aws:policy/AmazonSQSFullAccess",
26+
]
27+
28+
29+
def setup():
30+
# Create ECS Instance Role
31+
assume_role_policy_document = json.dumps(
32+
{
33+
"Version": "2008-10-17",
34+
"Statement": [
35+
{
36+
"Sid": "",
37+
"Effect": "Allow",
38+
"Principal": {"Service": "ec2.amazonaws.com"},
39+
"Action": "sts:AssumeRole",
40+
}
41+
],
42+
}
43+
)
44+
iam.create_role(
45+
RoleName="ecsInstanceRole",
46+
AssumeRolePolicyDocument=assume_role_policy_document,
47+
)
48+
for arn in ecsInstanceRole_policy_list:
49+
iam.attach_role_policy(
50+
PolicyArn=arn,
51+
RoleName="ecsInstanceRole",
52+
)
53+
54+
# Create EC2 Spot Fleet Tagging Role
55+
assume_role_policy_document = json.dumps(
56+
{
57+
"Version": "2012-10-17",
58+
"Statement": [
59+
{
60+
"Sid": "",
61+
"Effect": "Allow",
62+
"Principal": {"Service": "spotfleet.amazonaws.com"},
63+
"Action": "sts:AssumeRole",
64+
}
65+
],
66+
}
67+
)
68+
iam.create_role(
69+
RoleName="aws-ec2-spot-fleet-tagging-role",
70+
AssumeRolePolicyDocument=assume_role_policy_document,
71+
)
72+
iam.attach_role_policy(
73+
PolicyArn="arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole",
74+
RoleName="aws-ec2-spot-fleet-tagging-role",
75+
)
76+
77+
# Create Lambda Full Access Role
78+
assume_role_policy_document = json.dumps(
79+
{
80+
"Version": "2012-10-17",
81+
"Statement": [
82+
{
83+
"Sid": "",
84+
"Effect": "Allow",
85+
"Principal": {"Service": "lambda.amazonaws.com"},
86+
"Action": "sts:AssumeRole",
87+
}
88+
],
89+
}
90+
)
91+
iam.create_role(
92+
RoleName="LambdaFullAccess",
93+
AssumeRolePolicyDocument=assume_role_policy_document,
94+
)
95+
for arn in LambdaFullAccess_policy_list:
96+
iam.attach_role_policy(
97+
PolicyArn=arn,
98+
RoleName="LambdaFullAccess",
99+
)
100+
101+
# Create SNS Monitor topic
102+
MonitorTopic = sns.create_topic(Name="Monitor")
103+
104+
# Create Monitor Lambda function
105+
LambdaFullAccess = iam.get_role(RoleName="LambdaFullAccess")
106+
107+
fxn = open("lambda_function.zip", "rb").read()
108+
109+
MonitorFunction = lmbda.create_function(
110+
FunctionName="Monitor",
111+
Runtime="python3.9",
112+
Role=LambdaFullAccess["Role"]["Arn"],
113+
Handler="lambda_function.lambda_handler",
114+
Code={
115+
"ZipFile": fxn,
116+
},
117+
Description="Auto-monitor DS runs",
118+
Timeout=900,
119+
MemorySize=3008,
120+
Publish=True,
121+
PackageType="Zip",
122+
TracingConfig={"Mode": "PassThrough"},
123+
Architectures=["x86_64"],
124+
EphemeralStorage={"Size": 512},
125+
SnapStart={"ApplyOn": "None"},
126+
)
127+
128+
# Subscribe Monitor Lambda to Monitor Topic
129+
sns.subscribe(
130+
TopicArn=MonitorTopic["TopicArn"],
131+
Protocol="lambda",
132+
Endpoint=MonitorFunction["FunctionArn"],
133+
)
134+
135+
136+
def destroy():
137+
# Delete roles
138+
for arn in ecsInstanceRole_policy_list:
139+
iam.detach_role_policy(RoleName="ecsInstanceRole", PolicyArn=arn)
140+
iam.delete_role(RoleName="ecsInstanceRole")
141+
142+
iam.detach_role_policy(
143+
RoleName="aws-ec2-spot-fleet-tagging-role",
144+
PolicyArn="arn:aws:iam::aws:policy/service-role/AmazonEC2SpotFleetTaggingRole",
145+
)
146+
iam.delete_role(RoleName="aws-ec2-spot-fleet-tagging-role")
147+
148+
for arn in LambdaFullAccess_policy_list:
149+
iam.detach_role_policy(RoleName="LambdaFullAccess", PolicyArn=arn)
150+
iam.delete_role(RoleName="LambdaFullAccess")
151+
152+
# Delete Monitor Lambda function
153+
lmbda.delete_function(FunctionName="MonitorTEST")
154+
155+
# Delete Monitor SNS topic
156+
# create_topic is idempotent so we use it to return ARN since topic already exists
157+
MonitorTopic = sns.create_topic(Name="Monitor")
158+
sns.delete_topic(TopicArn=MonitorTopic["TopicArn"])
159+
160+
161+
if __name__ == "__main__":
162+
if len(sys.argv) == 1:
163+
setup()
164+
else:
165+
if sys.argv[1] == "destroy":
166+
destroy()
167+
else:
168+
print("Use: setup_AWS.py or setup_AWS.py destroy")
169+
sys.exit()

0 commit comments

Comments
 (0)