我有一个Terraform项目,部署VPC,存储桶,lambda和数据库。 我的一个lambda使用boto3 Python lib创建了一个EMR集群。
s3 = boto3.client('s3')
session = boto3.session.Session()
client = session.client('emr', region_name=os.environ['region'])
job_id = client.run_job_flow(
Name=os.environ['emr_name'],
LogUri=os.environ['log_dir'],
Instances={
'MasterInstanceType': os.environ['master_instance'],
'SlaveInstanceType': os.environ['slave_instance'],
'InstanceCount': int(os.environ['slave_instances_count']),
'Ec2SubnetId': os.environ['ec2_subnet_id']
},
ReleaseLabel='emr-5.13.0',
Applications = [
{'Name': 'Hadoop'},
{'Name': 'Hive'},
{'Name': 'Spark'}
],
Steps=[
my steps...
],
BootstrapActions=[
...
],
ServiceRole='EMR_DefaultRole',
JobFlowRole='EMR_EC2_DefaultRole',
VisibleToAllUsers=True
)
一切顺利,我很满意。
但是当我选择terraform destroy
命令时,它无法删除创建的VPC Terraform(超时失败)。
我想这是因为为EMR运行创建了2个安全组。 Terraform不知道它们因此无法删除VPC,因为2 SG在此VPC中。
看一下AWS Web控制台,我可以看到2 SG:
sg-xxxxxxx
ElasticMapReduce-slave
eouti-vpc
Slave group for Elastic MapReduce created on <date>
sg-xxxxxxx
ElasticMapReduce-master
eouti-vpc
Master group for Elastic MapReduce created on <date>
我该如何解决? Terraform应该创建这些SG吗?你有什么建议吗?
干杯
答案 0 :(得分:1)
在构建与其他组件接口的Terraform时(例如使用直接API调用或其他Terraform与terraform_remote_state运行共享信息),您必须了解不同组件之间的依赖关系。确定分离所属的是一门艺术,就像编写其他类型的软件一样。
在documentation for run_job_flow(**kwargs)中,您可以传递几种类型的安全组:
'EmrManagedMasterSecurityGroup': 'string',
'EmrManagedSlaveSecurityGroup': 'string',
'ServiceAccessSecurityGroup': 'string',
'AdditionalMasterSecurityGroups': [
'string',
],
'AdditionalSlaveSecurityGroups': [
'string',
]
我现在不确定如何为您创建这些安全组(文档不提及创建临时安全组,如果他们这样做,那么他们会留下奇怪的意思之后会徘徊),但在Terraform中完成所有网络,然后output这些ID供Lambda使用似乎合乎逻辑。这是Krishna提到的方法。
我喜欢这个,因为它将网络基础设施封装在一个地方(Terraform),并且对使用该资源的代码(您的run_job_flow
Lambda)有明确的输入/输出。
似乎没有必要创建临时安全组,但如果你这样做,我会在现有代码周围创建/销毁它们。这取决于您是否认为安全组是网络基础结构的一部分,或者是作业的一部分。这应该指导您创建/销毁它们的位置。