Terraform 0.11

aws_emr_cluster




terraform

aws_emr_cluster

एक लोचदार MapReduce क्लस्टर प्रदान करता है, एक वेब सेवा जो कुशलतापूर्वक बड़ी मात्रा में डेटा को संसाधित करना आसान बनाती है। अधिक जानकारी के लिए Amazon Elastic MapReduce प्रलेखन देखें।

उदाहरण उपयोग

resource "aws_emr_cluster" "emr-test-cluster" {
  name          = "emr-test-arn"
  release_label = "emr-4.6.0"
  applications  = ["Spark"]
  additional_info = <<EOF
{
  "instanceAwsClientConfiguration": {
    "proxyPort": 8099,
    "proxyHost": "myproxy.example.com"
  }
}
EOF

  termination_protection = false
  keep_job_flow_alive_when_no_steps = true

  ec2_attributes {
    subnet_id                         = "${aws_subnet.main.id}"
    emr_managed_master_security_group = "${aws_security_group.sg.id}"
    emr_managed_slave_security_group  = "${aws_security_group.sg.id}"
    instance_profile                  = "${aws_iam_instance_profile.emr_profile.arn}"
  }

  instance_group {
      instance_role = "CORE"
      instance_type = "c4.large"
      instance_count = "1"
      ebs_config {
        size = "40"
        type = "gp2"
        volumes_per_instance = 1
      }
      bid_price = "0.30"
      autoscaling_policy = <<EOF
{
"Constraints": {
  "MinCapacity": 1,
  "MaxCapacity": 2
},
"Rules": [
  {
    "Name": "ScaleOutMemoryPercentage",
    "Description": "Scale out if YARNMemoryAvailablePercentage is less than 15",
    "Action": {
      "SimpleScalingPolicyConfiguration": {
        "AdjustmentType": "CHANGE_IN_CAPACITY",
        "ScalingAdjustment": 1,
        "CoolDown": 300
      }
    },
    "Trigger": {
      "CloudWatchAlarmDefinition": {
        "ComparisonOperator": "LESS_THAN",
        "EvaluationPeriods": 1,
        "MetricName": "YARNMemoryAvailablePercentage",
        "Namespace": "AWS/ElasticMapReduce",
        "Period": 300,
        "Statistic": "AVERAGE",
        "Threshold": 15.0,
        "Unit": "PERCENT"
      }
    }
  }
]
}
EOF
}
  ebs_root_volume_size     = 100

  master_instance_type = "m3.xlarge"
  core_instance_type   = "m3.xlarge"
  core_instance_count  = 1

  tags {
    role     = "rolename"
    env      = "env"
  }

  bootstrap_action {
    path = "s3://elasticmapreduce/bootstrap-actions/run-if"
    name = "runif"
    args = ["instance.isMaster=true", "echo running on master node"]
  }

  configurations = "test-fixtures/emr_configurations.json"

  service_role = "${aws_iam_role.iam_emr_service_role.arn}"
}

aws_emr_cluster संसाधन को आम तौर पर दो IAM भूमिकाओं की आवश्यकता होती है, एक EMR क्लस्टर के लिए एक सेवा के रूप में उपयोग करने के लिए, और दूसरा उन उदाहरणों से AWS के साथ बातचीत करने के लिए आपके क्लस्टर इंस्टेंस पर रखने के लिए। EMR सेवा के लिए सुझाई गई भूमिका नीति टेम्पलेट AmazonElasticMapReduceRole और EC2 प्रोफ़ाइल के लिए AmazonElasticMapReduceforEC2Role । इन IAM भूमिकाओं के बारे में अधिक जानकारी के लिए प्रारंभ करना मार्गदर्शिका देखें। इस पृष्ठ के निचले भाग में एक पूरी तरह से बूट करने योग्य उदाहरण टेराफ़ॉर्म कॉन्फ़िगरेशन भी है।

डीबग लॉगिंग सक्षम करें

ईएमआर में डिबग लॉगिंग एक कदम के रूप में लागू किया जाता है। यह टेराफॉर्म के बाहर अन्य चरणों को प्रबंधित किया जा रहा है, तो ignore_changes साथ जीवनचक्र विन्यास ब्लॉक का उपयोग करने के लिए अत्यधिक अनुशंसित है।

