公式ドキュメント

基本的な使い方

事前準備

実行パス設定

1
$ CF_PATH=file://~/cfsample

AWS CLIのprofileを指定(複数設定している場合)

必要に応じて、AWS CLIのprofileを指定

確認方法は、

1
2
cat ~/.aws/credentials
cat ~/.aws/config

必要に応じて設定する

1
export AWS_DEFAULT_PROFILE=XXXXX

共通項目の設定

ここでは、

  • serviceというタグにsampleと設定する
  • 共通のprefixとして**cfsample-**をつける
1
2
3
$ CF_TAG_KEY=service
$ CF_TAG_NAME=sample
$ CF_STACK_NAME_PREFIX=cfsample-

サンプル

サンプルとして、S3にsampleのbucketを作成してみる

S3.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
AWSTemplateFormatVersion: "2010-09-09"
Description: "Cloudformation Sample : Create Sample S3 Bucket"
Parameters:
  pStackNamePrefic:
    Description: "Common stack name prefix"
    Type: String
    Default: ""
  pBucketName:
    Description: "Bucket Name"
    Type: String
Resources:
  Bucket:
    Type: "AWS::S3::Bucket"
    DeletionPolicy: Retain
    Properties:
      BucketName: !Ref pBucketName
      AccessControl: Private
      VersioningConfiguration:
        Status: Suspended
      Tags:
        - Key: Name
          Value: !Ref pBucketName
  BucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref Bucket
      PolicyDocument:
        Version: "2012-10-17"
        Id: BucketPolicy
        Statement:
          - Sid: 1
            Action: "s3:PutObject"
            Effect: Allow
            Resource: !Sub
              - arn:aws:s3:::${sb}/*
              - { sb: !Ref Bucket }
            Principal:
              AWS: !Join
                - ""
                - - "arn:aws:iam::"
                  - !Ref AWS::AccountId
                  - ":root"
Outputs:
  BucketName:
    Value: !Ref Bucket
    Export:
      Name: !Join
          - ""
          - - !Ref pStackNamePrefic
            - BucketName
  BucketDomainName:
    Value: !GetAtt
        - Bucket
        - DomainName
    Export:
      Name: !Join
          - ""
          - - !Ref pStackNamePrefic
            - BucketDomainName
  BucketWebsiteURL:
    Value: !GetAtt
        - Bucket
        - WebsiteURL
    Export:
      Name: !Join
          - ""
          - - !Ref pStackNamePrefic
            - BucketWebsiteURL

テンプレートをAWS Cloudformation Designer で確認する。

こんな感じです。

cloudformation

作成(create-stack)

Reference : create-stack

  • CloudFormationのStackの名前(CF_STACK_NAME)
  • 定義ファイル指定(CF_FILE_NAME)
  • パラメータ指定(定義ファイル内で仕様)
    • pStackNamePrefic
    • pBucketName
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ CF_STACK_NAME=SampleBucket
$ CF_FILE_NAME=S3.yaml
$ aws cloudformation create-stack \
--tags Key=${CF_TAG_KEY},Value=${CF_TAG_NAME} \
--stack-name ${CF_STACK_NAME} \
--template-body ${CF_PATH}/${CF_FILE_NAME} \
--parameters \
ParameterKey=pStackNamePrefic,ParameterValue=${CF_STACK_NAME_PREFIX} \
ParameterKey=pBucketName,ParameterValue="techteco.sample.bucket" \
| jq .

結果

1
2
3
{
  "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXXXXX:stack/sampleBucket/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

一覧表示(list-stacks)

Reference : list-stacks

1
2
3
4
$ aws cloudformation list-stacks \
--region ap-northeast-1 \
--stack-status-filter CREATE_COMPLETE \
| jq -r .StackSummaries[].StackName

結果

1
sampleBucket

表示(describe-stacks)

Reference : describe-stacks

1
2
3
$ aws cloudformation describe-stacks \
--stack-name ${CF_STACK_NAME} \
| jq .

結果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
{
  "Stacks": [
    {
      "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXXXX:stack/sampleBucket/XXXXXXXXXXXXXXXXXXXXXXXXXX",
      "StackName": "sampleBucket",
      "Description": "Cloudformation Sample : Create Sample S3 Bucket",
      "Parameters": [
        {
          "ParameterKey": "pStackNamePrefic",
          "ParameterValue": "cfsample-"
        },
        {
          "ParameterKey": "pBucketName",
          "ParameterValue": "techteco.sample.bucket"
        }
      ],
      "CreationTime": "2018-02-01T14:53:26.062Z",
      "RollbackConfiguration": {},
      "StackStatus": "CREATE_COMPLETE",
      "DisableRollback": false,
      "NotificationARNs": [],
      "Outputs": [
        {
          "OutputKey": "BucketName",
          "OutputValue": "techteco.sample.bucket",
          "ExportName": "cfsample-BucketName"
        },
        {
          "OutputKey": "BucketDomainName",
          "OutputValue": "techteco.sample.bucket.s3.amazonaws.com",
          "ExportName": "cfsample-BucketDomainName"
        },
        {
          "OutputKey": "BucketWebsiteURL",
          "OutputValue": "http://techteco.sample.bucket.s3-website-ap-northeast-1.amazonaws.com",
          "ExportName": "cfsample-BucketWebsiteURL"
        }
      ],
      "Tags": [
        {
          "Key": "service",
          "Value": "sample"
        }
      ],
      "EnableTerminationProtection": false
    }
  ]
}

その他

全部は確認しきれてませんが、AWSのコンソールから出来ることの多くは実現できそうです。