ラベル S3 の投稿を表示しています。 すべての投稿を表示
ラベル S3 の投稿を表示しています。 すべての投稿を表示

2023年5月21日日曜日

S3 クロスリージョンレプリケーション(Terrafrom)

 

teerraformにて、東京リージョン、大阪リージョンにて、
S3 クロスリージョンレプリケーションの記載を行なってみる。



◾️構成図









以下、terraformで、S3 クロスレプリケーションの記載方法になる。

provider "aws" {
region = "ap-northeast-1"
}

provider "aws" {
alias = "osaka"
region = "ap-northeast-3"
}


######################################
# Iam(aws_iam_role_policy_attachment)
#######################################
resource "aws_iam_role_policy_attachment" "replication" {
role = aws_iam_role.replication.name
policy_arn = aws_iam_policy.replication.arn
}

######################################
# Iam(aws_iam_role)
#######################################
resource "aws_iam_role" "replication" {
name = "tf-iam-role-replication-12345"
assume_role_policy = data.aws_iam_policy_document.assume_role.json
}

data "aws_iam_policy_document" "assume_role" {
statement {
effect = "Allow"
principals {
type = "Service"
identifiers = ["s3.amazonaws.com"]
}
actions = ["sts:AssumeRole"]
}
}

#######################################
# Iam(aws_iam_policy)
#######################################
resource "aws_iam_policy" "replication" {
name = "tf-iam-role-policy-replication-12345"
policy = data.aws_iam_policy_document.replication.json
}

data "aws_iam_policy_document" "replication" {
statement {
effect = "Allow"
actions = [
"s3:ListBucket",
"s3:GetReplicationConfiguration",
"s3:GetObjectVersionForReplication",
"s3:GetObjectVersionAcl",
"s3:GetObjectVersionTagging",
"s3:GetObjectRetention",
"s3:GetObjectLegalHold"
]
resources = [
"${aws_s3_bucket.source.arn}",
"${aws_s3_bucket.destination.arn}",
"${aws_s3_bucket.source.arn}/*",
"${aws_s3_bucket.destination.arn}/*"
]
}
statement {
effect = "Allow"
actions = [
"s3:ReplicateObject",
"s3:ReplicateDelete",
"s3:ReplicateTags",
"s3:ObjectOwnerOverrideToBucketOwner",
]
resources = [
"${aws_s3_bucket.destination.arn}/*",
"${aws_s3_bucket.source.arn}/*"
]
}
}


#########################################
# S3(aws_s3_bucket)destination
#########################################
resource "aws_s3_bucket" "destination" {
bucket = "tf-test-bucket-destination-tokyo"
}

##########################################
# S3(aws_s3_bucket_versioning)destination
##########################################
resource "aws_s3_bucket_versioning" "destination" {
bucket = aws_s3_bucket.destination.id
versioning_configuration {
status = "Enabled"
}
}


#####################################################
# S3(aws_s3_bucket_replication_configuration)destination
#####################################################
resource "aws_s3_bucket_replication_configuration" "destination" {
depends_on = [aws_s3_bucket_versioning.destination]
role = aws_iam_role.replication.arn
bucket = aws_s3_bucket.destination.id
rule {
id = "foobar2"
status = "Enabled"
filter {
prefix = ""
}
delete_marker_replication {
status = "Enabled"
}
destination {
bucket = aws_s3_bucket.source.arn
storage_class = "STANDARD"
replication_time {
status = "Enabled"
time {
minutes = 15
}
}
metrics {
event_threshold {
minutes = 15
}
status = "Enabled"
}
}
}
}


#######################################
# S3(aws_s3_bucket)Source
#######################################
resource "aws_s3_bucket" "source" {
provider = aws.osaka
bucket = "tf-test-bucket-source-osaka"
}

########################################
# S3(aws_s3_bucket_versioning)Sorce
########################################
resource "aws_s3_bucket_versioning" "source" {
provider = aws.osaka
bucket = aws_s3_bucket.source.id
versioning_configuration {
status = "Enabled"
}
}