resource "aws_emr_cluster" "example" {
  # ... other configuration ...

  step {
    action = "TERMINATE_CLUSTER"
    name   = "Setup Hadoop Debugging"

    hadoop_jar_step {
      jar  = "command-runner.jar"
      args = ["state-pusher-script"]
    }
  }

  # Optional: ignore outside changes to running cluster steps
  lifecycle {
    ignore_changes = ["step"]
  }
}

तर्क संदर्भ

निम्नलिखित तर्क समर्थित हैं:

  • name - (आवश्यक) नौकरी का नाम
  • release_label - (आवश्यक) अमेज़न EMR रिलीज़ के लिए रिलीज़ लेबल
  • master_instance_type - (वैकल्पिक) मास्टर नोड का EC2 उदाहरण प्रकार। निश्चित रूप से एक master_instance_type और master_instance_type को निर्दिष्ट किया जाना चाहिए।
  • scale_down_behavior - (वैकल्पिक) जिस तरह से व्यक्तिगत अमेज़न EC2 उदाहरण तब समाप्त होता है जब एक स्वचालित पैमाने पर गतिविधि होती है या एक instance group का आकार बदला जाता है।
  • additional_info - (वैकल्पिक) प्रॉक्सी जानकारी जोड़ने जैसे अतिरिक्त सुविधाओं के चयन के लिए एक JSON स्ट्रिंग। नोट: वर्तमान में प्रदाता से EMR क्लस्टर निर्माण के बाद इस तर्क का मान प्राप्त करने के लिए कोई API नहीं है, इसलिए Terraform वास्तविक EMR क्लस्टर से बहाव का पता नहीं लगा सकता है यदि इसका मान Terraform के बाहर बदला गया है।
  • service_role - (आवश्यक) IAM भूमिका जो AWS संसाधनों तक पहुँचने के लिए Amazon EMR सेवा द्वारा ग्रहण की जाएगी
  • security_configuration - (वैकल्पिक) EMR क्लस्टर में संलग्न करने के लिए सुरक्षा कॉन्फ़िगरेशन नाम। केवल रिलीज़_लब 4.8.0 या उससे अधिक ईएमआर समूहों के लिए मान्य है
  • core_instance_type - (वैकल्पिक) EC2 उदाहरण दास नोड्स का प्रकार। यह निर्दिष्ट नहीं किया जा सकता है कि instance_groups सेट है या नहीं
  • core_instance_count - (वैकल्पिक) नौकरी के प्रवाह को निष्पादित करने के लिए अमेज़ॅन EC2 उदाहरणों की संख्या। EMR क्लस्टर के मास्टर नोड के रूप में एक नोड का उपयोग करेगा और शेष नोड्स ( core_instance_count -1) को कोर नोड के रूप में उपयोग करेगा। यह निर्दिष्ट नहीं किया जा सकता है कि instance_groups सेट है या नहीं। डिफ़ॉल्ट 1
  • instance_group - (वैकल्पिक) क्लस्टर में प्रत्येक आवृत्ति समूह के लिए instance_group ऑब्जेक्ट्स की एक सूची। निश्चित रूप से एक master_instance_type और master_instance_type को निर्दिष्ट किया जाना चाहिए। अगर instance_group सेट है, तो इसमें कम से कम MASTER उदाहरण समूह प्रकार (साथ ही किसी भी अतिरिक्त रेटिंग) के लिए कॉन्फ़िगरेशन ब्लॉक होना चाहिए। नीचे परिभाषित किया गया
  • log_uri - (वैकल्पिक) S3 बाल्टी नौकरी प्रवाह की लॉग फ़ाइलों को लिखने के लिए। यदि कोई मान प्रदान नहीं किया जाता है, तो लॉग नहीं बनाए जाते हैं
  • applications - (वैकल्पिक) क्लस्टर के लिए आवेदनों की एक सूची। मान्य मूल्य हैं: Flink , Flink , Hive , Flink , Pig , और Spark । असंवेदनशील मामला
  • termination_protection - (ऑप्शनल) स्विच ऑन / ऑफ टर्मिनेशन प्रोटेक्शन (डिफ़ॉल्ट बंद है)
  • keep_job_flow_alive_when_no_steps - (वैकल्पिक) बिना किसी चरण या सभी चरणों के पूर्ण होने पर / बंद रन क्लस्टर पर स्विच करें (डिफ़ॉल्ट चालू है)
  • ec2_attributes - (वैकल्पिक) EC2 उदाहरणों के लिए कार्य प्रवाह का ec2_attributes । नीचे परिभाषित किया गया
  • kerberos_attributes - (वैकल्पिक) क्लस्टर के लिए Kerberos कॉन्फ़िगरेशन। नीचे परिभाषित किया गया
  • ebs_root_volume_size - (वैकल्पिक) का आकार Linux के AMI के EBS रूट डिवाइस वॉल्यूम के GiB में है जो प्रत्येक EC2 उदाहरण के लिए उपयोग किया जाता है। अमेज़न ईएमआर संस्करण 4.x और बाद में उपलब्ध है।
  • custom_ami_id - (वैकल्पिक) क्लस्टर के लिए एक कस्टम अमेज़ॅन लिनक्स AMI (EMR के स्वामित्व वाले AMI के बजाय)। अमेज़न ईएमआर संस्करण 5.7.0 और बाद में उपलब्ध है।
  • bootstrap_action - (वैकल्पिक) बूटस्ट्रैप क्रियाओं की सूची, जो कि क्लस्टर नोड्स पर हडोप शुरू होने से पहले चलाई जाएगी। नीचे परिभाषित किया गया
  • configurations - (वैकल्पिक) आपके द्वारा बनाए जा रहे EMR क्लस्टर के लिए आपूर्ति किए गए कॉन्फ़िगरेशन की सूची
  • visible_to_all_users - (वैकल्पिक) नौकरी प्रवाह के साथ जुड़े AWS खाते के सभी IAM उपयोगकर्ताओं को नौकरी का प्रवाह दिखाई देता है या नहीं। डिफ़ॉल्ट true
  • autoscaling_role - (वैकल्पिक) स्वचालित स्केलिंग नीतियों के लिए एक IAM भूमिका। IAM भूमिका अनुमतियाँ प्रदान करती है कि स्वचालित स्केलिंग सुविधा को इंस्टेंस समूह में EC2 इंस्टेंसेस को लॉन्च करने और समाप्त करने की आवश्यकता होती है।
  • step - (वैकल्पिक) क्लस्टर बनाते समय चलाने के लिए चरणों की सूची। नीचे परिभाषित किया गया। यह टेराफॉर्म के बाहर अन्य चरणों को प्रबंधित किया जा रहा है, तो ignore_changes साथ जीवनचक्र विन्यास ब्लॉक का उपयोग करने के लिए अत्यधिक अनुशंसित है।
  • tags - (वैकल्पिक) EMR क्लस्टर पर लागू होने वाले टैग की सूची

