{"id":48888,"date":"2022-11-28T17:50:05","date_gmt":"2024-01-31T20:07:30","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/"},"modified":"2024-04-29T02:50:43","modified_gmt":"2024-04-28T18:50:43","slug":"%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/","title":{"rendered":"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u8fd9\u662f\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72React\u7b49\u9759\u6001\u7f51\u7ad9\u7684\u793a\u4f8b\u8fc7\u7a0b\u3002<\/p>\n<p>\u4f7f\u7528Terraform\u6784\u5efaS3\u548cCloudFront\uff0c\u7136\u540e\u4f7f\u7528CircleCI\u5c06\u6784\u5efa\u7684\u9759\u6001\u6587\u4ef6\u4e0a\u4f20\u5230S3\u3002<\/p>\n<p>\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u4e0d\u4f1a\u521b\u5efa\u4ece\u72ec\u7acb\u57df\u540d\u5230CloudFront\u7684\u522b\u540d\u8bb0\u5f55\u3002\u6211\u4eec\u7684\u76ee\u6807\u662f\u5728\u521b\u5efa\u4e86CloudFront\u5206\u53d1\u4e4b\u540e\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a *.cloudfront.net \u57df\uff0c\u4ee5\u4fbf\u53ef\u4ee5\u8bbf\u95ee\u9759\u6001\u7f51\u7ad9\u3002<\/p>\n<h1>\u571f\u5730\u6574\u6cbb<\/h1>\n<h2>AWS\u7684\u914d\u7f6e<\/h2>\n<p>\u5728\u4e2d\u56fd\u672c\u5730\u5316\uff0c\u53ea\u9700\u8981\u4e00\u4e2a\u9009\u9879\uff1a<br \/>\n\u6307\u5b9a\u533a\u57df\u3001\u56fa\u5b9aAWS\u63d0\u4f9b\u5546\u7248\u672c\uff0c\u6307\u5b9a\u4f7f\u7528\u7684\u51ed\u8bc1\uff08~\/.aws\/credentials\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">provider<\/span> <span class=\"s2\">\"aws\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">region<\/span>  <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n  <span class=\"nx\">profile<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n  <span class=\"nx\">version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"2.40.0\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u571f\u58e4\u914d\u7f6e<\/h2>\n<p>\u4e3a\u4e86\u5229\u7528\u7279\u5b9a\u7248\u672c\u7684\u56fa\u5b9a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.12.6\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>S3\u7684\u914d\u7f6e<\/h2>\n<p>\u521b\u5efa\u4e00\u4e2a\u6876\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_s3_bucket\"<\/span> <span class=\"s2\">\"connpass-map-front\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"connpass-map-front\"<\/span>\r\n  <span class=\"nx\">acl<\/span>    <span class=\"p\">=<\/span> <span class=\"s2\">\"private\"<\/span>\r\n  <span class=\"nx\">region<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"ap-northeast-1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h2>\u4e91\u524d\u7aef\u548c\u8eab\u4efd\u8bbf\u95ee\u7ba1\u7406(IAM)\u7684\u914d\u7f6e<\/h2>\n<p>\u4e00\u65e6\u4e0a\u4f20\u6240\u6709\u7684tf\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudfront_origin_access_identity\"<\/span> <span class=\"s2\">\"origin_access_identity\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">comment<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"origin access identity for s3\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudfront_distribution\"<\/span> <span class=\"s2\">\"s3_distribution\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">origin<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">domain_name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket_regional_domain_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">origin_id<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n\r\n    <span class=\"nx\">s3_origin_config<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">origin_access_identity<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_cloudfront_origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">cloudfront_access_identity_path<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">enabled<\/span>             <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"nx\">is_ipv6_enabled<\/span>     <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n  <span class=\"nx\">comment<\/span>             <span class=\"p\">=<\/span> <span class=\"s2\">\"connpass-map-front\"<\/span>\r\n  <span class=\"nx\">default_root_object<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"index.html\"<\/span>\r\n\r\n  <span class=\"nx\">default_cache_behavior<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">allowed_methods<\/span>  <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"DELETE\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"OPTIONS\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"PATCH\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"POST\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"PUT\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">cached_methods<\/span>   <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"GET\"<\/span><span class=\"p\">,<\/span> <span class=\"s2\">\"HEAD\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"nx\">target_origin_id<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n\r\n    <span class=\"nx\">forwarded_values<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">query_string<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">false<\/span>\r\n\r\n      <span class=\"nx\">cookies<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">forward<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"nx\">viewer_protocol_policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"allow-all\"<\/span>\r\n    <span class=\"nx\">min_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">0<\/span>\r\n    <span class=\"nx\">default_ttl<\/span>            <span class=\"p\">=<\/span> <span class=\"mi\">3600<\/span>\r\n    <span class=\"nx\">max_ttl<\/span>                <span class=\"p\">=<\/span> <span class=\"mi\">86400<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">restrictions<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">geo_restriction<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">restriction_type<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"none\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n\r\n  <span class=\"nx\">viewer_certificate<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">cloudfront_default_certificate<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"cf_to_s3_policy\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">statement<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">actions<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"s3:GetObject\"<\/span><span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">resources<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\/*\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">]<\/span>\r\n\r\n    <span class=\"nx\">principals<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">type<\/span>        <span class=\"p\">=<\/span> <span class=\"s2\">\"AWS\"<\/span>\r\n      <span class=\"nx\">identifiers<\/span> <span class=\"p\">=<\/span> <span class=\"p\">[<\/span><span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_cloudfront_origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">origin_access_identity<\/span><span class=\"p\">.<\/span><span class=\"nx\">iam_arn<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_s3_bucket_policy\"<\/span> <span class=\"s2\">\"cf-to-s3\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">bucket<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n  <span class=\"nx\">policy<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${data<\/span><span class=\"p\">.<\/span><span class=\"nx\">aws_iam_policy_document<\/span><span class=\"p\">.<\/span><span class=\"nx\">cf_to_s3_policy<\/span><span class=\"p\">.<\/span><span class=\"nx\">json<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u8bbe\u7f6eOrigin Access Identity<\/h3>\n<p>\u4e3a\u4e86\u53ea\u5141\u8bb8\u4eceCloudFront\u8bbf\u95eeS3\uff0c\u6211\u4eec\u8fdb\u884c\u4e86Origin Access Identity\u7684\u914d\u7f6e\u3002<\/p>\n<p>\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aorigin_access_identity\u7684\u8d44\u6e90\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudfront_origin_access_identity\"<\/span> <span class=\"s2\">\"origin_access_identity\"<\/span> <span class=\"p\">{<\/span>\r\n<\/code><\/pre>\n<p>\u521b\u5efa\u4e0e\u8be5\u8d44\u6e90\u5173\u8054\u7684\u7b56\u7565\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">data<\/span> <span class=\"s2\">\"aws_iam_policy_document\"<\/span> <span class=\"s2\">\"cf_to_s3_policy\"<\/span> <span class=\"p\">{<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u521b\u5efa\u7684\u7b56\u7565\u4e0e\u521b\u5efa\u7b56\u7565\u7684 S3 \u5b58\u50a8\u6876\u5173\u8054\u8d77\u6765\u3002\u8fd9\u6837\u5c31\u53ef\u4ee5\u901a\u8fc7 CloudFront \u6765\u8bbf\u95ee S3\uff0c\u5e76\u4e14\u53ea\u80fd\u901a\u8fc7 CloudFront \u8bbf\u95ee\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_s3_bucket_policy\"<\/span> <span class=\"s2\">\"cf-to-s3\"<\/span> <span class=\"p\">{<\/span>\r\n<\/code><\/pre>\n<h3>\u521b\u5efaCloudFront\u5206\u53d1<\/h3>\n<pre class=\"post-pre\"><code><span class=\"k\">resource<\/span> <span class=\"s2\">\"aws_cloudfront_distribution\"<\/span> <span class=\"s2\">\"s3_distribution\"<\/span> <span class=\"p\">{<\/span>\r\n<\/code><\/pre>\n<p>\u5728distribution\u7684\u8d44\u6e90\u4e2d\uff0c\u503c\u5f97\u7279\u522b\u63d0\u5230\u7684\u662f\u6307\u5b9as3\u5b58\u50a8\u6876\u7684\u4f4d\u7f6e\uff08\u5982origin\uff09\uff0c\u5e94\u8be5\u5c06\u521b\u5efa\u7684\u5b58\u50a8\u6876\u8fdb\u884c\u6307\u5b9a\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nx\">origin<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">domain_name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">bucket_regional_domain_name<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n    <span class=\"nx\">origin_id<\/span>   <span class=\"p\">=<\/span> <span class=\"s2\">\"<\/span><span class=\"k\">${<\/span><span class=\"nx\">aws_s3_bucket<\/span><span class=\"p\">.<\/span><span class=\"nx\">connpass-map-front<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"k\">}<\/span><span class=\"s2\">\"<\/span>\r\n<\/code><\/pre>\n<p>\u5047\u8bbe\u6784\u5efa\u7684\u6587\u4ef6\u7ec4\u4e2d\u542b\u6709 index.html\uff0c\u5c06 default_root_object \u8bbe\u7f6e\u4e3a index.html\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nx\">default_root_object<\/span> <span class=\"err\">=<\/span> <span class=\"s2\">\"index.html\"<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u4e0d\u4f7f\u7528\u81ea\u5b9a\u4e49\u57df\u540d\uff0c\u5c06\u4fdd\u6301\u9ed8\u8ba4\u7684viewer_certificate\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"nx\">viewer_certificate<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">cloudfront_default_certificate<\/span> <span class=\"p\">=<\/span> <span class=\"kc\">true<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u8fd0\u884c terraform apply\uff0c\u4fbf\u4f1a\u521b\u5efa s3 \u548c cloudfront\u3002<\/p>\n<h2>\u5bf9tfstate\u6587\u4ef6\u8fdb\u884c\u7ba1\u7406<\/h2>\n<p>\u6267\u884cterraform apply\u4f1a\u5728\u672c\u5730\u521b\u5efatfstate\u6587\u4ef6\uff0c\u4f46\u662f\u901a\u5e38\u6700\u4f73\u5b9e\u8df5\u662f\u5c06tfstate\u6587\u4ef6\u5b58\u50a8\u5728s3\u6216terraform cloud\u4e2d\u8fdb\u884c\u7ba1\u7406\uff08\u5982\u679c\u662f\u56e2\u961f\u5f00\u53d1\u7684\u8bdd\uff09\u3002<\/p>\n<p>\u6211\u5011\u5c07\u5617\u8a66\u4f7f\u7528Terraform Cloud\u9032\u884ctfstate\u7684\u7ba1\u7406\u3002<br \/>\n\u64cd\u4f5c\u6d41\u7a0b\u5982\u4e0b\uff1a<\/p>\n<p>1) [\u6d4f\u89c8\u5668] \u5728 Terraform Cloud \u4e0a\u521b\u5efa\u8d26\u53f7\u3002<br \/>\n2) [\u6d4f\u89c8\u5668] \u521b\u5efa\u4e00\u4e2a\u7ec4\u7ec7\u3002<br \/>\n3) [\u6d4f\u89c8\u5668] \u521b\u5efa\u7528\u4e8e\u8bbf\u95ee Terraform Cloud \u7684\u4ee4\u724c\u3002<br \/>\n4) [\u672c\u5730] \u5c06\u521b\u5efa\u7684\u4ee4\u724c\u5199\u5165 $HOME\/.terraformrc \u6587\u4ef6\u4e2d\u3002<br \/>\n5) [\u672c\u5730] \u914d\u7f6e\u4ee5\u5c06 tfstate \u5b58\u50a8\u5230 Terraform Cloud\u3002<br \/>\n6) [\u6d4f\u89c8\u5668] \u5728\u5de5\u4f5c\u533a\u8bbe\u7f6e\u4e2d\u5c06 AWS \u64cd\u4f5c\u66f4\u6539\u4e3a\u4ece\u672c\u5730\u8fdb\u884c\u3002<br \/>\n7) [\u672c\u5730] \u8fd0\u884c terraform init \u547d\u4ee4\u3002<\/p>\n<h3>1. \u4e00\u5230\u4e09<br \/>\n2. \u7b2c\u4e00\u5230\u7b2c\u4e09<br \/>\n3. 1\u81f33<\/h3>\n<p>\u4ee5\u4e0b\u7684\u6587\u7ae0\u4e2d\u5305\u542b\u4e861\u52303\u7684\u8be6\u7ec6\u6d41\u7a0b\uff0c\u5e76\u9644\u6709\u56fe\u7247\uff0c\u8bf7\u70b9\u51fb\u4ee5\u4e0b\u94fe\u63a5\u67e5\u770b:<br \/>\nhttps:\/\/dev.classmethod.jp\/cloud\/aws\/manage-tfstate-terraform-cloud\/<\/p>\n<h3>\u5c06\u57283\u4e2d\u521b\u5efa\u7684\u4ee4\u724c\u5199\u5165$HOME\/terraformrc\u6587\u4ef6\u3002<\/h3>\n<pre class=\"post-pre\"><code><span class=\"nx\">credentials<\/span> <span class=\"s2\">\"app.terraform.io\"<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">token<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"\u4f5c\u6210\u3057\u305f\u30c8\u30fc\u30af\u30f3\u3092\u3053\u3053\u306b\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h3>5) \u5c06 [\u672c\u5730] tfstate \u8bbe\u7f6e\u4e3a\u4fdd\u5b58\u5728 Terraform Cloud \u4e2d\u3002<\/h3>\n<p>\u5728 terraform.tf \u6587\u4ef6\u4e2d\u6dfb\u52a0\u914d\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">terraform<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">required_version<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"0.12.6\"<\/span>\r\n\r\n  <span class=\"nx\">backend<\/span> <span class=\"s2\">\"remote\"<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">organization<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"connpass-map-front\"<\/span>\r\n\r\n    <span class=\"nx\">workspaces<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"nx\">name<\/span> <span class=\"p\">=<\/span> <span class=\"s2\">\"connpass-map-front-workspace\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h3>6) \u5728[\u6d4f\u89c8\u5668]\u7684\u5de5\u4f5c\u7a7a\u95f4\u8bbe\u7f6e\u4e2d\uff0c\u5c06AWS\u7684\u64cd\u4f5c\u66f4\u6539\u4e3a\u4ece\u672c\u5730\u6267\u884c\u3002<\/h3>\n<p>\u5982\u679c\u5728\u672c\u5730\u8fd0\u884cterraform\uff0caws\u7684\u51ed\u8bc1\u5c06\u901a\u8fc7\u67e5\u627e\u672c\u5730\u7684 ~\/.aws\/credentials \u6587\u4ef6\u6765\u83b7\u53d6\u3002\u5982\u679c\u4f7f\u7528terraform cloud\uff0c\u53ef\u4ee5\u5728\u5de5\u4f5c\u533a\u8bbe\u7f6e\u4e2d\u9009\u62e9\u662f\u4eceterraform cloud\u8fd8\u662f\u4ece\u672c\u5730\u6267\u884caws\u64cd\u4f5c\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8844913a08637a6c295f\/48-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2019-12-01 13.14.48.png\" \/><\/div>\n<p>\u5f53\u6b64\u5904\u8bbe\u7f6e\u4e3a\u8fdc\u7a0b\uff08\u9ed8\u8ba4\u503c\uff09\u65f6\uff0c\u6267\u884c terraform apply \u6216 terraform plan \u65f6\u5c06\u4e0d\u518d\u67e5\u770b\u672c\u5730\u7684 ~\/.aws\/credentials \u6587\u4ef6\uff0c\u4ece\u800c\u5bfc\u81f4\u4ee5\u4e0b\u9519\u8bef\u3002<\/p>\n<pre class=\"post-pre\"><code>Error: No valid credential sources found for AWS Provider.\r\n        Please see https:\/\/terraform.io\/docs\/providers\/aws\/index.html for more information on\r\n        providing credentials for the AWS Provider\r\n\r\n<\/code><\/pre>\n<p>\u5982\u679c\u5c06\u5176\u8bbe\u7f6e\u4e3a\u672c\u5730(Local)\uff0c\u5219\u53ef\u4ee5\u4ece\u672c\u5730\u6267\u884cAWS\u64cd\u4f5c\uff0c\u5e76\u4e14\u4ec5\u7531terraform cloud\u8d1f\u8d23\u7ba1\u7406tfstate\uff0c\u56e0\u6b64\u4e0d\u4f1a\u518d\u51fa\u73b0\u4e0a\u8ff0\u9519\u8bef\u3002<\/p>\n<h3>7) \u3010\u672c\u5730\u3011\u8fd0\u884c terraform init\u3002<\/h3>\n<p>\u5982\u679c\u53ef\u4ee5\u8bbf\u95eeTerraform Cloud\uff0c\u90a3\u4e48&#8221;init&#8221;\u547d\u4ee4\u5c06\u6210\u529f\u6267\u884c\u3002\u73b0\u5728\uff0c\u5982\u679c\u8fd0\u884c&#8221;terraform apply&#8221;\uff0ctfstate\u6587\u4ef6\u5c06\u4f1a\u4e0a\u4f20\u5230Terraform Cloud\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>$ terraform init\r\n\r\nInitializing the backend...\r\n\r\nSuccessfully configured the backend \"remote\"! Terraform will automatically\r\nuse this backend unless the backend configuration changes.\r\n\r\nInitializing provider plugins...\r\n- Checking for available provider plugins...\r\n- Downloading plugin for provider \"aws\" (hashicorp\/aws) 2.40.0...\r\n\r\nTerraform has been successfully initialized!\r\n\r\nYou may now begin working with Terraform. Try running \"terraform plan\" to see\r\nany changes that are required for your infrastructure. All Terraform commands\r\nshould now work.\r\n\r\nIf you ever set or change modules or backend configuration for Terraform,\r\nrerun this command to reinitialize your working directory. If you forget, other\r\ncommands will detect it and remind you to do so if necessary.\r\n<\/code><\/pre>\n<p>\u73b0\u5728\u73af\u5883\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\uff0c\u4f46\u5173\u952e\u7684S3\u5b58\u50a8\u6876\u91cc\u8fd8\u6ca1\u6709\u5185\u5bb9\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u5728CircleCI\u4e2d\u914d\u7f6e\u4e00\u4e2a\u6d41\u7a0b\uff0c\u5c06\u6253\u5305\u7684\u9759\u6001\u6587\u4ef6\u4e0a\u4f20\u5230S3\u3002<\/p>\n<h1>\u5706\u5708\u6301\u7eed\u96c6\u6210<\/h1>\n<p>\u5047\u8bbe\u5df2\u7ecf\u4f7f\u7528 npm run build \u547d\u4ee4\u6784\u5efa\u4e86\u6587\u4ef6\uff0c\u5e76\u5c06\u5176\u653e\u7f6e\u5728 \/build \u6587\u4ef6\u5939\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"m\">2.1<\/span>\r\n<span class=\"na\">orbs<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">aws-s3<\/span><span class=\"pi\">:<\/span> <span class=\"s\">circleci\/aws-s3@1.0.11<\/span>\r\n<span class=\"na\">executors<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">default<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">docker<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">circleci\/node:12<\/span>\r\n    <span class=\"na\">working_directory<\/span><span class=\"pi\">:<\/span> <span class=\"s\">~\/repo<\/span>\r\n<span class=\"na\">commands<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">npm_install<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">restore_cache<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">keys<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">v2-dependencies-{{ checksum \"package.json\" }}<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">v2-dependencies-<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">npm install<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">save_cache<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">paths<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">node_modules<\/span>\r\n          <span class=\"na\">key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v2-dependencies-{{ checksum \"package.json\" }}<\/span>\r\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">executor<\/span><span class=\"pi\">:<\/span> <span class=\"s\">default<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">checkout<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">npm_install<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">run<\/span><span class=\"pi\">:<\/span> <span class=\"s\">npm run build<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">persist_to_workspace<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">root<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\r\n          <span class=\"na\">paths<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">*\"<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">.*\"<\/span>\r\n  <span class=\"na\">deploy<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">executor<\/span><span class=\"pi\">:<\/span> <span class=\"s\">default<\/span>\r\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">attach_workspace<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">at<\/span><span class=\"pi\">:<\/span> <span class=\"s\">~\/repo<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">aws-s3\/sync<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">from<\/span><span class=\"pi\">:<\/span> <span class=\"s\">build<\/span>\r\n          <span class=\"na\">to<\/span><span class=\"pi\">:<\/span> <span class=\"s\">s3:\/\/connpass-map-front<\/span>\r\n          <span class=\"na\">overwrite<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n<span class=\"na\">workflows<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"m\">2<\/span>\r\n  <span class=\"na\">build-deploy<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">build<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">deploy<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">requires<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"pi\">-<\/span> <span class=\"s\">build<\/span>\r\n          <span class=\"na\">filters<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span>\r\n              <span class=\"na\">only<\/span><span class=\"pi\">:<\/span>\r\n                <span class=\"pi\">-<\/span> <span class=\"s\">\/feature.*\/<\/span>\r\n                <span class=\"pi\">-<\/span> <span class=\"s\">master<\/span>\r\n\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u4f7f\u7528\u4e86aws-s3\u7684orbs\uff0c\u56e0\u6b64\u53ef\u4ee5\u5c06build\u6587\u4ef6\u5939\u4e2d\u7684\u6587\u4ef6\u4e0econnpass-map-front\u7684\u5b58\u50a8\u6876\u8fdb\u884c\u540c\u6b65\u3002<\/p>\n<pre class=\"post-pre\"><code>      <span class=\"pi\">-<\/span> <span class=\"s\">aws-s3\/sync<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">from<\/span><span class=\"pi\">:<\/span> <span class=\"s\">build<\/span>\r\n          <span class=\"na\">to<\/span><span class=\"pi\">:<\/span> <span class=\"s\">s3:\/\/connpass-map-front<\/span>\r\n          <span class=\"na\">overwrite<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n<\/code><\/pre>\n<p>\u53e6\u5916\uff0c\u4e3a\u4e86\u4f7f\u7528\u6b64s3\u7684orbs\uff0c\u60a8\u9700\u8981\u4e8b\u5148\u5728circleci\u7684\u73af\u5883\u53d8\u91cf\u4e2d\u8bbe\u7f6eAWS_ACCESS_KEY_ID\u3001AWS_SECRET_ACCESS_KEY\u3001AWS_REGION\u3002<\/p>\n<p>\u6bcf\u6b21\u5c06\u5206\u652f\u5408\u5e76\u5230\u4e3b\u5206\u652f\u65f6\uff0c\u6700\u65b0\u7684\u6346\u7ed1\u6587\u4ef6\u5c06\u901a\u8fc7\u6b64CircleCI\u914d\u7f6e\u4e0a\u4f20\u5230S3\u3002<\/p>\n<p>\u5728\u4e0a\u4f20\u5b8c\u6210\u4e4b\u540e\uff0c\u60a8\u53ef\u4ee5\u8bbf\u95ee\u6240\u521b\u5efa\u7684CloudFront\u5206\u53d1\u7684\u57df\u540d\uff08*.cloudfront.net\uff09\uff0c\u6765\u67e5\u770b\u5df2\u4e0a\u4f20\u7684\u9759\u6001\u7f51\u7ad9\u3002<\/p>\n<h1>\u8bf7\u4f60\u63d0\u4f9b\u4ee5\u4e0b\u5185\u5bb9\u7684\u4e2d\u6587\u672c\u5730\u8bed\u8a00\u91ca\u4e49\uff0c\u53ea\u9700\u8981\u4e00\u4e2a\u9009\u9879\uff1a<\/h1>\n<p>\u53c2\u8003\uff1a<\/p>\n<p>1. https:\/\/qiita.com\/natsumisawa\/items\/404217208ab1c96d8719<br \/>\n&#8211; \u8fd9\u4e2a\u7f51\u5740\u662f\u5173\u4e8e\u5982\u4f55\u4f7f\u7528Terraform\u7ba1\u7406AWS\u8d44\u6e90\u72b6\u6001\u7684\u6587\u7ae0\u3002<\/p>\n<p>2. https:\/\/dev.classmethod.jp\/cloud\/aws\/manage-tfstate-terraform-cloud\/<br \/>\n&#8211; \u8fd9\u4e2a\u7f51\u5740\u662f\u5173\u4e8e\u4f7f\u7528Terraform Cloud\u7ba1\u7406AWS\u8d44\u6e90\u72b6\u6001\u7684\u6587\u7ae0\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u8fd9\u662f\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72React\u7b49\u9759\u6001\u7f51\u7ad9\u7684\u793a\u4f8b\u8fc7\u7a0b\u3002 \u4f7f\u7528Terraform [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-48888","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528circleci\u548cterraform\u90e8\u7f72\u9759\u6001\u7f51\u9875\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u8fd9\u662f\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72React\u7b49\u9759\u6001\u7f51\u7ad9\u7684\u793a\u4f8b\u8fc7\u7a0b\u3002 \u4f7f\u7528Terraform [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528circleci\u548cterraform\u90e8\u7f72\u9759\u6001\u7f51\u9875\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-31T20:07:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-28T18:50:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8844913a08637a6c295f\/48-0.png\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/\",\"name\":\"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-01-31T20:07:30+00:00\",\"dateModified\":\"2024-04-28T18:50:43+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528circleci\u548cterraform\u90e8\u7f72\u9759\u6001\u7f51\u9875\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875","og_description":"\u9996\u5148 \u8fd9\u662f\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72React\u7b49\u9759\u6001\u7f51\u7ad9\u7684\u793a\u4f8b\u8fc7\u7a0b\u3002 \u4f7f\u7528Terraform [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528circleci\u548cterraform\u90e8\u7f72\u9759\u6001\u7f51\u9875\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-01-31T20:07:30+00:00","article_modified_time":"2024-04-28T18:50:43+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8844913a08637a6c295f\/48-0.png"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"4 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/","name":"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-01-31T20:07:30+00:00","dateModified":"2024-04-28T18:50:43+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528CircleCI\u548cTerraform\u90e8\u7f72\u9759\u6001\u7f51\u9875"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8circleci%e5%92%8cterraform%e9%83%a8%e7%bd%b2%e9%9d%99%e6%80%81%e7%bd%91%e9%a1%b5%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48888","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=48888"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48888\/revisions"}],"predecessor-version":[{"id":76310,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/48888\/revisions\/76310"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=48888"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=48888"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=48888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}