Skip to content

Instantly share code, notes, and snippets.

@nikolaymatrosov
Created April 21, 2020 17:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save nikolaymatrosov/685434e644206022259dbeff115236f7 to your computer and use it in GitHub Desktop.
Save nikolaymatrosov/685434e644206022259dbeff115236f7 to your computer and use it in GitHub Desktop.
// Конфгурируем Yandex.Cloud provider
provider "yandex" {
zone = "ru-central1-a"
}
// Объявляем переменную с названием Организации на гитхабе.
// К сожалению github provider не создает ресурсы `github_actions_secret` в личных репах
// https://github.com/terraform-providers/terraform-provider-github/issues/422
// К счастью базовая функциональность организаций теперь бесплатна.
variable "github_organization" {
type = string
}
// Конфигурируем github provider.
provider "github" {
organization = var.github_organization
}
// Создаем Сервисный аккаунт в нашем облаке.
resource "yandex_iam_service_account" "gatsby" {
name = "gatsby"
description = "service account to publish Gatsby"
}
// Определяем переменную с именем каталога
variable "folder_name" {
type = string
default = "default"
}
data "yandex_resourcemanager_folder" "default" {
name = var.folder_name
}
// Выдаем прав сервисному аккаунту в Облаке
resource "yandex_resourcemanager_cloud_iam_member" "gatsby-iam" {
cloud_id = data.yandex_resourcemanager_folder.default.cloud_id
role = "editor"
member = "serviceAccount:${yandex_iam_service_account.gatsby.id}"
}
// Создаем статический ключ с которым будем ходить в Object Storage
// Для создания бакета, а потом и из Github чтобы заливать готовый сайт
resource "yandex_iam_service_account_static_access_key" "gatsby-static-key" {
service_account_id = yandex_iam_service_account.gatsby.id
description = "static access key for object storage"
}
// Заводим переменную с именем бакета
variable "bucket_name" {
type = string
}
// И созадем сам бакет
resource "yandex_storage_bucket" "gatsby-demo" {
bucket = var.bucket_name
acl = "public-read"
access_key = yandex_iam_service_account_static_access_key.gatsby-static-key.access_key
secret_key = yandex_iam_service_account_static_access_key.gatsby-static-key.secret_key
// В дефолтном примере сгенеренные страницы называются именно та
website {
index_document = "index.html"
error_document = "404.html"
}
// Заодно можно дополнительно указать CORS правила
cors_rule {
allowed_headers = [
"*"]
allowed_methods = [
"GET",
"PUT",
"POST",
"DELETE",
"HEAD"]
allowed_origins = [
"https://${var.bucket_name}.website.yandexcloud.net"]
expose_headers = [
"ETag"]
max_age_seconds = 3000
}
}
// Теперь приступим к созданию нового репозитория в нашей организации
variable "repo_name" {
type = string
}
resource "github_repository" "repo" {
name = var.repo_name
}
// И пропишем секреты, которые мы будем использовать из Github Action
resource "github_actions_secret" "AWS_S3_BUCKET" {
repository = var.repo_name
secret_name = "AWS_S3_BUCKET"
plaintext_value = var.bucket_name
}
resource "github_actions_secret" "AWS_ACCESS_KEY_ID" {
repository = var.repo_name
secret_name = "AWS_ACCESS_KEY_ID"
plaintext_value = yandex_iam_service_account_static_access_key.gatsby-static-key.access_key
}
resource "github_actions_secret" "AWS_SECRET_ACCESS_KEY" {
repository = var.repo_name
secret_name = "AWS_SECRET_ACCESS_KEY"
plaintext_value = yandex_iam_service_account_static_access_key.gatsby-static-key.secret_key
}
// Ну и наконец запишем только что созданный апстрим в наш конфиг локального репозитория
resource "null_resource" "git_origin" {
provisioner "local-exec" {
command = "git remote add origin git@github.com:${var.github_organization}/${var.repo_name}.git"
}
}
@antonydevanchi
Copy link

Чмафф 💖

@letenkov
Copy link

letenkov commented Jan 5, 2022

прикольно

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment