STS認証を利用してS3のファイルを取得する

やりたいこと

アカウントAのS3にアカウントBがSTSを利用してファイルを取得したい

流れ

  • アカウントAがアカウントBのAWSアカウント番号を聞く
  • アカウントAがポリシーとロール作成
  • アカウントAが作成したロールとS3バケット名をアカウントBへ連絡
  • アカウントBがユーザー作成、疎通確認

アカウントAがポリシーとロール作成

アカウントA(11111111111)、アカウントB(222222222222)とする

ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::mybucket/*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": "arn:aws:s3:::mybucket"
        }
    ]
}
ロール

222222222222の部分に事前にアカウントBに聞いたAWSアカウント番号を設定

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::222222222222:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

ここまで作業したらアカウントBへロール名を伝える
ARNと表示されているものをそのまま伝えればよい
アカウントAのAWS番号が11111111111で、作成したロール名がaccountaroleの場合は以下になる

arn:aws:iam::11111111111:role/accountarole

アカウントBでユーザー作成、疎通確認

ユーザーにアタッチするポリシーを作成する

ポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::11111111111:role/accountarole"
        }
    ]
}

作成したポリシーをつけるユーザーを作成する
作成後、アクセスキーを発行する

疎通確認

ここまできたらS3へアクセスできるので確認する
まずはC:\Users\xxxxx\.awsにあるconfig、credentialsを編集する

  • credentials
[hogehoge]
aws_access_key_id = 作成したユーザーのアクセスキー
aws_secret_access_key = 作成したユーザーのシークレットアクセスキー
  • config
[profile fugafuga]
role_arn = arn:aws:iam::11111111111:role/accountarole
source_profile = hogehoge

設定後、以下でアクセスできる

aws s3 ls s3://mybucket/ --profile fugafuga

補足

[profile fugafuga]を設定せず、tokenを取得するケースも多いと思われる
その場合、まずは以下を実行する

aws sts assume-role --role-arn "arn:aws:iam::11111111111:role/accountarole" --role-session-name sts --profile hogehoge

レスポンスとして、AccessKeyId、SecretAccessKey、SessionTokenが取得できるので、それをcredentialsに設定する

[hoge-tmp]
aws_access_key_id = 取得したAccessKeyId
aws_secret_access_key = 取得したSecretAccessKey
aws_session_token = 取得したSessionToken

設定後は同様に取得可能

aws s3 ls s3://mybucket/ --profile hoge-tmp

有効期限があるため、この手順では毎回credentialsを更新するのが手間になる

AmazonConnectで日本の電話番号取得

AmazonConnectで日本の電話番号を取得した際のメモ
最初は問い合わせ時に添付で必要書類を送るだけだったのだが、手順が変わった(2021/10/18時点)

  1. AWSのサポートへ日本の電話番号がほしい旨連絡
  2. メール記載の手順に従い書類をアップする
    1. 指定のS3にある申請書をダウンロードして記入
    2. 指定のS3に申請書と必要書類をアップロード
    3. メール記載のアクセス権を付与
  3. サポートへ返信

サポート連絡後、1日程度で電話番号の連絡がきました。参考まで。

【Jenkins】Pipelineでxmlをパース

pom.xmlで管理している特定のモジュールに対して、SNAPSHOTを付けて回りたかったときのメモ
極力jenkinsのプラグインは使わない

できたもの

import groovy.xml.StreamingMarkupBuilder
import groovy.xml.XmlUtil

pipeline {
    agent any
    stages {
        stage('clean') {
            steps{
                cleanWs()
            }
        }
        stage('Git checkout') {
            steps {
                git credentialsId: 'xxxxxx', url: 'https://github.com/xxxxxxx.git', branch: "develop"
            }
        }
        stage('xmledit') {
            steps {
                script {
                    def xmlFile = readFile(file: 'pom.xml')
                    def project = xmlRead(xmlFile)

                    for (dep in project.dependencyManagement.dependencies.dependency) {
                        def idtext = dep.artifactId.text()
                        if ("〇〇" == idtext){
                            def ver = dep.version.text()
                            dep.version = ver + "-SNAPSHOT"
                        }
                    }
                    project = new XmlSlurper(false,false).parseText(XmlUtil.serialize(project))

                    EDIT_XMLFILE = XmlUtil.serialize(project)
                }
            }
        }
        stage('xmlwtire') {
            steps {
                script {
                    xmlWtire(EDIT_XMLFILE)
                }
            }
        }
    }
    post {
        failure {
            echo "========A execution failed========"
        }
    }
}

@NonCPS
def xmlWtire(String xmltext) {
    writeFile(file: 'pom.xml', text: xmltext)
}

@NonCPS
def xmlRead(String xmlFile) {
    def project = new XmlSlurper(false,false).parseText(xmlFile)
    return project
}

CVSで管理していたソースをGitへ移行する

表題の通りCVSリポジトリをGitへ移行した手順です

作業環境

CVSのみ入ってなかったので、brew install cvsでインストール

cvs2gitインストール

移行方法はいくつかありましたが、情報が多かったcvs2gitを使うことにしました
ただし公式サイトがリンク切れになっているので、こちらからダウンロードしたcvs2gitを使いました

https://github.com/mhagger/cvs2svn

移行手順

管理ファイル取得

移行に必要なのはCVSの管理ファイル(xxx,vファイル)です
まずはこれを取得します

scp -r username@URL:/リポジトリパス ./cvsdump

日本語が含まれている場合は取得できないかもしれません
その場合はサーバーにログインして取得してください

変換

Gitへ移行する際に、ユーザーの紐付けが不要であれば以下でOKです
CVSのコメントが文字化けしたのでencodingはsjisをつけています、環境に合わせてください

cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --encoding=sjis --fallback-encoding=sjis import/

CVSとGitユーザーを紐付ける場合はoptionファイルを利用します

cvs2git --options=cvs2git.options --encoding=sjis --fallback-encoding=sjis
  • cvs2gitと同じ場所にcvs2git-example.optionsがあるので、cvs2git.optionsにリネームします
  • author_transformsにCVSユーザー名:Gitユーザー名 <メールアドレス>を記載します
  • 正常終了すると、cvs2git-tmpフォルダにblob.dat、git-dump.datができます

インポート

事前に移行先のGitリポジトリを作成しておいてください
作業場所にcloneします

git clone URL

cloneしたディレクトリに移動したあと、blob.dat、git-dump.datをインポートします

cat cvs2git-tmp/git-blob.dat cvs2git-tmp/git-dump.dat | git fast-import

インポートが終わったらプッシュして完了です

git push origin master

ERROR: A CVS repository cannot contain both

こちらを参考に対処します
cvs2svn FAQ

optionファイルを使ってretain-conflicting-attic-files optionを有効にする場合は、 ctx.retain_conflicting_attic_files = False
ctx.retain_conflicting_attic_files = Trueに変えます

参考

ログを日付でgrepして失敗した話

例えば12時~13時の間のログファイルを確認したかったが失敗した話

考慮不足だった手順

grep "2020/12/1 1[2-3]" hoge.log

これで12~13時のログは出力できますが、
該当プロジェクトはjavaプロジェクトで、StackTraceは日付がない行で表示される。
肝心のエラーが拾えない。。。

対策

最初の行

grep -n -m 1 "2020/12/1 1[2-3]" hoge.log

最後の行

grep -n -m 1 "2020/12/1 1[2-3]" hoge.log | tail -n 1

取得した行番号でsed
sed -n '開始行,終了行p' ファイル名

sed -n '100,200p' hoge.log

tailよりtacのほうがよいらしいが、行番が逆なので工夫が必要、未確認。
もっと良いやり方があれば知りたい。

【Git】git filter-repoで特定ファイルの履歴だけ切り出す

既にGitで管理しているプロジェクトについて、
ある特定のディレクトリだけを切り出して、別プロジェクトで管理することになった。
最近はgit filter-branchではなく、git filter-repoを使うらしい。

使い方

例 /hogehoge/commonsの履歴だけにする場合

git filter-repo --force --path hogehoge/commons/
  • forceを付けないとエラーになったが、おそらくorigin/masterが見つからない作業場所だったため
  • git filter-repoはHomebrewでインストール
  • WindowsではScoop経由で入れたがpython問題が解決しなかった