sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

CloudFormation テンプレートのパラメータ値で作成するリソースを制御する

最近なんとなく JSON に慣れすぎて YAML が逆に見にくく感じてしまいます。那須です。

CloudFormation って指定したパラメータで AWS リソースを作成するだけだと思われがちですが、入力したパラメータ値によって作るリソースの設定を変えたり、そもそもリソースを作らないようにしたりすることもできます。 今回は EC2 インスタンスを作成する際の IP アドレスの指定を柔軟に変える方法をご紹介します。

 

やりたいこと

EC2 インスタンスを作成する時に、eth0 のネットワークインタフェースの IP アドレスを DHCP で自動割り当てにするか固定アドレスにするかをパラメータ値で制御したい

 

作ってみた

パラメータ IpAddress で IP アドレスを入力すると、その IP アドレスを持った NIC がついた EC2 インスタンスが作成されます。
条件 IsUseDhcp で、パラメータ IpAddress が空欄だったら true を返し、そうでなければ false を返すようにします。
リソースプロパティ PrivateIpAddress で、IsUseDhcp が true だったら PrivateIpAddress は作らない(プライベート IP アドレスは指定しない)、false だったらパラメータ IpAddress で PrivateIpAddress を作成します。 PrivateIpAddress を作らない場合は、IP アドレスは DHCP での自動割り当てになります。

{
    "Parameters": {
        "IpAddress": {
            "Type": "String"
        },(省略)
    },
    "Conditions": {
        "IsUseDhcp": {
            "Fn::Equals": [
                {
                    "Ref": "IpAddress"
                },
                ""
            ]
        }
    },
    "Resources": {
        "Ec2Instance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "NetworkInterfaces": [
                    {
                        "DeviceIndex": "0",
                        "PrivateIpAddress": {
                            "Fn::If": [
                                "IsUseDhcp",
                                {
                                    "Ref": "AWS::NoValue"
                                },
                                {
                                    "Ref": "IpAddress"
                                }
                            ]
                        },(省略)
}

実行結果の比較をしたかったですが、お題が悪かったせいかどちらにしても IP アドレスがついてしまって比較にならないので、今回は確認は省きます… EC2 インスタンス 1 台作成するだけのテンプレートは簡単に作れますし、どこかにサンプルがあるような気がするので、ぜひ試してみてください。

 

AWS ドキュメントで見るサンプル

条件分岐のサンプルテンプレートは AWS ドキュメントが公開されていますので、参考になると思います。
docs.aws.amazon.com

NIC 作成の際のドキュメントはこちら
docs.aws.amazon.com

 

AWS 使いこなしたい人!

AWS を使ったプロジェクトに参加してみたい方! ご連絡いただけると嬉しいです! www.beex-inc.com

IAM グループのインラインポリシーには気をつけよう

最近、CloudFormation というか JSON しか触ってないことに気がついた那須です。

諸事情によりベストプラクティスから離れて、IAM インラインポリシーを使って権限制御していたんですが、 その時によくわからない事象に遭遇したのでご紹介します。

 

IAM グループでインラインポリシー名を変更したい

そう、グループのインラインポリシー名を変更したいだけなんです。 でもそう簡単には変更させてもらえませんでした…

 

どういうことが起こったのか?

AWS 管理コンソールからグループのインラインポリシーを編集します。
f:id:nasrinjp1:20180611091342p:plain

で、名前を変えてポリシーの適用をすると、
f:id:nasrinjp1:20180611091351p:plain

エラーが発生しました: Maximum policy size of 5120 bytes exceeded for group test

え?

ポリシー名も文字数にカウントされるのか…と思って、ポリシー名を短くしても結果は同じでした。 ちなみに、このインラインポリシーの文字数をカウントすると 3913 文字でした。むしろあと 1000 文字くらいはいけるはず。

試しに、アクションを 1 つ増やして文字数を増やすと、今度は適用できてしまいました。

いや、マジで意味わからん…

 

整理してみた

発生してる事象

  • グループインラインポリシー名を変更しようとすると文字数制限にひっかかる

条件

  • インラインポリシー名を長くしても短くしても文字だけ変えて文字数同じでも事象発生
  • ポリシー内容の文字数が増えても事象は発生しない
  • ポリシー内容の文字数は 3913 文字

うーん、インラインポリシー名が原因か。

 

ふとひらめいた

これもしかして裏で新規作成されてる?

と思って、試しに文字数 100 字程度のインラインポリシーを作って同じグループに適用し、このポリシー名を変更したら問題なく変更できました。 でもポリシー量が多いインラインポリシー名は変更できないままです。

ポリシー内容の変更は直接そのポリシーを変更してくれるんですが、 ポリシー名変更をすると、裏でポリシーを新規作成し、元のポリシーを削除する動きをしているように見えます。 そして、ポリシーが新規作成されたタイミングで文字数制限にひっかかているようです。
AWS さんには確認をとっておりません。CLI ならできるかもしれませんがまだ確認してません

 

まとめ

IAM ベストプラクティスに従って管理ポリシーを使いましょう。
インラインポリシーを使う場合は、1 つのポリシーにいろんな内容を詰め込まずにできる限り小さい単位で分けましょう。

 

クラウド、面白いよ?

日々新しいことにチャレンジできるし、今やれば先頭集団にも交じることができる。 仕事なので大変な部分もあるけど、新しいことが好きな人ならクラウドエンジニアになるのはメリットの方が多いと思います。 というわけで、BeeX ではいつでもクラウドエンジニアを募集しております! 採用ページの写真はほぼスーツですが、お客様と会う時以外は私服ですし、勤務地も東京以外も ok ですよー www.beex-inc.com