#####################################################
# S3(aws_s3_bucket_replication_configuration)source
#####################################################
resource "aws_s3_bucket_replication_configuration" "source" {
provider = aws.osaka
depends_on = [aws_s3_bucket_versioning.source]
role = aws_iam_role.replication.arn
bucket = aws_s3_bucket.source.id
rule {
id = "foobar"
status = "Enabled"
filter {
prefix = ""
}
delete_marker_replication {
status = "Enabled"
}
destination {
bucket = aws_s3_bucket.destination.arn
storage_class = "STANDARD"
replication_time {
status = "Enabled"
time {
minutes = 15
}
}
metrics {
event_threshold {
minutes = 15
}
status = "Enabled"
}
}
}
}

#####################################################
# aws_s3control_multi_region_access_point
#####################################################
resource "aws_s3control_multi_region_access_point" "example" {
details {
name = "example"

region {
bucket = aws_s3_bucket.destination.id
}

region {
bucket = aws_s3_bucket.source.id
}
}
}



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側で圧縮して保管していることが把握できる。







2021年4月7日水曜日

IAMで地味にハマったこと(今更ながら)



 CodePipeline/CodeBuild/CodeDeployを実施中にS3関連の権限エラーが出てた
以下のS3のポリシー作成をしていて、” * ”を付けるのを忘れて権限エラー回避ができず
ハマった。


2021年3月15日月曜日

KMS & S3

まずは、KMSにて、キーの作成を行ってみます。


1)KMSのマネージメント画面に移動(以下の画面)

2)キー作成を選択する











3)対称を選択

4)詳細オプションから”KMS”を選択

5)次へ










6)エイリアス名を記載

7)次へ














8)“キーの管理者がこのキーを削除できるようにします”  のチェックを外す

9)次へ


















10)対象のユーザー及びRoleを選択する。

11)次へ



12)以下のようにキーポリシーが表示されるので、特に編集が不要であれば

13)完了を押す。














14)完了すると、以下のようにマネージメントコンソール上で確認ができる








■S3(バケット側)


1)対象のバケットを選択する。

2)プロパティタブを選択する。

3)デフォルトの暗号化の箇所の編集を選ぶ。
























4)サーバー側の暗号化

  ->有効にする

5)暗号化キータイプ

  ->SSE-KMSを選択

6)AWS KMSキー

   ->KMSマスターキーからの選択する

7)KMSマスターキー

   ->上記で作成したKMSマスターキーを選択する。


8)変更を保存を押す。




















アプロードしたファイルを一般公開を行なった後に

ブラウザからアクセスを行うと以下のようにアップロードしたファイルの表示されず

KMSによる暗号化に関する記述がされてます。


ちなみに、別のバケットでKMSでの暗号化を行うわないで、アップロードしたファイルにアクセスすると、

普通にアップロードしたファイルが観覧可能でした。














2021年1月10日日曜日

ECS x Firelens x KinesFirehouse(ログの出力)

以下、イメージ:
[Springboot]/[firelens(ログ用サイドカーコンテナ)--->[KinesFirehouse] -->[S3]

以下、Springbootベースでのコンテナ定義を作成する。(詳細な設定については、割愛。)











ログ設定:

以下の設定にする。


ログドライバー: awsfirelens

①[delivery_stream]  [Value]  [my-stream] <—kinesis firehouseの”Delivery stream name”になる。

②[region]                 [Value]  [ap-northest-1] <—リージョンを指定する。

③[Name]                 [Value]  [firehouse]  <—firehouseと記載 







firelens側:

以下を選択すること。


setting(1)





setting(2)












setting(3)














Kinesis Data Firehoseを選択:













2)delivery_streamに任意の名前(今回は、my-stream)を入力















3)Destination:Amazon S3を選択

4)S3 bucket:出力先のS3を選択





















Lambda + SSM Run Commandで、数十台のEC2のuserdata結果を一括確認する

コードを1枚貼って、テストイベントを実行するだけで、 全台の確認結果が返ってくる手順です。 [ゴール] Nameタグが web-* / api-* / batch-* のEC2すべてに確認コマンドを流し、 NGの台だけ を結果に表示します。確認対象のuserdata(Ubu...