ec2_attributes

अमेज़ॅन EC2 के उदाहरणों में नौकरी के प्रवाह को चलाने के गुण हैं

  • key_name - (वैकल्पिक) अमेज़ॅन EC2 कुंजी जोड़ी जिसका उपयोग मास्टर नोड के लिए ssh के रूप में किया जा सकता है जिसे उपयोगकर्ता ने hadoop कहा है
  • subnet_id - (वैकल्पिक) subnet_id सबनेट आईडी जहां आप नौकरी के प्रवाह को लॉन्च करना चाहते हैं। अमेज़ॅन VPC में लॉन्च किए गए नौकरी प्रवाह के नोड्स के लिए cc1.4xlarge उदाहरण प्रकार निर्दिष्ट नहीं कर सकता
  • additional_master_security_groups - (वैकल्पिक) मास्टर नोड के लिए अतिरिक्त अमेज़ॅन EC2 सुरक्षा समूह आईडी की अल्पविराम से अलग सूची वाली स्ट्रिंग
  • additional_slave_security_groups slave_security_groups - (वैकल्पिक) अल्पविराम द्वारा अलग स्ट्रिंग के रूप में दास अमेज़न के लिए अतिरिक्त अमेज़न EC2 सुरक्षा समूह आईडी की अल्पविराम से पृथक सूची वाली स्ट्रिंग
  • emr_managed_master_security_group - (वैकल्पिक) मास्टर नोड के लिए Amazon EC2 EMR-प्रबंधित सुरक्षा समूह का पहचानकर्ता
  • emr_managed_slave_security_group - (वैकल्पिक) अमेज़ॅन EC2 EMR- प्रबंधित सुरक्षा समूह के दास नोड्स के लिए पहचानकर्ता
  • service_access_security_group - (वैकल्पिक) अमेज़ॅन EC2 सेवा-पहुंच सुरक्षा समूह की पहचानकर्ता - जब क्लस्टर एक निजी सबनेट पर चलता है
  • instance_profile - (आवश्यक) क्लस्टर के EC2 उदाहरणों के लिए इंस्टेंस प्रोफ़ाइल इस भूमिका को मानती है

kerberos_attributes

Kerberos कॉन्फ़िगरेशन के लिए विशेषताएँ

  • ad_domain_join_password - (वैकल्पिक) ad_domain_join_user लिए सक्रिय निर्देशिका पासवर्ड
  • ad_domain_join_user - (वैकल्पिक) सक्रिय निर्देशिका डोमेन के साथ क्रॉस- ad_domain_join_user ट्रस्ट स्थापित करते समय केवल आवश्यक है। डोमेन में संसाधनों को जोड़ने के लिए पर्याप्त विशेषाधिकार वाला उपयोगकर्ता।
  • cross_realm_trust_principal_password - (वैकल्पिक) एक अलग क्षेत्र में cross_realm_trust_principal_password साथ क्रॉस- cross_realm_trust_principal_password ट्रस्ट स्थापित करते समय केवल आवश्यक है। क्रॉस-रियलम प्रिंसिपल पासवर्ड, जो सभी स्थानों पर समान होना चाहिए।
  • kdc_admin_password - (आवश्यक) क्लस्टर-समर्पित KDC पर kadmin सेवा के लिए क्लस्टर के भीतर उपयोग किया जाने वाला पासवर्ड, जो Kerberos रियासतों, पासवर्ड नीतियों, और क्लस्टर के लिए कुंजीटैब्स को बनाए रखता है।
  • realm - (आवश्यक) Kerberos क्षेत्र का नाम जिसमें सभी नोड एक क्लस्टर से संबंधित हैं। उदाहरण के लिए, EC2.INTERNAL

instance_group

क्लस्टर में प्रत्येक कार्य आवृत्ति समूह के लिए विशेषताएँ

  • instance_role - (आवश्यक) क्लस्टर में उदाहरण समूह की भूमिका। मान्य मान हैं: MASTER , CORE और TASK
  • instance_type - (आवश्यक) उदाहरण समूह में सभी उदाहरणों के लिए EC2 उदाहरण प्रकार
  • instance_count - (वैकल्पिक) उदाहरण समूह के लिए उदाहरणों की लक्ष्य संख्या
  • name - (वैकल्पिक) उदाहरण समूह को दिया गया दोस्ताना नाम
  • bid_price - (वैकल्पिक) यदि सेट किया जाता है, तो उदाहरण के समूह में प्रत्येक EC2 उदाहरण के लिए बोली मूल्य USD में व्यक्त किया जाता है। इस विशेषता को सेट करके, उदाहरण समूह को स्पॉट इंस्टेंस के रूप में घोषित किया जा रहा है, और स्पष्ट रूप से स्पॉट अनुरोध बनाएगा। ऑन-डिमांड इंस्टेंस का उपयोग करने के लिए इस रिक्त को छोड़ दें। bid_price उदाहरण समूह के लिए bid_price सेट नहीं किया जा सकता है, क्योंकि उस समूह को हमेशा ऑन-डिमांड होना चाहिए
  • ebs_config - (वैकल्पिक) उदाहरण समूह में प्रत्येक उदाहरण से जुड़े EBS संस्करणों के लिए विशेषताओं की एक सूची। प्रत्येक ebs_config परिभाषित अतिरिक्त ईबीएस मात्रा उदाहरण समूह में प्रत्येक उदाहरण से जुड़ा होने के परिणामस्वरूप होगा। नीचे परिभाषित किया गया
  • autoscaling_policy - (वैकल्पिक) autoscaling नीति दस्तावेज़। यह एक JSON स्वरूपित स्ट्रिंग है। EMR ऑटो स्केलिंग देखें

ebs_config

Inst_group में प्रत्येक EC2 उदाहरण से जुड़ी EBS वॉल्यूम के लिए विशेषताएँ

  • size - (आवश्यक) गिबिबाइट्स (GiB) में आयतन का आकार।
  • type - (आवश्यक) मात्रा प्रकार। वैध विकल्प gp2 , io1 और standard
  • iops - (वैकल्पिक) iops / ओ संचालन की संख्या प्रति सेकंड (IOPS) जो वॉल्यूम का समर्थन करती है
  • volumes_per_instance - (वैकल्पिक) उदाहरण समूह में प्रत्येक EC2 उदाहरण के लिए संलग्न करने के लिए इस कॉन्फ़िगरेशन के साथ ईबीएस संस्करणों की संख्या (डिफ़ॉल्ट 1 है)

bootstrap_action

  • name - (आवश्यक) बूटस्ट्रैप कार्रवाई का नाम
  • path - (आवश्यक) बूटस्ट्रैप कार्रवाई के दौरान चलाने के लिए स्क्रिप्ट का स्थान। अमेज़ॅन S3 में या तो स्थानीय स्थान पर या स्थानीय फ़ाइल सिस्टम पर हो सकता है
  • args - (वैकल्पिक) बूटस्ट्रैप एक्शन स्क्रिप्ट को पास करने के लिए कमांड लाइन तर्कों की सूची

कदम

चरण विन्यास के लिए विशेषताएँ

  • action_on_failure - (आवश्यक) यदि चरण विफल रहता है तो कार्रवाई करने के लिए। मान्य मान: TERMINATE_JOB_FLOW , TERMINATE_CLUSTER , CANCEL_AND_WAIT और CONTINUE
  • hadoop_jar_step - (आवश्यक) चरण के लिए उपयोग की गई JAR फ़ाइल। नीचे परिभाषित किया गया।
  • name - (आवश्यक) चरण का नाम।

hadoop_jar_step

Hadoop नौकरी चरण विन्यास के लिए विशेषताएँ

  • args - (वैकल्पिक) कमांड लाइन के तर्कों की सूची जब निष्पादित की गई JAR फ़ाइल के मुख्य कार्य में पास हो गई।
  • jar - (आवश्यक) कदम के दौरान एक जार फ़ाइल चलाने के लिए पथ।
  • main_class - (वैकल्पिक) निर्दिष्ट जावा फ़ाइल में मुख्य वर्ग का नाम। यदि निर्दिष्ट नहीं है, तो JAR फ़ाइल को अपनी प्रकट फ़ाइल में एक मुख्य-वर्ग निर्दिष्ट करना चाहिए।
  • properties - (वैकल्पिक) जावा गुणों का कुंजी-मान मानचित्र जो चरण के चलने पर सेट किया जाता है। आप इन गुणों का उपयोग करके मुख्य मूल्य जोड़े को अपने मुख्य कार्य में पास कर सकते हैं।

संदर्भ संदर्भित करता है

