やりたいこと
- EC2上で動くjenkinsでaws-cliを使う
- EC2にアタッチされているroleを使う
- Access KeyやSecret Keyは持たない
- AWSのAPIを使って行う
実現方法
シェルファイルでAPIを叩き、
レスポンスを環境変数に入れて一時tokenを使えるようにする
credential.sh
# bin/bash
url=http://169.254.169.254/latest/meta-data/iam/security-credentials/ROLE_NAME
curl $url > credential.json
export AWS_ACCESS_KEY_ID=`cat credential.json | jq .AccessKeyId | tr -d \"`
export AWS_SECRET_ACCESS_KEY=`cat credential.json | jq .SecretAccessKey | tr -d \"`
export AWS_SESSION_TOKEN=`cat credential.json | jq .Token | tr -d \"`
ちなみにJenkinsfile
作ったlambda関数を自動的にS3に上げてくれるジョブです
lambdaを更新するコマンドでやらないとS3に上げるだけになっちゃうので要改良
Jenkinsfile
#!groovy
pipeline {
agent any
triggers {
pollSCM('H/3 * * * 1-5')
}
//environment {}
stages {
stage('Develop') {
when {
branch 'PR-*'
}
steps {
ansiColor('xterm') {
echo '<<< start develop >>>'
sh '''
source `pwd`/credential.sh
Lambdadir="`pwd`/Lambdafiles/*"
for filepath in $Lambdadir; do
dirname=`basename $filepath`
zip `pwd`/$dirname.zip $filepath/*
aws s3 cp `pwd`/$dirname.zip s3://BUCKET_NAME/
aws lambda update-function-code --function-name dev_$dirname --zip-file fileb://$dirname.zip
done
'''
}
}
}
}
}
folder構成
.
├── Jenkinsfile
├── Lambdafiles
│ └── MODULE1_NAME_FOLDER #中にlamda用の関数を入れておく
│ └── MODULE2_NAME_FOLDER #中にlamda用の関数を入れておく
├── README.md
└── credential.sh