{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/untitled-2/",
    "result": {"data":{"ghostPost":{"id":"Ghost__Post__60faaf3a3986b000013a3ba2","title":"Terraformを使いAWSにSSL通信と独自ドメインを使ったStatic websiteを構築する話し(GitHub Actionsもあるよ)","slug":"untitled-2","featured":false,"feature_image":null,"excerpt":"\nざっくりしたいこと\nVue.js でできたStatic websiteを独自ドメイン with SSLで公開する\n\nSSL証明書の発行、サブドメイン作成などもすべて、できる限りTerraformで作成する\n\n使用技術:\n・Vue.js\n\n・Terraform(v0.12.26)\n\n・GitHub Actions\n\nその他実行環境:\n * aws-cli/2.0.19\n * Python/3.8.3\n * Linux/5.4.0–37-generic botocore/2.0.0dev23\n\nVue.js\nStatic websiteの作成\n\nTerraform\n前提: State用のS3は作成済み。ドメインはRoute53で取得済み。\nDeployで作ったものはすべて壊せるようにしたい\n\nS3,Cloud Front,ACM,Route53あたりをTerraformで触っていく。\n\n以下のことをすべてTerraformで自動化する\n\nS3:Privateで作成＆Force Deleteの有効化\n\nblog-terraform-aws-static-site-s3.tfGitHub G","custom_excerpt":null,"visibility":"public","created_at_pretty":"23 July, 2021","published_at_pretty":"24 June, 2020","updated_at_pretty":"20 August, 2021","created_at":"2021-07-23T20:59:54.000+09:00","published_at":"2020-06-25T00:00:00.000+09:00","updated_at":"2021-08-20T21:36:22.000+09:00","meta_title":null,"meta_description":null,"og_description":null,"og_image":null,"og_title":null,"twitter_description":null,"twitter_image":null,"twitter_title":null,"authors":[{"name":"Kohei Kondo","slug":"kooooohe","bio":null,"profile_image":"https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/MVIMG_20180910_102813.png","twitter":"@kooooohe_","facebook":null,"website":null}],"primary_author":{"name":"Kohei Kondo","slug":"kooooohe","bio":null,"profile_image":"https://ghost.tech.anti-pattern.co.jp/content/images/2022/04/MVIMG_20180910_102813.png","twitter":"@kooooohe_","facebook":null,"website":null},"primary_tag":{"name":"Terraform","slug":"terraform","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},"tags":[{"name":"Terraform","slug":"terraform","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},{"name":"AWS","slug":"aws","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"},{"name":"GitHub Actions","slug":"github-actions","description":null,"feature_image":null,"meta_description":null,"meta_title":null,"visibility":"public"}],"plaintext":"\nざっくりしたいこと\nVue.js でできたStatic websiteを独自ドメイン with SSLで公開する\n\nSSL証明書の発行、サブドメイン作成などもすべて、できる限りTerraformで作成する\n\n使用技術:\n・Vue.js\n\n・Terraform(v0.12.26)\n\n・GitHub Actions\n\nその他実行環境:\n * aws-cli/2.0.19\n * Python/3.8.3\n * Linux/5.4.0–37-generic botocore/2.0.0dev23\n\nVue.js\nStatic websiteの作成\n\nTerraform\n前提: State用のS3は作成済み。ドメインはRoute53で取得済み。\nDeployで作ったものはすべて壊せるようにしたい\n\nS3,Cloud Front,ACM,Route53あたりをTerraformで触っていく。\n\n以下のことをすべてTerraformで自動化する\n\nS3:Privateで作成＆Force Deleteの有効化\n\nblog-terraform-aws-static-site-s3.tfGitHub Gist: instantly share code, notes,\nand snippets.Gist262588213843476\n[https://gist.github.com/kooooohe/1d6e4b92f7990002307589b3c4f8421d]]resource \"aws_s3_bucket\" \"site\" {\n  bucket = var.bucket_name\n  acl    = \"private\"\n  tags = {\n    name = var.tag\n  }\n  force_destroy = true\n  versioning {\n    enabled = true\n  }\n}\n\nresource \"aws_s3_bucket_policy\" \"site\" {\n  bucket = aws_s3_bucket.site.id\n  policy = data.aws_iam_policy_document.s3_site_policy.json\n}\n\ndata \"aws_iam_policy_document\" \"s3_site_policy\" {\n  statement {\n    actions   = [\"s3:GetObject\"]\n    resources = [\"${aws_s3_bucket.site.arn}/*\"]\n\n    principals {\n      type        = \"AWS\"\n      identifiers = [aws_cloudfront_origin_access_identity.site.iam_arn]\n    }\n  }\n}\n\n\n\nCloudFront:作成した(S3,証明書,Domain)と紐づけていく、存在しないページはすべて/index.htmlにリダイレクト\n\nblog-terraform-aws-static-site-cloud-front.tfGitHub Gist: instantly share code,\nnotes, and snippets.Gist262588213843476\n[https://gist.github.com/kooooohe/183a76378bfcae4b83378336741e4514]locals {\n  s3_origin_id = \"s3-origin-${var.site_domain}\"\n}\n\nresource \"aws_cloudfront_origin_access_identity\" \"site\" {\n  comment = var.site_domain\n}\n\nresource \"aws_cloudfront_distribution\" \"site\" {\n  tags = {\n    name = var.tag\n  }\n  origin {\n\n    domain_name = aws_s3_bucket.site.bucket_regional_domain_name\n    origin_id   = local.s3_origin_id\n\n    s3_origin_config {\n      origin_access_identity = aws_cloudfront_origin_access_identity.site.cloudfront_access_identity_path\n    }\n  }\n\n  enabled             = true\n  is_ipv6_enabled     = true\n  comment             = var.site_domain\n  default_root_object = \"index.html\"\n\n  default_cache_behavior {\n    allowed_methods  = [\"GET\", \"HEAD\"]\n    cached_methods   = [\"GET\", \"HEAD\"]\n    target_origin_id = local.s3_origin_id\n\n    forwarded_values {\n      query_string = false\n      cookies {\n        forward = \"none\"\n      }\n    }\n\n    viewer_protocol_policy = \"redirect-to-https\"\n    min_ttl                = 0\n    default_ttl            = 3600\n    max_ttl                = 86400\n  }\n\n  restrictions {\n    geo_restriction {\n      restriction_type = \"none\"\n    }\n  }\n\n  custom_error_response {\n    error_caching_min_ttl = 3000\n    error_code            = 404\n    response_code         = 200\n    response_page_path    = \"/index.html\"\n  }\n\n  custom_error_response {\n    error_caching_min_ttl = 3000\n    error_code            = 403\n    response_code         = 200\n    response_page_path    = \"/index.html\"\n  }\n\n\n\n  price_class = \"PriceClass_200\"\n\n  # CloudFrontドメインの証明書を利用\n  //viewer_certificate {\n  //  cloudfront_default_certificate = true\n  //}\n\n\n  aliases = [var.site_domain]\n\n  viewer_certificate {\n    acm_certificate_arn      = aws_acm_certificate_validation.acm_cert.certificate_arn\n    ssl_support_method       = \"sni-only\"\n    minimum_protocol_version = \"TLSv1\"\n  }\n}\n\n\nRoute53: 取得済みの独自ドメインから指定のサブドメインのHost Zoneを作成し、NSレコードを追加する。その後、作成したCloud Frontへ\n\nblog-terraform-aws-static-site-dns.tfGitHub Gist: instantly share code, notes,\nand snippets.Gist262588213843476\n[https://gist.github.com/kooooohe/b71e48d6d645cbcf28fe47d40cc79c43]data \"aws_route53_zone\" \"root_domain\" {\n  name = var.root_domain\n}\n\nresource \"aws_route53_zone\" \"sub_domain\" {\n  name = var.site_domain\n  tags = {\n    name = var.tag\n  }\n}\n\nresource \"aws_route53_record\" \"root_domain\" {\n  depends_on      = [aws_route53_zone.sub_domain]\n  allow_overwrite = true\n  name            = var.site_domain\n  ttl             = 30\n  type            = \"NS\"\n  zone_id         = data.aws_route53_zone.root_domain.zone_id\n\n  records = [\n    aws_route53_zone.sub_domain.name_servers.0,\n    aws_route53_zone.sub_domain.name_servers.1,\n    aws_route53_zone.sub_domain.name_servers.2,\n    aws_route53_zone.sub_domain.name_servers.3,\n  ]\n}\n\nresource \"aws_route53_record\" \"sub_domain\" {\n  zone_id = aws_route53_zone.sub_domain.zone_id\n  name    = aws_route53_zone.sub_domain.name\n  type    = \"A\"\n\n  alias {\n    name                   = aws_cloudfront_distribution.site.domain_name\n    zone_id                = aws_cloudfront_distribution.site.hosted_zone_id\n    evaluate_target_health = false\n  }\n}\n\n\n\nACM:ワイルドカード証明書を発行し、認証する\n\nblog-terraform-aws-static-site-acm.tfGitHub Gist: instantly share code, notes,\nand snippets.Gist262588213843476\n[https://gist.github.com/kooooohe/219bff811fa617a4d7e7f636b82874fe]\nresource \"aws_acm_certificate\" \"acm_cert\" {\n  provider                  = aws.us-east-1\n  domain_name               = var.root_domain\n  subject_alternative_names = [\"*.${var.root_domain}\"]\n  validation_method         = \"DNS\"\n\n  lifecycle {\n    create_before_destroy = true\n  }\n\n  tags = {\n    name = var.tag\n  }\n}\n\n\nresource \"aws_route53_record\" \"cert_validation\" {\n  allow_overwrite = true\n  zone_id         = data.aws_route53_zone.root_domain.id\n  name            = aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_name\n  type            = aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_type\n  records         = [aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_value]\n  ttl             = 60\n}\n\nresource \"aws_route53_record\" \"cert_validation_alt\" {\n  allow_overwrite = true\n  zone_id         = data.aws_route53_zone.root_domain.id\n  name            = aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_name\n  type            = aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_type\n  records         = [aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_value]\n  ttl             = 60\n}\n\n\n\nresource \"aws_acm_certificate_validation\" \"acm_cert\" {\n  provider                = aws.us-east-1\n  certificate_arn         = aws_acm_certificate.acm_cert.arn\n  validation_record_fqdns = [aws_route53_record.cert_validation.fqdn, aws_route53_record.cert_validation_alt.fqdn]\n}\n\n\n完成物\nGitHub - kooooohe/aws-static-site-terraformContribute to\nkooooohe/aws-static-site-terraform development by creating an account on\nGitHub.\nGitHubkooooohe [https://github.com/kooooohe/aws-static-site-terraform]\n\nStateはローカルに保存するように作ってあるので、下記のようなファイルを作れば作成済みのS3に保存されるようになる\n\nmain.tf\n\n```json\nterraform {\n  backend \"s3\" {\n      bucket = \"mybucket\"\n      key    = \"path/to/my/key\"\n      region = \"us-east-1\"\n      }\n   }\n```\n\n特にModule化とかはしていないが、variables.tfの値を変更すればそれぞれのドメインで同等の環境を誰でも作ることができるようにはしてある。\n\nGitHub Actions\nS3のファイル更新とCloud Frontのキャッシュ削除をGitHub Actionsで行う。\n\n※S3の更新からのLambda発火でinvalidation作成とかもやろうと思ったのだが、こっちのほうがシンプルなので採用\n\nblog-terraform-aws-static-site-actions.ymlGitHub Gist: instantly share code,\nnotes, and snippets.Gist262588213843476\n[https://gist.github.com/kooooohe/2ce9cc174d29fae4f8ea92b8e8fd536c]name: Deploy Production\n\non:\n  push:\n    branches: [ master ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [14.x]\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v1\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: yarn install\n    - run: yarn build\n\n    - name: Configure AWS credentials\n      uses: aws-actions/configure-aws-credentials@v1\n      with:\n        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n        aws-region: ap-northeast-1\n    - run: aws s3 sync ./dist/ s3://${{ secrets.BUCKET_NAME }}/ --delete --exact-timestamps\n    - run: aws cloudfront create-invalidation --distribution-id ${{ secrets.DISTRIBUTION_ID}} --paths \"/*\"","html":"<h3></h3><h3 id=\"%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%97%E3%81%9F%E3%81%84%E3%81%93%E3%81%A8\">ざっくりしたいこと</h3><p>Vue.js でできたStatic websiteを独自ドメイン with SSLで公開する</p><p>SSL証明書の発行、サブドメイン作成などもすべて、できる限りTerraformで作成する</p><h3 id=\"%E4%BD%BF%E7%94%A8%E6%8A%80%E8%A1%93\">使用技術:</h3><p>・Vue.js</p><p>・Terraform(v0.12.26)</p><p>・GitHub Actions</p><h4 id=\"%E3%81%9D%E3%81%AE%E4%BB%96%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83\">その他実行環境:</h4><!--kg-card-begin: markdown--><ul>\n<li>aws-cli/2.0.19</li>\n<li>Python/3.8.3</li>\n<li>Linux/5.4.0–37-generic botocore/2.0.0dev23</li>\n</ul>\n<!--kg-card-end: markdown--><h4 id=\"vuejs\">Vue.js</h4><p>Static websiteの作成</p><h4 id=\"terraform\">Terraform</h4><p>前提: State用のS3は作成済み。ドメインはRoute53で取得済み。<br>Deployで作ったものはすべて壊せるようにしたい</p><p>S3,Cloud Front,ACM,Route53あたりをTerraformで触っていく。</p><p>以下のことをすべてTerraformで自動化する</p><p>S3:Privateで作成＆Force Deleteの有効化</p><figure class=\"kg-card kg-bookmark-card kg-card-hascaption\"><a class=\"kg-bookmark-container\" href=\"https://gist.github.com/kooooohe/1d6e4b92f7990002307589b3c4f8421d\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">blog-terraform-aws-static-site-s3.tf</div><div class=\"kg-bookmark-description\">GitHub Gist: instantly share code, notes, and snippets.</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://github.githubassets.com/favicons/favicon.svg\"><span class=\"kg-bookmark-author\">Gist</span><span class=\"kg-bookmark-publisher\">262588213843476</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://github.githubassets.com/images/modules/gists/gist-og-image.png\"></div></a><figcaption>]</figcaption></figure><!--kg-card-begin: markdown--><pre><code class=\"language-tf\">resource &quot;aws_s3_bucket&quot; &quot;site&quot; {\n  bucket = var.bucket_name\n  acl    = &quot;private&quot;\n  tags = {\n    name = var.tag\n  }\n  force_destroy = true\n  versioning {\n    enabled = true\n  }\n}\n\nresource &quot;aws_s3_bucket_policy&quot; &quot;site&quot; {\n  bucket = aws_s3_bucket.site.id\n  policy = data.aws_iam_policy_document.s3_site_policy.json\n}\n\ndata &quot;aws_iam_policy_document&quot; &quot;s3_site_policy&quot; {\n  statement {\n    actions   = [&quot;s3:GetObject&quot;]\n    resources = [&quot;${aws_s3_bucket.site.arn}/*&quot;]\n\n    principals {\n      type        = &quot;AWS&quot;\n      identifiers = [aws_cloudfront_origin_access_identity.site.iam_arn]\n    }\n  }\n}\n\n</code></pre>\n<!--kg-card-end: markdown--><p>CloudFront:作成した(S3,証明書,Domain)と紐づけていく、存在しないページはすべて/index.htmlにリダイレクト</p><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://gist.github.com/kooooohe/183a76378bfcae4b83378336741e4514\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">blog-terraform-aws-static-site-cloud-front.tf</div><div class=\"kg-bookmark-description\">GitHub Gist: instantly share code, notes, and snippets.</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://github.githubassets.com/favicons/favicon.svg\"><span class=\"kg-bookmark-author\">Gist</span><span class=\"kg-bookmark-publisher\">262588213843476</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://github.githubassets.com/images/modules/gists/gist-og-image.png\"></div></a></figure><!--kg-card-begin: markdown--><pre><code>locals {\n  s3_origin_id = &quot;s3-origin-${var.site_domain}&quot;\n}\n\nresource &quot;aws_cloudfront_origin_access_identity&quot; &quot;site&quot; {\n  comment = var.site_domain\n}\n\nresource &quot;aws_cloudfront_distribution&quot; &quot;site&quot; {\n  tags = {\n    name = var.tag\n  }\n  origin {\n\n    domain_name = aws_s3_bucket.site.bucket_regional_domain_name\n    origin_id   = local.s3_origin_id\n\n    s3_origin_config {\n      origin_access_identity = aws_cloudfront_origin_access_identity.site.cloudfront_access_identity_path\n    }\n  }\n\n  enabled             = true\n  is_ipv6_enabled     = true\n  comment             = var.site_domain\n  default_root_object = &quot;index.html&quot;\n\n  default_cache_behavior {\n    allowed_methods  = [&quot;GET&quot;, &quot;HEAD&quot;]\n    cached_methods   = [&quot;GET&quot;, &quot;HEAD&quot;]\n    target_origin_id = local.s3_origin_id\n\n    forwarded_values {\n      query_string = false\n      cookies {\n        forward = &quot;none&quot;\n      }\n    }\n\n    viewer_protocol_policy = &quot;redirect-to-https&quot;\n    min_ttl                = 0\n    default_ttl            = 3600\n    max_ttl                = 86400\n  }\n\n  restrictions {\n    geo_restriction {\n      restriction_type = &quot;none&quot;\n    }\n  }\n\n  custom_error_response {\n    error_caching_min_ttl = 3000\n    error_code            = 404\n    response_code         = 200\n    response_page_path    = &quot;/index.html&quot;\n  }\n\n  custom_error_response {\n    error_caching_min_ttl = 3000\n    error_code            = 403\n    response_code         = 200\n    response_page_path    = &quot;/index.html&quot;\n  }\n\n\n\n  price_class = &quot;PriceClass_200&quot;\n\n  # CloudFrontドメインの証明書を利用\n  //viewer_certificate {\n  //  cloudfront_default_certificate = true\n  //}\n\n\n  aliases = [var.site_domain]\n\n  viewer_certificate {\n    acm_certificate_arn      = aws_acm_certificate_validation.acm_cert.certificate_arn\n    ssl_support_method       = &quot;sni-only&quot;\n    minimum_protocol_version = &quot;TLSv1&quot;\n  }\n}\n</code></pre>\n<!--kg-card-end: markdown--><p>Route53: 取得済みの独自ドメインから指定のサブドメインのHost Zoneを作成し、NSレコードを追加する。その後、作成したCloud Frontへ</p><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://gist.github.com/kooooohe/b71e48d6d645cbcf28fe47d40cc79c43\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">blog-terraform-aws-static-site-dns.tf</div><div class=\"kg-bookmark-description\">GitHub Gist: instantly share code, notes, and snippets.</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://github.githubassets.com/favicons/favicon.svg\"><span class=\"kg-bookmark-author\">Gist</span><span class=\"kg-bookmark-publisher\">262588213843476</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://github.githubassets.com/images/modules/gists/gist-og-image.png\"></div></a></figure><!--kg-card-begin: markdown--><pre><code class=\"language-tf\">data &quot;aws_route53_zone&quot; &quot;root_domain&quot; {\n  name = var.root_domain\n}\n\nresource &quot;aws_route53_zone&quot; &quot;sub_domain&quot; {\n  name = var.site_domain\n  tags = {\n    name = var.tag\n  }\n}\n\nresource &quot;aws_route53_record&quot; &quot;root_domain&quot; {\n  depends_on      = [aws_route53_zone.sub_domain]\n  allow_overwrite = true\n  name            = var.site_domain\n  ttl             = 30\n  type            = &quot;NS&quot;\n  zone_id         = data.aws_route53_zone.root_domain.zone_id\n\n  records = [\n    aws_route53_zone.sub_domain.name_servers.0,\n    aws_route53_zone.sub_domain.name_servers.1,\n    aws_route53_zone.sub_domain.name_servers.2,\n    aws_route53_zone.sub_domain.name_servers.3,\n  ]\n}\n\nresource &quot;aws_route53_record&quot; &quot;sub_domain&quot; {\n  zone_id = aws_route53_zone.sub_domain.zone_id\n  name    = aws_route53_zone.sub_domain.name\n  type    = &quot;A&quot;\n\n  alias {\n    name                   = aws_cloudfront_distribution.site.domain_name\n    zone_id                = aws_cloudfront_distribution.site.hosted_zone_id\n    evaluate_target_health = false\n  }\n}\n\n</code></pre>\n<!--kg-card-end: markdown--><p>ACM:ワイルドカード証明書を発行し、認証する</p><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://gist.github.com/kooooohe/219bff811fa617a4d7e7f636b82874fe\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">blog-terraform-aws-static-site-acm.tf</div><div class=\"kg-bookmark-description\">GitHub Gist: instantly share code, notes, and snippets.</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://github.githubassets.com/favicons/favicon.svg\"><span class=\"kg-bookmark-author\">Gist</span><span class=\"kg-bookmark-publisher\">262588213843476</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://github.githubassets.com/images/modules/gists/gist-og-image.png\"></div></a></figure><!--kg-card-begin: markdown--><pre><code class=\"language-tf\">\nresource &quot;aws_acm_certificate&quot; &quot;acm_cert&quot; {\n  provider                  = aws.us-east-1\n  domain_name               = var.root_domain\n  subject_alternative_names = [&quot;*.${var.root_domain}&quot;]\n  validation_method         = &quot;DNS&quot;\n\n  lifecycle {\n    create_before_destroy = true\n  }\n\n  tags = {\n    name = var.tag\n  }\n}\n\n\nresource &quot;aws_route53_record&quot; &quot;cert_validation&quot; {\n  allow_overwrite = true\n  zone_id         = data.aws_route53_zone.root_domain.id\n  name            = aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_name\n  type            = aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_type\n  records         = [aws_acm_certificate.acm_cert.domain_validation_options.0.resource_record_value]\n  ttl             = 60\n}\n\nresource &quot;aws_route53_record&quot; &quot;cert_validation_alt&quot; {\n  allow_overwrite = true\n  zone_id         = data.aws_route53_zone.root_domain.id\n  name            = aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_name\n  type            = aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_type\n  records         = [aws_acm_certificate.acm_cert.domain_validation_options.1.resource_record_value]\n  ttl             = 60\n}\n\n\n\nresource &quot;aws_acm_certificate_validation&quot; &quot;acm_cert&quot; {\n  provider                = aws.us-east-1\n  certificate_arn         = aws_acm_certificate.acm_cert.arn\n  validation_record_fqdns = [aws_route53_record.cert_validation.fqdn, aws_route53_record.cert_validation_alt.fqdn]\n}\n</code></pre>\n<!--kg-card-end: markdown--><h3 id=\"%E5%AE%8C%E6%88%90%E7%89%A9\">完成物</h3><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://github.com/kooooohe/aws-static-site-terraform\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">GitHub - kooooohe/aws-static-site-terraform</div><div class=\"kg-bookmark-description\">Contribute to kooooohe/aws-static-site-terraform development by creating an account on GitHub.</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://github.githubassets.com/favicons/favicon.svg\"><span class=\"kg-bookmark-author\">GitHub</span><span class=\"kg-bookmark-publisher\">kooooohe</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://opengraph.githubassets.com/80f9b6cf88eb523cba6c991040b6304a4474352493743ce1d8e891d3fbe167d7/kooooohe/aws-static-site-terraform\"></div></a></figure><p></p><p>Stateはローカルに保存するように作ってあるので、下記のようなファイルを作れば作成済みのS3に保存されるようになる</p><p>main.tf</p><pre><code>```json\nterraform {\n  backend \"s3\" {\n      bucket = \"mybucket\"\n      key    = \"path/to/my/key\"\n      region = \"us-east-1\"\n      }\n   }\n```</code></pre><p>特にModule化とかはしていないが、variables.tfの値を変更すればそれぞれのドメインで同等の環境を誰でも作ることができるようにはしてある。</p><h3 id=\"github-actions\">GitHub Actions</h3><p>S3のファイル更新とCloud Frontのキャッシュ削除をGitHub Actionsで行う。</p><p>※S3の更新からのLambda発火でinvalidation作成とかもやろうと思ったのだが、こっちのほうがシンプルなので採用</p><figure class=\"kg-card kg-bookmark-card\"><a class=\"kg-bookmark-container\" href=\"https://gist.github.com/kooooohe/2ce9cc174d29fae4f8ea92b8e8fd536c\"><div class=\"kg-bookmark-content\"><div class=\"kg-bookmark-title\">blog-terraform-aws-static-site-actions.yml</div><div class=\"kg-bookmark-description\">GitHub Gist: instantly share code, notes, and snippets.</div><div class=\"kg-bookmark-metadata\"><img class=\"kg-bookmark-icon\" src=\"https://github.githubassets.com/favicons/favicon.svg\"><span class=\"kg-bookmark-author\">Gist</span><span class=\"kg-bookmark-publisher\">262588213843476</span></div></div><div class=\"kg-bookmark-thumbnail\"><img src=\"https://github.githubassets.com/images/modules/gists/gist-og-image.png\"></div></a></figure><!--kg-card-begin: markdown--><pre><code class=\"language-yaml\">name: Deploy Production\n\non:\n  push:\n    branches: [ master ]\n\njobs:\n  build:\n\n    runs-on: ubuntu-latest\n\n    strategy:\n      matrix:\n        node-version: [14.x]\n\n    steps:\n    - uses: actions/checkout@v2\n    - name: Use Node.js ${{ matrix.node-version }}\n      uses: actions/setup-node@v1\n      with:\n        node-version: ${{ matrix.node-version }}\n    - run: yarn install\n    - run: yarn build\n\n    - name: Configure AWS credentials\n      uses: aws-actions/configure-aws-credentials@v1\n      with:\n        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}\n        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n        aws-region: ap-northeast-1\n    - run: aws s3 sync ./dist/ s3://${{ secrets.BUCKET_NAME }}/ --delete --exact-timestamps\n    - run: aws cloudfront create-invalidation --distribution-id ${{ secrets.DISTRIBUTION_ID}} --paths &quot;/*&quot; \n\n</code></pre>\n<!--kg-card-end: markdown-->","url":"https://ghost.tech.anti-pattern.co.jp/untitled-2/","canonical_url":null,"uuid":"8a2c04ea-cf4f-4f0d-b66c-578c97bfb776","page":null,"codeinjection_foot":null,"codeinjection_head":null,"codeinjection_styles":null,"comment_id":"60faaf3a3986b000013a3ba2","reading_time":5}},"pageContext":{"slug":"untitled-2"}},
    "staticQueryHashes": ["176528973","2358152166","2561578252","2731221146","4145280475"]}