उपरोक्त सभी तर्कों के अलावा, निम्नलिखित विशेषताएँ निर्यात की जाती हैं:

  • id - ईएमआर क्लस्टर की आईडी
  • name - क्लस्टर का नाम।
  • release_label - Amazon EMR रिलीज़ के लिए रिलीज़ लेबल।
  • master_instance_type - मास्टर नोड का EC2 उदाहरण प्रकार।
  • master_public_dns - सार्वजनिक EC2 उदाहरण मास्टर DNS नाम।
  • core_instance_type - दास नोड्स का EC2 उदाहरण प्रकार।
  • core_instance_count दास नोड्स की संख्या, अर्थात EC2 उदाहरण नोड्स।
  • log_uri - अमेज़ॅन S3 स्थान का पथ जहां इस क्लस्टर के लिए लॉग संग्रहीत हैं।
  • applications - इस क्लस्टर पर इंस्टॉल किए गए एप्लिकेशन।
  • ec2_attributes - श्रेणी के आधार पर समूह में EC2 उदाहरणों के बारे में जानकारी प्रदान करता है: कुंजी नाम, सबनेट आईडी, IAM उदाहरण प्रोफ़ाइल, और इसी तरह।
  • bootstrap_action - Hadoop को क्लस्टर नोड्स पर प्रारंभ करने से पहले चलने वाली बूटस्ट्रैप क्रियाओं की एक सूची।
  • configurations - EMR क्लस्टर को दिए गए कॉन्फ़िगरेशन की सूची।
  • service_role - आपकी ओर से AWS संसाधनों तक पहुँचने के लिए Amazon EMR सेवा द्वारा IAM की भूमिका निभाई जाएगी।
  • visible_to_all_users - यह दर्शाता है कि नौकरी का प्रवाह नौकरी के प्रवाह से जुड़े AWS खाते के सभी IAM उपयोगकर्ताओं को दिखाई देता है या नहीं।
  • tags - एक क्लस्टर के साथ जुड़े टैग की सूची।

उदाहरण बूट करने योग्य विन्यास

नोट: यह कॉन्फ़िगरेशन उदाहरण EMR क्लस्टर को बूट करने के लिए आवश्यक न्यूनतम कॉन्फ़िगरेशन प्रदर्शित करता है। यह सर्वोत्तम प्रथाओं को प्रदर्शित करने के लिए नहीं है। अपने जोखिम पर उपयोग करें।

provider "aws" {
  region = "us-west-2"
}

resource "aws_emr_cluster" "tf-test-cluster" {
  name          = "emr-test-arn"
  release_label = "emr-4.6.0"
  applications  = ["Spark"]

  ec2_attributes {
    subnet_id                         = "${aws_subnet.main.id}"
    emr_managed_master_security_group = "${aws_security_group.allow_all.id}"
    emr_managed_slave_security_group  = "${aws_security_group.allow_all.id}"
    instance_profile                  = "${aws_iam_instance_profile.emr_profile.arn}"
  }

  master_instance_type = "m3.xlarge"
  core_instance_type   = "m3.xlarge"
  core_instance_count  = 1

  tags {
    role     = "rolename"
    dns_zone = "env_zone"
    env      = "env"
    name     = "name-env"
  }

  bootstrap_action {
    path = "s3://elasticmapreduce/bootstrap-actions/run-if"
    name = "runif"
    args = ["instance.isMaster=true", "echo running on master node"]
  }

  configurations = "test-fixtures/emr_configurations.json"

  service_role = "${aws_iam_role.iam_emr_service_role.arn}"
}

resource "aws_security_group" "allow_all" {
  name        = "allow_all"
  description = "Allow all inbound traffic"
  vpc_id      = "${aws_vpc.main.id}"

  ingress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  depends_on = ["aws_subnet.main"]

  lifecycle {
    ignore_changes = ["ingress", "egress"]
  }

  tags {
    name = "emr_test"
  }
}

resource "aws_vpc" "main" {
  cidr_block           = "168.31.0.0/16"
  enable_dns_hostnames = true

  tags {
    name = "emr_test"
  }
}

resource "aws_subnet" "main" {
  vpc_id     = "${aws_vpc.main.id}"
  cidr_block = "168.31.0.0/20"

  tags {
    name = "emr_test"
  }
}

resource "aws_internet_gateway" "gw" {
  vpc_id = "${aws_vpc.main.id}"
}

resource "aws_route_table" "r" {
  vpc_id = "${aws_vpc.main.id}"

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = "${aws_internet_gateway.gw.id}"
  }
}

resource "aws_main_route_table_association" "a" {
  vpc_id         = "${aws_vpc.main.id}"
  route_table_id = "${aws_route_table.r.id}"
}

###

# IAM Role setups

###

