AWSIaCProgram学習Python

WindowでAWS CDKを使ってPythonでInfra as codeを試してみる(その2)

AWS

前回の続きでAWS CDKで実際にコードを書いていきます。やっと本番です。

AWS CDKでコード書く前に

要件

それでは実際にコード書いてみますが、まず要件を確認して作成するAWSリソースについて整理します。

目的:Gitlabのバックアップを取得するためのS3 BucketとIAMユーザ(+Policy)を作成する
・空のS3 Bucketを作成
・バックアップ用のIAMユーザを作成して、S3へアップロードできる権限(Policy)を追加
・10日間で自動的に削除されるようにバケットポリシーを設定する

必要なモジュールをインストールする

はじめにAWS CDKからS3とIAMを操作するためのモジュールをインストールします。

> pip install aws_s3
> pip install aws_iam

AWS CDKでコード書く

次に実際のCDKのコードについてになります。
Pythonを使ったことがある方ならばCloudFormationに比べて読みやすいコードではないでしょうか。

PythonのCDKのサンプルはまだ少ないので、もし変な部分があった指摘いただければと思います。

今回はS3BucketやIAMユーザ、ポリシーはCDKで作成しますが、IAMユーザのAPIキーだけは手動で作成します。

※S3バケットは世界でユニークになる必要があるので変更してください

from aws_cdk import (
    aws_s3 as s3,
    aws_iam as iam,
    core
)

class AwsGitlabBkStack(core.Stack):

    def __init__(self, scope: core.Construct, construct_id: str,
                 **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        # Create s3 bucket for gitlab backup
        s3_bucket = s3.Bucket(self, 'syachiku-gitlab-bk',
                                bucket_name = "syachiku-gitlab-bk",
                                block_public_access = 
                                    s3.BlockPublicAccess(
                                        block_public_acls=True,
                                        block_public_policy=True,
                                        ignore_public_acls=True,
                                        restrict_public_buckets=True
                                    ),
                                lifecycle_rules = [{ "expiration": core.Duration.days(10),}],
                                removal_policy = core.RemovalPolicy.DESTROY
        )
        backup_user = iam.User(self, "gitlab-bk-user",
                user_name="gitlab-bk-user"
        )
        # Create IAM role for gitlab backup

        backup_policy_statement  = iam.PolicyStatement(
                                    actions = [
                                        "s3:PutObject",
                                        "s3:PutObjectAcl",
                                        "s3:GetObject",
                                        "s3:GetObjectAcl",
                                        "s3:DeleteObject"
                                     ],
                                    resources = [ s3_bucket.bucket_arn+"/*" ]
        )

        backup_policy = iam.Policy(self, "gitlab-bk-policy",
                                    policy_name = "gitlab-bk-polic",
                                    statements = [
                                        backup_policy_statement
                                    ],
                                    users = [
                                        backup_user
                                    ]
        )

AWS CDK実行

はじめてCDKを使う場合にはcdk synthを行ってCDK用のスタックを作成してから、cdk diffで確認→deployでDeployしてAWSリソースを作成します。

> cdk synth
> cdk diff
> cdk deploy

スタックの確認

Deployして問題が発生しなければ数分でAWS上にリソースが作成されます。完了したら作成されているかを確認してみます。

まずAWSコンソールにログオンしてから、CloudFormationでスタックに作成されていることを確認します。
CDKToolkitスタックはcdk synthで作成されたスタックでCDKコマンドでのリソースDeployに自動的に使われます。

スタックの詳細からリソースを開くと、今回CDKで作成されたAWSリソースを確認することができます。

S3バケットも作成されていることが確認できます。

さらにバケットポリシーで10日後に削除するように設定されていることも確認できます。

最後にIAMユーザについても作成されていて、CDKで合わせて作成したS3バケットへアクセスするためのポリシーも設定されていることが分かります。

まとめ

いかがだったでしょうか。今回作成したリソースくらいであれば手動で作ることも簡単ではありますが、「コードでインフラを定義する」というメリットを享受することができません。

「コードでインフラを定義する」ことで履歴が残り、更新箇所が明確になり、更新サイクルが順調に回り、自分以外のメンバーへコードを共有することで知見を広めることができるようになる、などの様々なメリットを感じることができます

AWS CDKでなくでもInfrastructure as Codeを試すことはできますが、オンプレのVMwareやOpenStackなどで試すよりはクラウドでのAWSやAzureなどのほうが試しやすいと思います。

Pythonのオススメ勉強方法

私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全です。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。

内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

今回は以上となります。

コメント