Terraform-provider-aws: Solicitação de recurso: Suporte AWS Glue

Criado em 15 ago. 2017  ·  36Comentários  ·  Fonte: hashicorp/terraform-provider-aws

AWS Glue agora se tornou GA https://aws.amazon.com/glue/

Seria bom ter isso rodando no Terraform. Você aceita PR's como eu poderia pensar para adicioná-lo?

new-resource servicglue

Comentários muito úteis

Olá a todos! : wave: Vou dividir este trabalho em questões mais gerenciáveis ​​para que possa haver uma definição clara de pronto para vários tipos de suporte. Olhando para a API, aqui estão o que parecem recursos e fontes de dados relevantes para o Terraform gerenciar com o serviço AWS Glue:

  • Novo recurso aws_glue_classifier : # 3873
  • Novo recurso aws_glue_connection : # 3874
  • Novo recurso aws_glue_crawler : # 3875
  • Novo recurso aws_glue_dev_endpoint : # 3876
  • Novo recurso aws_glue_job : # 3877
  • Novo recurso aws_glue_partition : # 3878
  • Nova fonte de dados aws_glue_script : # 3879
  • Novo recurso aws_glue_table : # 3880
  • Novo recurso aws_glue_trigger : # 3882
  • Novo recurso aws_glue_user_defined_function : # 3883

Acompanhe as edições de divisão e observe qualquer uma com a qual gostaria de contribuir nas novas edições. Pessoalmente, pegarei contatos e empregos em breve. Obrigado!

Todos 36 comentários

Ei @darrenhaken

Parece que o serviço está disponível no Go SDK e as operações CRUDs também estão disponíveis .
Sinta-se à vontade para abrir um PR para isso, ficaremos mais do que felizes em revisar e ajudar nisso :)

Obrigado :-) há algum documento sobre como escrever o Terraform para se conectar ao SDK? Vou fazer algumas escavações sozinho, é claro.

Na terça-feira, 15 de agosto de 2017 às 10:27 +0100, "Gauthier Wallet" [email protected] escreveu:

Ei @darrenhaken

Parece que o serviço está disponível no Go SDK e as operações CRUDs também estão disponíveis.

Sinta-se à vontade para abrir um PR para isso, ficaremos mais do que felizes em revisar e ajudar nisso :)

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub ou ignore a conversa.

Dependências do fornecedor

De modo geral, você primeiro precisa vender as dependências, conforme exposto aqui: https://github.com/terraform-providers/terraform-provider-aws/pull/1417.

Gerenciamento de conexão

Para poder interagir com o SDK e, portanto, com a API, você precisaria conectar a conexão, no arquivo aws / config.go. Então, você seria capaz de obtê-lo e usá-lo no recurso.

Criação de recursos

Um bom começo é a página de documentação do provedor de plug-ins, junto com a documentação do repositório principal .

Primeiramente, você precisa criar uma estrutura HCL que corresponda à API. Trata-se de criar um esquema, que é uma abstração do próprio recurso.

Testes

Adicionar testes de aceitação é uma boa maneira de testar sem a necessidade de compilar, mas reproduzindo um caso de uso do mundo real.
Recomendo que você verifique o que já foi feito por outros colaboradores, o que é um bom começo.

Assim que o teste estiver escrito, execute-o:

make testacc TEST=./aws TESTARGS='-run=TestAccAWSResourceGlueClassifier_'

Isso executará apenas o teste com o prefixo do nome TestAccAWSResourceGlueClassifier_ .

Documentação

A documentação é uma etapa necessária para que as pessoas possam usá-la. Deve ficar bem claro como usar cada uma das opções, o que é obrigatório, o que é opcional.
Mais uma vez, te encorajo a conferir o que já foi feito, vai ajudar muito 😄

Exemplo global

Confira este exemplo sobre como conectar-se ao SDK, recurso, testes, documentação, etc.

Além disso, de acordo com a divisão de provedores de 0,10, você pode precisar construir sua versão de provedor local usando a página README para verificá-la localmente.