# IAM role for EMR Service
resource "aws_iam_role" "iam_emr_service_role" {
  name = "iam_emr_service_role"

  assume_role_policy = <<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "elasticmapreduce.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

resource "aws_iam_role_policy" "iam_emr_service_policy" {
  name = "iam_emr_service_policy"
  role = "${aws_iam_role.iam_emr_service_role.id}"

  policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Resource": "*",
        "Action": [
            "ec2:AuthorizeSecurityGroupEgress",
            "ec2:AuthorizeSecurityGroupIngress",
            "ec2:CancelSpotInstanceRequests",
            "ec2:CreateNetworkInterface",
            "ec2:CreateSecurityGroup",
            "ec2:CreateTags",
            "ec2:DeleteNetworkInterface",
            "ec2:DeleteSecurityGroup",
            "ec2:DeleteTags",
            "ec2:DescribeAvailabilityZones",
            "ec2:DescribeAccountAttributes",
            "ec2:DescribeDhcpOptions",
            "ec2:DescribeInstanceStatus",
            "ec2:DescribeInstances",
            "ec2:DescribeKeyPairs",
            "ec2:DescribeNetworkAcls",
            "ec2:DescribeNetworkInterfaces",
            "ec2:DescribePrefixLists",
            "ec2:DescribeRouteTables",
            "ec2:DescribeSecurityGroups",
            "ec2:DescribeSpotInstanceRequests",
            "ec2:DescribeSpotPriceHistory",
            "ec2:DescribeSubnets",
            "ec2:DescribeVpcAttribute",
            "ec2:DescribeVpcEndpoints",
            "ec2:DescribeVpcEndpointServices",
            "ec2:DescribeVpcs",
            "ec2:DetachNetworkInterface",
            "ec2:ModifyImageAttribute",
            "ec2:ModifyInstanceAttribute",
            "ec2:RequestSpotInstances",
            "ec2:RevokeSecurityGroupEgress",
            "ec2:RunInstances",
            "ec2:TerminateInstances",
            "ec2:DeleteVolume",
            "ec2:DescribeVolumeStatus",
            "ec2:DescribeVolumes",
            "ec2:DetachVolume",
            "iam:GetRole",
            "iam:GetRolePolicy",
            "iam:ListInstanceProfiles",
            "iam:ListRolePolicies",
            "iam:PassRole",
            "s3:CreateBucket",
            "s3:Get*",
            "s3:List*",
            "sdb:BatchPutAttributes",
            "sdb:Select",
            "sqs:CreateQueue",
            "sqs:Delete*",
            "sqs:GetQueue*",
            "sqs:PurgeQueue",
            "sqs:ReceiveMessage"
        ]
    }]
}
EOF
}

# IAM Role for EC2 Instance Profile
resource "aws_iam_role" "iam_emr_profile_role" {
  name = "iam_emr_profile_role"

  assume_role_policy = <<EOF
{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ec2.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

resource "aws_iam_instance_profile" "emr_profile" {
  name  = "emr_profile"
  roles = ["${aws_iam_role.iam_emr_profile_role.name}"]
}

resource "aws_iam_role_policy" "iam_emr_profile_policy" {
  name = "iam_emr_profile_policy"
  role = "${aws_iam_role.iam_emr_profile_role.id}"

  policy = <<EOF
{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Resource": "*",
        "Action": [
            "cloudwatch:*",
            "dynamodb:*",
            "ec2:Describe*",
            "elasticmapreduce:Describe*",
            "elasticmapreduce:ListBootstrapActions",
            "elasticmapreduce:ListClusters",
            "elasticmapreduce:ListInstanceGroups",
            "elasticmapreduce:ListInstances",
            "elasticmapreduce:ListSteps",
            "kinesis:CreateStream",
            "kinesis:DeleteStream",
            "kinesis:DescribeStream",
            "kinesis:GetRecords",
            "kinesis:GetShardIterator",
            "kinesis:MergeShards",
            "kinesis:PutRecord",
            "kinesis:SplitShard",
            "rds:Describe*",
            "s3:*",
            "sdb:*",
            "sns:*",
            "sqs:*"
        ]
    }]
}
EOF
}