Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CloudFormationアンチパターンのお話

 CloudFormationアンチパターンのお話

Yuki_Kurono

August 24, 2022
Tweet

More Decks by Yuki_Kurono

Other Decks in Programming

Transcript

  1. CloudFormationアンチパターンのお話
    JAWS-UG 名古屋 LT未経験者にも登壇して貰いたいLT会
    2022.08.24 Wed
    yuki kurono

    View Slide

  2. 自己紹介
    名前 黒野 雄稀
    AWS歴 

    ・約3年

    ・2022 APN ALL AWS Certifications Engineer

    所属 アイレット株式会社
    普段の業務

    ・基幹系インフラ構築

    ・システム運用構築


    View Slide

  3. CloudFormationについて
    AWSで提供されるInfrastructure as Code(IaC)サービス
    IaC = コードとしてインフラを構築
    テンプレートと呼ばれるファイルにコードを記述していく。
    ● 記述方法
    ○ Json
    ○ YAML
    AWSTemplateFormatVersion:
    '2010-09-09'
    Resources:
    FirstVPC:
    Type: AWS::EC2::VPC
    Properties:
    CidrBlock: 10.0.0.0/16

    View Slide

  4. CloudFormationアンチパターン

    View Slide

  5. CFnと手動変更の並行管理
    CFnで作成したリソースを手動で変更することもできます。

    しかし、手動変更部分の管理が発生しコード管理が煩雑になるのでやめよう

    (どうしても手動変更したいなら、もうCFnは捨てる。)

    ドリフト発生

    View Slide

  6. ExportとImportValue
    "Resources" : {
    "WebServerInstance": {
    "Type": "AWS::EC2::Instance",
    "Properties": {
    "InstanceType" : "t2.micro",
    "NetworkInterfaces" : [{
    "SubnetId" : { "Fn::ImportValue" : "WebSubnet" },
    "GroupSet" : [ { "Fn::ImportValue" : "WebSG" } } ],
    Outputs:
    WebSubnet01:
    Description: Web Public Subnet
    Value: !Ref WebSubnet
    Export:
    Name: "WebSubnet"
    WebSG01:
    Description: Web Security Group
    Value: !Ref WebSG
    Export:
    Name: "WebSG"
    WebApp.yaml
    Network.yaml
    Export、ImportValueを使用することで、スタック(テンプレートファイル)間で値の受け渡しが
    可能。

    任意の名前を使用してExportできます。


    View Slide

  7. ExportとImportValue Outputs:
    WebSubnet:
    Description: Web Public Subnet
    Value: !Ref WebSubnet
    Export:
    Name: !Sub "${AWS::StackName}-WebSubnet"
    WebSG:
    Description: Web Security Group
    Value: !Ref WebSG
    Export:
    Name: !Sub "${AWS::StackName}-WebSG"
    PrivateSubnet:
    Description: Private Subnet
    Value: !Ref PrivateSubnet
    Export:
    Name: !Sub "${AWS::StackName}-PrivateSubnet"
    PrivateSG:
    Description: Private Security Group
    Value: !Ref WebPrivateSG
    Export:
    Name: !Sub "${AWS::StackName}-PrivateSG"
    DatabaseSubnet:
    Description: Database Subnet
    Value: !Ref DatabaseSubnet
    Export:
    Name: !Sub "${AWS::StackName}-DatabaseSubnet"
    DatabaseSG:
    Description: Database Security Group
    Value: !Ref DatabaseSG
    Export:
    Name: !Sub "${AWS::StackName}-DatabaseSG"
    Web02Subnet:
    Description: Web Public Subnet02
    Value: !Ref Web02Subnet
    Export:
    Name: !Sub "${AWS::StackName}-Web02Subnet"
    Web02SG:
    Description: Web02 Security Group
    Value: !Ref WebSG
    Export:
    Name: !Sub "${AWS::StackName}-Web02SG"
    Private02Subnet:
    Description: Private02 Subnet
    Value: !Ref Private02Subnet
    Export:
    Name: !Sub "${AWS::StackName}-Private02Subnet"
    Private02SG:
    Description: Private02 Security Group
    Value: !Ref Private02SG
    Export:
    Name: !Sub "${AWS::StackName}-Private02SG"
    Database02Subnet:
    Description: Database02 Subnet
    Value: !Ref Database02Subnet
    Export:
    Name: !Sub "${AWS::StackName}-Database02Subnet"
    Database02SG:
    Description: Database02 Security Group
    Value: !Ref Database02SG
    Export:
    Name: !Sub "${AWS::StackName}-Database02SG"
    Web03Subnet:
    Description: Web Public Subnet03
    Value: !Ref Web03Subnet
    Export:
    Name: !Sub "${AWS::StackName}-Web03Subnet"
    Web03SG:
    Description: Web03 Security Group
    Value: !Ref WebSG
    Export:
    Name: !Sub "${AWS::StackName}-Web03SG"
    Private03Subnet:
    Description: Private03 Subnet
    Value: !Ref Private03Subnet
    Export:
    Name: !Sub "${AWS::StackName}-Private03Subnet"
    Private03SG:
    Description: Private03 Security Group
    Value: !Ref Private03SG
    Export:
    Name: !Sub "${AWS::StackName}-Private03SG"
    Database03Subnet:
    Description: Database03 Subnet
    Value: !Ref Database03Subnet
    Export:
    Name: !Sub "${AWS::StackName}-Database03Subnet"
    Database03SG:
    Description: Database03 Security Group
    Value: !Ref Database03SG
    Export:
    Name: !Sub "${AWS::StackName}-Database03SG"
    Network.yaml
    Export名どれ。。。?
    AWSリソース数が膨大な場合には、Export名を管理するのがほ
    ぼ不可能になる。。・


    View Slide

  8. AccountIDとRegionのハードコート
    !Sub 'arn:aws:ec2:${AWS::Region}:${AWS::AccountId}:vpc/${vpc}'
    !Sub 'arn:aws:ec2:ap-northeast-1:12345678910:vpc/${vpc}'
    稀にMappingsやParametersでアカウントID、リージョンを入力しているテンプレートがあるが
    環境が変わった時に動かないなど中々大変。。


    疑似パラメーターを使用することで、柔軟性が得られるので積極的に使っていこう。


    View Slide

  9. まとめ
    ● まずはCFn始めてみよう。

    ○ その他のIaCに比べ、学習コストは低いと思います!

    ○ 実際に使ってみて分かることの方が多いと思う。


    ● Count Macroというマクロ機能を使うとFor文を実現できるみたいなのでまた遊んでみよ
    うと思います。


    ● 機能追加されて、使いやすくなることを期待してます!!


    View Slide

  10. 参考
    - Qiita -
    https://qiita.com/kurono/items/b3362e16a3a396b9b2a7
    - 公式ドキュメント -
    https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/outputs-section-structure.html
    https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-importvalue.html
    https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-sub.html
    https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html

    View Slide

  11. ご清聴ありがとうございま
    した.

    View Slide