Por último, se você pudesse abrir um PR para o vendedor e, em seguida, 1 para cada recurso, seria incrível.
Por exemplo, 1 PR para o classificador + testes + doc, 1 para o ponto de desenvolvimento + testes + doc, etc.
Se precisar de qualquer revisão (mesmo em um WIP), basta perguntar :)

Espero que tudo isso seja bom para você!
Divirta-se :) 👍

Eu (provavelmente) vou trabalhar do meu jeito pelos recursos. Se alguém quiser saber qual recurso de cola deseja em seguida, após o recurso de banco de dados acima, me avise.

Estou aceitando pedidos, mas não posso prometer nada.

@drewsonne Gostaria que os rastreadores em seguida completassem a parte do catálogo de dados do produto.

Você precisa de ajuda para trabalhar nisso?

O recurso aws_glue_catalog_database foi lançado no terraform-provider-aws versão 1.7.0 . Consulte a documentação do

Quando isso pousou?


De: Brian Flad [email protected]
Enviado: sexta-feira, 12 de janeiro de 2018, 14h32min21s
Para: terraform-provider / terraform-provider-aws
Cc: Darren Haken; Menção
Assunto: Re: [terraform-owners / terraform-provider-aws] Solicitação de recurso: Suporte AWS Glue (# 1416)

O recurso aws_glue_catalog_database foi lançado no terraform-provider-aws versão 1.7.0 https://github.com/terraform-providers/terraform-provider-aws/blob/master/CHANGELOG.md#170-january-12-2018 . Consulte a documentação do Terraform sobre o controle de versão do provedor https://www.terraform.io/docs/configuration/providers.html#provider-versions ou entre em contato se precisar de ajuda para atualizar.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/terraform-providers/terraform-provider-aws/issues/1416#issuecomment-357253145 ou ignore o tópico https://github.com/notifications/ unsubscribe-auth / AA6Me-NEmBhef9CDJyVRG2PQn6r2MMGOks5tJ2z1gaJpZM4O3Wep .

@drewsonne , você trabalhou nos rastreadores? Se não, eu pegarei isso.

@darrenhaken ainda não. Meu primeiro plano era construir um caso de teste com etapas de teste de maneira semelhante ao catálogo do banco de dados. Talvez eu fale sobre isso na semana, mas me diga como você está indo e se você começar a trabalhar nisso em outro repo

@drewsonne Vou dar uma olhada nos Crawlers. O código do fornecedor está atualizado e contém a API do SDK da AWS para ele?

Não me lembro, mas está no arquivo json do fornecedor

@darrenhaken Eu adicionei um caso de teste de esqueleto para o rastreador aqui. https://github.com/drewsonne/terraform-provider-aws/commit/2dcd3c6c4eaafae76ac6e45301e24113441c78d9 . Não é de forma alguma exaustivo, mas seria definitivamente um começo.

Não tenho certeza de como você deseja fazer isso, mas é um começo para você.

@drewsonne obrigado, vou usar isso para começar a olhar para ele.

@drewsonne , estou quase terminando os rastreadores

@darrenhaken sweet, presumo que seja o branch "glue_crawlers" do seu repositório.

@drewsonne é esse. Não forcei porque estive discutindo alguns problemas com a definição de um esquema.

Você já fez muito com TF antes? Talvez você possa fornecer um ou dois indicadores se eu lhe mostrar.

WIP foi empurrado agora se estiver interessado em ver o progresso

@darrenhaken Eu tenho um pouco de experiência em escrever provedores. Quais são os problemas que você está discutindo especificamente com o esquema?

@drewsonne Estou trabalhando na criação do rastreador com os campos obrigatórios Name , DatabaseName e Targets . Consulte https://docs.aws.amazon.com/sdk-for-go/api/service/glue/#CreateCrawlerInput

Aqui está a definição de estrutura para alvos, que é uma estrutura aninhada dentro de CreateCrawlerInput :

type CrawlerTargets struct {

    // Specifies JDBC targets.
    JdbcTargets []*JdbcTarget `type:"list"`

    // Specifies Amazon S3 targets.
    S3Targets []*S3Target `type:"list"`
    // contains filtered or unexported fields
}

O que estou tentando descobrir é qual é o esquema TF correto para mapear para a estrutura CrawlerTargets. Fiz uma tentativa no teste de aceitação para fazer isso, mas não tive sorte.

Para sua informação, o teste de aceitação ainda não foi concluído - você precisa ter uma conta AWS com um bucket S3 e um banco de dados AWS Glue.

Nesses casos (e acho que há alguma precedência para isso, mas não me lembro onde), eu nivelaria o esquema um pouco, por exemplo:

"s3_targets": {
    Type:          schema.TypeList,
    Optional:      true,
    MinItems:      1,
    Elem: &schema.Resource{
        Schema: map[string]*schema.Schema{
            "path": {
                Type:     schema.TypeString,
                Required: true,
            },
            "exclusions": {
                Type:     schema.TypeSet,
                Optional: true,
                Elem:     schema.TypeString,
            },
        },
    },
},
"jdbc_targets": {
    Type:          schema.TypeList,
    Optional:      true,
    MinItems:      1,
    Elem: &schema.Resource{
        Schema: map[string]*schema.Schema{
            "connection_name": {
                Type:     schema.TypeString,
                Required: true,
            },
            "path": {
                Type:     schema.TypeString,
                Required: true,
            },
            "exclusions": {
                Type:     schema.TypeSet,
                Optional: true,
                Elem:     schema.TypeString,
            },
        },
    },
},

Em seguida, coloque-os de volta na estrutura do esquema nos manipuladores de Leitura / Gravação / Atualização. Acho que isso é mais simples, pois os dois atributos de nível superior têm esquemas muito específicos, em comparação a ter dois tipos diferentes de objetos (jdbc e s3) compactados em um esquema ou ter uma camada extra na árvore de configuração.

Esperando que @Ninir , @bflad ou @radeksimko tenham alguma influência sobre isso?

@drewsonne , pensei em Required: true campos, você só precisa de s3_targets ou jdbc_targets, portanto, declará-los como sendo obrigatórios não faz sentido.

Em geral, tendemos a preferir seguir a API / esquema da AWS, a menos que a experiência do usuário possa ser bastante melhorada fazendo nossa própria implementação devido a custos de manutenção futuros.

Embora não possamos definir uma definição de esquema do tipo Required: true para exigir um de s3_targets ou jdbc_targets (no momento, de qualquer maneira - é um pedido decente que poderíamos usar em outros lugares como bem e provavelmente vale a pena enviar uma solicitação de recurso upstream no núcleo do Terraform), podemos fazer a lógica em criar / atualizar para exigir essencialmente um ou outro.

por exemplo, algo assim deve resolver o problema

jdbc_targets, jdbc_targets_ok := d.GetOk("jdbc_targets")
s3_targets, s3_targets_ok := d.GetOk("s3_targets")
if !jdbc_targets_ok && !s3_targets_ok {
    return fmt.Errorf("jdbc_targets or s3_targets configuration is required")
}

@bflad isso faz sentido, acho que desviar muito da API da AWS só causaria confusão no longo prazo. Vou olhar para combinar as suas sugestões e as de @drewsonne .

btw, @darrenhaken se você mantiver seu branch git atualizado, posso escrever alguns testes de aceitação para você com o balde S3 e o glue db e até mesmo executá-los.

Claro que vou trazer as mudanças hoje, então isso será útil


De: Drew J. Sonne [email protected]
Enviado: quinta-feira, 25 de janeiro de 2018 6:26:39
Para: terraform-provider / terraform-provider-aws
Cc: Darren Haken; Menção
Assunto: Re: [terraform-owners / terraform-provider-aws] Solicitação de recurso: Suporte AWS Glue (# 1416)

btw, @darrenhaken https://github.com/darrenhaken se você mantiver seu branch git atualizado, posso escrever alguns testes de aceitação para você com o balde S3 e o glue db e até mesmo executá-los.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/terraform-providers/terraform-provider-aws/issues/1416#issuecomment-360373541 ou ignore o tópico https://github.com/notifications/ unsubscribe-auth / AA6Me_dAR9WFnQxY62FXVzoa0u408Hawks5tOB6fgaJpZM4O3Wep .

Posso lhe dar permissões de gravação para o branch, se desejar.


De: Darren Haken [email protected]
Enviado: quinta-feira, 25 de janeiro de 2018 6:31:01
Para: terraform-provider / terraform-provider-aws; terraform-provider / terraform-provider-aws
Cc: Menção
Assunto: Re: [terraform-owners / terraform-provider-aws] Solicitação de recurso: Suporte AWS Glue (# 1416)

Claro que vou trazer as mudanças hoje, então isso será útil


De: Drew J. Sonne [email protected]
Enviado: quinta-feira, 25 de janeiro de 2018 6:26:39
Para: terraform-provider / terraform-provider-aws
Cc: Darren Haken; Menção
Assunto: Re: [terraform-owners / terraform-provider-aws] Solicitação de recurso: Suporte AWS Glue (# 1416)

btw, @darrenhaken https://github.com/darrenhaken se você mantiver seu branch git atualizado, posso escrever alguns testes de aceitação para você com o balde S3 e o glue db e até mesmo executá-los.

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente, visualize-o no GitHub https://github.com/terraform-providers/terraform-provider-aws/issues/1416#issuecomment-360373541 ou ignore o tópico https://github.com/notifications/ unsubscribe-auth / AA6Me_dAR9WFnQxY62FXVzoa0u408Hawks5tOB6fgaJpZM4O3Wep .

@darrenhaken qual a situação do seu trabalho? Algum progresso?

@cemo Vou começar a olhar para ele novamente esta semana. Eu tive que voltar para terminar outro TF PR que foi aceito agora. Desculpe pelo atraso!

Também estou interessado em usar isso. Há algum cronograma previsto?

Adicionarei rastreadores esta semana (espero) com os campos obrigatórios adicionados. Vou vincular o repo / branch.

@drewsonne , você ainda quer trabalhar nisso?

Tenho trabalhado nisso mais um pouco e tenho um teste de aceitação com o seguinte TF:

resource "aws_glue_catalog_crawler" "test" {
      name = "test"
      database_name = "db_name"
      role = "${aws_iam_role.glue.arn}"
      s3_target {
        path = "s3://bucket"
      }
    }

    resource "aws_iam_role_policy_attachment" "aws-glue-service-role-default-policy-attachment" {
        policy_arn = "arn:aws:iam::aws:policy/AWSGlueServiceRole"
        role = "${aws_iam_role.glue.arn}"
    }

    resource "aws_iam_role" "glue" {
        name = "AWSGlueServiceRoleDefault"
        assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
    }

Recebo o seguinte erro:

=== RUN   TestAccAWSGlueCrawler_full
--- FAIL: TestAccAWSGlueCrawler_full (13.25s)
    testing.go:513: Step 0 error: Error applying: 2 error(s) occurred:

        * aws_iam_role_policy_attachment.aws-glue-service-role-default-policy-attachment: 1 error(s) occurred:

        * aws_iam_role_policy_attachment.aws-glue-service-role-default-policy-attachment: [WARN] Error attaching policy arn:aws:iam::aws:policy/AWSGlueServiceRole to IAM Role arn:aws:iam::{account_id}:role/AWSGlueServiceRoleDefault: ValidationError: The specified value for roleName is invalid. It must contain only alphanumeric characters and/or the following: +=,.@_-
            status code: 400, request id: 43da944e-27a7-11e8-8481-452f34f141d6
        * aws_glue_catalog_crawler.test: 1 error(s) occurred:

        * aws_glue_catalog_crawler.test: error creating Glue crawler: InvalidInputException: Service is unable to assume role arn:aws:iam::{account_id}:role/AWSGlueServiceRoleDefault. Please verify role's TrustPolicy
            status code: 400, request id: 4405c2e7-27a7-11e8-9a99-111706a35ce0
FAIL
FAIL    github.com/terraform-providers/terraform-provider-aws/aws   13.293s
make: *** [testacc] Error 1

Alguma ideia?

Este erro está sendo gerado a partir da API AWS:

        * aws_iam_role_policy_attachment.aws-glue-service-role-default-policy-attachment: [WARN] Error attaching policy arn:aws:iam::aws:policy/AWSGlueServiceRole to IAM Role arn:aws:iam::697329683179:role/AWSGlueServiceRoleDefault: ValidationError: The specified value for roleName is invalid. It must contain only alphanumeric characters and/or the following: +=,.@_-
            status code: 400, request id: 43da944e-27a7-11e8-8481-452f34f141d6

Código relevante:

https://github.com/terraform-providers/terraform-provider-aws/blob/cc36c1d6c312b0e2cc024f97bb35ba6b59c3f8c2/aws/resource_aws_iam_role_policy_attachment.go#L41 -L44

Parece que está faltando alguma validação para garantir que é um nome de função IAM sendo passado em vez de uma função ARN IAM (ou lidar adequadamente com esta situação analisando o nome fora do ARN). Provavelmente deveríamos fazer um problema separado para isso. 😉

Você pode corrigir a configuração do Terraform alterando o atributo role para usar aws_iam_role.role.name vez de aws_iam_role.role.arn por enquanto 👍

resource "aws_iam_role_policy_attachment" "aws-glue-service-role-default-policy-attachment" {
  policy_arn = "arn:aws:iam::aws:policy/AWSGlueServiceRole"
  role       = "${aws_iam_role.glue.name}"
}

Tentei o nome e ainda tive o mesmo problema. Estarei no escritório em algumas horas, vou empurrar meu WIP no garfo se você não se importa de dar uma olhada? O erro é gerado pela Amazon em torno da entrada do rastreador e algo sobre a política de confiança.

Qualquer ajuda é apreciada :-)

@bflad aqui está o código alterado:

resource "aws_glue_catalog_crawler" "test" {
      name = "test"
      database_name = "db_name"
      role = "${aws_iam_role.glue.name}"
      s3_target {
        path = "s3://bucket"
      }
    }

    resource "aws_iam_role_policy_attachment" "aws-glue-service-role-default-policy-attachment" {
        policy_arn = "arn:aws:iam::aws:policy/AWSGlueServiceRole"
        role = "${aws_iam_role.glue.name}"
    }

    resource "aws_iam_role" "glue" {
        name = "AWSGlueServiceRoleDefault"
        assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Effect": "Allow",
      "Sid": ""
    }
  ]
}
EOF
    }

O erro é igual à pergunta original e menciona:

Service is unable to assume role arn:aws:iam::{account}:role/AWSGlueServiceRoleDefault. Please verify role's TrustPolicy

Você pode ver o código em:
[email protected]:darrenhaken/terraform-provider-aws.git e a filial é glue_crawlers

Olá a todos! : wave: Vou dividir este trabalho em questões mais gerenciáveis ​​para que possa haver uma definição clara de pronto para vários tipos de suporte. Olhando para a API, aqui estão o que parecem recursos e fontes de dados relevantes para o Terraform gerenciar com o serviço AWS Glue:

  • Novo recurso aws_glue_classifier : # 3873
  • Novo recurso aws_glue_connection : # 3874
  • Novo recurso aws_glue_crawler : # 3875
  • Novo recurso aws_glue_dev_endpoint : # 3876
  • Novo recurso aws_glue_job : # 3877
  • Novo recurso aws_glue_partition : # 3878
  • Nova fonte de dados aws_glue_script : # 3879
  • Novo recurso aws_glue_table : # 3880
  • Novo recurso aws_glue_trigger : # 3882
  • Novo recurso aws_glue_user_defined_function : # 3883

Acompanhe as edições de divisão e observe qualquer uma com a qual gostaria de contribuir nas novas edições. Pessoalmente, pegarei contatos e empregos em breve. Obrigado!

Vou bloquear este problema porque ele está fechado há _30 dias_ ⏳. Isso ajuda nossos mantenedores a encontrar e focar nas questões ativas.

Se você acha que este problema deve ser reaberto, encorajamos a criação de um novo problema com um link de volta para este para contexto adicional. Obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações