2022年4月10日日曜日

Lambda内部で生成したファイルをS3に圧縮して保管してみる。

課題:
Lambda内部で生成したテキストファイルをS3側で圧縮して保管できるか試してみる。



■IAM


1)ポリシーを作成する。

















########### サンプル ##############

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Action": [

                "s3:PutObject",

                "s3:PutObjectAcl"

            ],

            "Resource": "arn:aws:s3:::バケット名/*”

        }

    ]

}


################################



2)IAMロールの作成を行う。

上記で作成したIAMポリシーを選択













■S3


1)以下、バケットポリシーの編集を行う。























########## サンプルコード ################

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Effect": "Allow",

            "Principal": {

                "AWS": "arn:aws:iam::アカウントID:role/”iam role名”

            },

            "Action": [

                "s3:PutObject",

                "s3:PutObjectAcl",

                "s3:GetObject",

                "s3:GetObjectAcl",

                "s3:AbortMultipartUpload"

            ],

            "Resource": "arn:aws:s3:::バケット名/*”

        }

    ]

}

#####################################




■Lambda


1)ソースコード入力




















###########サンプルコード########

import boto3

from datetime import datetime

import gzip

import shutil

 

print('Loading function')                                                                                      # ②Functionのロードをログに出力

 

s3 = boto3.resource('s3')                                                                                    # ③S3オブジェクトを取得

 

# ④Lambdaのメイン関数

def lambda_handler(event, context):

    bucket = ‘バケット名’                                                                                     # ⑤バケット名を指定

    prefix = 'test_' + datetime.now().strftime('%Y-%m-%d-%H-%M-%S')         # ⑥保存するファイルのprefixを指定

    file_name = prefix + '.txt'                                                                                 # ⑦保存するテキストファイル名

    key = prefix + '.txt.gz'                                                                                      # ⑧保存するgzファイル名

    file_contents = 'Lambda test'                                                                          # ⑨ファイルに保存するテキストの内容

    

# ⑩/tmpにtxtファイルを出力

    with open('/tmp/' + file_name, 'w') as f:

        f.write(file_contents)

    

# ⑪/tmpにgzファイルを作成

    with open('/tmp/' + file_name, 'rb') as f_in:

        with gzip.open('/tmp/' + key , 'wb') as f_out:

            shutil.copyfileobj(f_in, f_out)

    

    obj = s3.Object(bucket,key)                                                                           # ⑫バケット名とパスを指定

    obj.upload_file( '/tmp/' + key )                                                                       # ⑬gzファイルをS3に出力

    return

###############################



2)Lambda側で上記で作成したIAM Roleを選択する。














































3)Lambda側で実行後、S3のバケットで確認する


結果:

Lambda内部で生成したテキストファイルをS3側で圧縮して保管していることが把握できる。







2022年3月9日水曜日

ECS(Fargate)をベースにした、CICDの構成をterraformにしてみる。

以下、簡単なアークテクトについての特徴になる。


特徴:
1.GitHub上に、コードをpushすると自動的にCodePipeline経由でECS(Faragate)のデプロイを行う。
2.デプロイ方法については、BlueGreenデプロイにする。
3.ログについては、sidecar container経由でkinesis firehouseをブリッジしてS3のバケットに
保管する仕組みにする。
4.コンテナについては、auto scalingが可能にしている。



2022年2月25日金曜日

terraform(CodePipelineでGithubの認証でNGになる件)

事象:
以下のような、Git関連の認証エラーが出たので設定方法を探る。














provider.tfの修正:


①gIthubを追記





















CodePipeline.tf.の修正:


①fileにGituHubのシークレットファイルのパスを指定

②0AuthTokenの追記を行う



























シークレットファイル用のフォルダとファイルを作成

   ->ファイル名:aaaaの中身には、Githubから






























aaaaファイル:中身には、GithubPersomal access tokenから取得したトークンをペーストしただけ。






CodeDeploy(BlueGreen Deployment(再))

ざっくり構成図:















CodeDeploy(BlueGreen Deploymentの作成済み):

①運用中のポート番号                            :80

新リリース前(bata)のポート番号  :8080



まずは、運用中の状態(更新前のソースコード)を確認








リリース前の状態(更新予定のソースjコード)を確認

    ->修正したソースコードが変更されていることが把握できる。








3)以下の現時点の状態。

      ->運用中の環境では、修正した内容は反映されてない



4)以下の行為で、運用中の環境に反映される。

   ->元のタスクセットの終了ボタンを押す

   ->1時間後(猶予期間)に自動的に反映される。


















5)ECSを確認すると、以下、現行のバージョンとリリース予定のバージョンのタスクが

立ち上がっていることが把握できる。

















6)Deployの全てのステップが完了した。





















結果:

現環境(ポート番号:80)にアクセスすると、修正したソースコードに差し代わっていることが把握できた。





CodePipeline(artifactfileが参照できない件)

事象:
実施すると、以下のエラーがでてDeployが失敗におわ

















以下のソースコードに2点を用意:

1)taskdef.json 

     ->デプロイするタスク定義の設定を記述したファイル

2)appspec.yml

     ->ECSサービスの設定情報が記載されたファイル













BuildSpecに以下、赤枠を追記する

  ->s3に出力したのもが後にCodeDeployで使用する。
































CodePipeline(設定編)

 用途:CIサービス(例:CodeBuild)とCDサービス(CodeDeploy)を連携させるための利用。



パイプラインを作成する








2)パイライン名     :記載する。

3)既存のサービスロール :Pipeline用のIamRoleを作成済みなので、既存のサービスロールを選択する。

4)ロールのARN    :作成済みのIamRoleを選択

5)次へを押す























6)ソースプロバイダ:今回は、GitHubを選択

7)GitHubに接続を押して、認証を行う。


























8)確認を押す。












9)リポジトリ                              :対象のリポジトリを選択

10)ブランチ                             :対象のブランチを選択

11)検出オプションを変更する  :GitHubウェブフック

12)次へを押す













































13)プロバイダーを構築する :AWS CodeBuildを選択

14)プロジェクト名     :CodeBuildを作成したプロジェクトを選択

15)次へを押す。





























16)デプロイプロバイダー                       :Amazon ECS(ブルー/グリーン)を選択。

17)AWS CodeDeployアプリケーション名   :作成済みのアプリケーションを選択

18)AWS CodeDeployデプロイグループ       :作成済みのデプロイグループを選択

19)Amazon ECS タスク定義                         :BuildArtifactを選択

20)AWS CodeDeploy AppSpec ファイル     :BuildArtifactを選択

21)次へを押す。




































22)パイプラインを作成する。






【AI×GitOps】Docker Composeから始めるRaspberry Pi 5 Kubernetesクラスタへの自動デプロイ設計

現在構築を進めている動画管理システム開発において、いきなりKubernetes(K8s)に展開するのではなく、 Docker Composeを中間地点に挟んで段階的にK8s+Argo CD(GitOps)へ移行するアーキテクチャ設計 をまとめました。 Bionic(AIアシスタン...