Terraform AWS & EMR 运行:VPC 销毁问题
Terraform AWS & EMR run : VPC destruction issue
我有一个部署 VPC、存储桶、lambda 和数据库的 Terraform 项目。
我的一个 lambda 使用 boto3 Python 库创建了一个 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 吗?你有什么建议?
干杯
在构建与其他组件交互的 Terraform 时(例如使用直接 API 调用,或另一个 Terraform 运行 与 terraform_remote_state 共享信息),您必须了解依赖关系不同组件之间。确定分离属于何处是一门艺术,就像编写其他类型的软件一样。
在documentation for run_job_flow(**kwargs)中,您似乎可以传入几种类型的安全组:
'EmrManagedMasterSecurityGroup': 'string',
'EmrManagedSlaveSecurityGroup': 'string',
'ServiceAccessSecurityGroup': 'string',
'AdditionalMasterSecurityGroups': [
'string',
],
'AdditionalSlaveSecurityGroups': [
'string',
]
我不确定现在是如何为您创建这些安全组的(文档没有提到创建临时安全组,奇怪的是,如果他们这样做了,那么他们之后就会闲逛),但是在 Terraform 中完成所有网络,然后 output those IDs for consumption by your Lambda. This is the method Krishna 提到似乎合乎逻辑。
我喜欢这个,因为它将网络基础设施封装在 1 个地方 (Terraform),并且明确 inputs/outputs 代码使用该资源(您的 run_job_flow
Lambda)。
似乎不需要创建临时安全组,但如果您这样做了,我会 create/destroy 在您现有代码周围的 boto 中创建它们。这取决于您认为安全组是网络基础设施的一部分,还是工作的一部分。那应该指导你create/destroy他们。
我有一个部署 VPC、存储桶、lambda 和数据库的 Terraform 项目。 我的一个 lambda 使用 boto3 Python 库创建了一个 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 吗?你有什么建议?
干杯
在构建与其他组件交互的 Terraform 时(例如使用直接 API 调用,或另一个 Terraform 运行 与 terraform_remote_state 共享信息),您必须了解依赖关系不同组件之间。确定分离属于何处是一门艺术,就像编写其他类型的软件一样。
在documentation for run_job_flow(**kwargs)中,您似乎可以传入几种类型的安全组:
'EmrManagedMasterSecurityGroup': 'string',
'EmrManagedSlaveSecurityGroup': 'string',
'ServiceAccessSecurityGroup': 'string',
'AdditionalMasterSecurityGroups': [
'string',
],
'AdditionalSlaveSecurityGroups': [
'string',
]
我不确定现在是如何为您创建这些安全组的(文档没有提到创建临时安全组,奇怪的是,如果他们这样做了,那么他们之后就会闲逛),但是在 Terraform 中完成所有网络,然后 output those IDs for consumption by your Lambda. This is the method Krishna 提到似乎合乎逻辑。
我喜欢这个,因为它将网络基础设施封装在 1 个地方 (Terraform),并且明确 inputs/outputs 代码使用该资源(您的 run_job_flow
Lambda)。
似乎不需要创建临时安全组,但如果您这样做了,我会 create/destroy 在您现有代码周围的 boto 中创建它们。这取决于您认为安全组是网络基础设施的一部分,还是工作的一部分。那应该指导你create/destroy他们。