この記事について
JAWS-UG CLI専門支部 #73 Kinesis Firehose入門で実施するハンズオン用の手順書です。
前提条件
必要な権限
作業にあたっては、以下の権限を有したIAMユーザもしくはIAMロールを利用してください。
- Kinesis Firehoseのフルコントロール権限
- S3のフルコントロール権限
- STSの関するフルコントロール権限
- IAMの関するフルコントロール権限
- CloudWatchの関するフルコントロール権限
- CloudWatch Logsの関するフルコントロール権限
0. 準備
0.1. リージョンを指定
オレゴンリージョンで実施します。(東京マダー?)
export AWS_DEFAULT_REGION="us-west-2"
0.2. 資格情報を確認
aws configure list
インスタンスプロファイルを設定したEC2インスタンスでアクセスキーを設定せずに実行した場合、以下のようになります。
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************QSAA iam-role
secret_key ****************c1xY iam-role
region us-west-2 env AWS_DEFAULT_REGION
0.3. バージョン確認
aws --version
aws-cli/1.11.28 Python/2.7.12 Linux/4.4.23-31.54.amzn1.x86_64 botocore/1.4.85
0.4. バージョンアップ(必要に応じて)
sudo pip install -U awscli
1. Destinationの準備
Kinesis Firehoseからデータを配信する先となるS3バケットを作成します。
1.1. S3バケットの作成
AWS IDの取得
AWS_ID=$(aws sts get-caller-identity \
--query Account \
--output text) \
&& echo ${AWS_ID}
************
バケット名の指定
BUCKET_NAME="jawsug-cli-firehose-${AWS_ID}" \
&& echo ${BUCKET_NAME}
jawsug-cli-firehose-************
同名のバケットがないことを確認
aws s3 ls ${BUCKET_NAME}
An error occurred (NoSuchBucket) when calling the ListObjects operation: The specified bucket does not exist
変数の確認
cat << ETX
BUCKET_NAME: ${BUCKET_NAME}
ETX
BUCKET_NAME: jawsug-cli-firehose-************
バケットの作成
aws s3api create-bucket \
--bucket ${BUCKET_NAME} \
--create-bucket-configuration LocationConstraint=${AWS_DEFAULT_REGION}
{
"Location": "http://jawsug-cli-firehose-************.s3.amazonaws.com/"
}
作成されたバケットの確認
aws s3 ls | grep ${BUCKET_NAME}
2016-11-05 05:49:49 jawsug-cli-firehose-************
2. ログの出力先の作成
このログは、Kinesis Firehoseに関するエラーログなどを指します。
このハンズオンでは(エラーが起きなければ何も出力されないので)特に確認はしませんが、運用環境では設定することになると思います。
ロググループの作成
ロググループ名の指定
LOG_GROUP_NAME="jawsug-cli-firehose"
ロググループ名の重複を確認
aws logs describe-log-groups \
--log-group-name-prefix ${LOG_GROUP_NAME}
{
"logGroups": []
}
変数の確認
cat << ETX
LOG_GROUP_NAME: ${LOG_GROUP_NAME}
ETX
LOG_GROUP_NAME: jawsug-cli-firehose
ロググループの作成
aws logs create-log-group \
--log-group-name ${LOG_GROUP_NAME}
(返値無し)
ロググループの確認
aws logs describe-log-groups \
--log-group-name-prefix ${LOG_GROUP_NAME}
{
"logGroups": [
{
"arn": "arn:aws:logs:us-west-2:************:log-group:jawsug-cli-firehose:*",
"creationTime": 1478325129343,
"metricFilterCount": 0,
"logGroupName": "jawsug-cli-firehose",
"storedBytes": 0
}
]
}
ログストリームの作成
ログストリーム名の指定
LOG_STREAM_NAME="handson"
ログストリーム名の重複を確認
aws logs describe-log-streams \
--log-group-name ${LOG_GROUP_NAME}\
--log-stream-name-prefix ${LOG_STREAM_NAME}
{
"logStreams": []
}
変数の確認
cat << ETX
LOG_GROUP_NAME: ${LOG_GROUP_NAME}
LOG_STREAM_NAME: ${LOG_STREAM_NAME}
ETX
LOG_GROUP_NAME: jawsug-cli-firehose
LOG_STREAM_NAME: handson
ログストリームの作成
aws logs create-log-stream \
--log-group-name ${LOG_GROUP_NAME} \
--log-stream-name ${LOG_STREAM_NAME}
(返値無し)
ログストリームの確認
aws logs describe-log-streams \
--log-group-name ${LOG_GROUP_NAME}\
--log-stream-name-prefix ${LOG_STREAM_NAME}
{
"logStreams": [
{
"creationTime": 1478325265601,
"arn": "arn:aws:logs:us-west-2:************:log-group:jawsug-cli-firehose:log-stream:handson",
"logStreamName": "handson",
"storedBytes": 0
}
]
}
3. IAM Roleの作成
Kinesis Firehoseに対し、権限を委任するためのIAM Roleを作成します。(付与する権限は後述)
IAM Roleの作成
IAM Role名を指定
ROLE_NAME='service-role-firehose'
同名のロールがないことを確認
aws iam get-role \
--role-name ${ROLE_NAME}
An error occurred (NoSuchEntity) when calling the GetRole operation: Unknown
信頼関係の定義
TRUST_POLICY_FILE='Trust-Policy.json'
cat << EOF > ${TRUST_POLICY_FILE}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "firehose.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
EOF
cat ${TRUST_POLICY_FILE}
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "firehose.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
JSONファイルを検証
jsonlint -q ${TRUST_POLICY_FILE}
(返値無し)
変数の確認
cat << ETX
ROLE_NAME: ${ROLE_NAME}
TRUST_POLICY_FILE: ${TRUST_POLICY_FILE}
ETX
ROLE_NAME: service-role-firehose
TRUST_POLICY_FILE: Trust-Policy.json
IAMロールの作成
aws iam create-role \
--role-name ${ROLE_NAME} \
--assume-role-policy-document file://${TRUST_POLICY_FILE}
{
"Role": {
"AssumeRolePolicyDocument": {
"Version": "2012-10-17",
"Statement": [
{
"Action": "sts:AssumeRole",
"Principal": {
"Service": "firehose.amazonaws.com"
},
"Effect": "Allow",
"Sid": ""
}
]
},
"RoleId": "A********************",
"CreateDate": "2016-11-05T05:58:53.873Z",
"RoleName": "service-role-firehose",
"Path": "/",
"Arn": "arn:aws:iam::************:role/service-role-firehose"
}
}
IAMロールの確認およびARNの取得
ROLE_ARN=$(aws iam get-role \
--role-name ${ROLE_NAME} \
--query Role.Arn \
--output text) \
&& echo ${ROLE_ARN}
arn:aws:iam::************:role/service-role-firehose
ポリシー名の指定
ここでKinesis Firehoseに対して委任する権限を定義します。
具体的には、
- S3へのデータ配信
- CloudWatch Logsへのログの出力
の権限を付与します。
Controlling Access with Amazon Kinesis Firehose(Grant Firehose Access to an Amazon S3 Destination)
※KMSを利用する場合には、必要なポリシーを追記する必要があります。
GRANT_POLICY_FILE='Grant-Firehose-Access-to-S3-Policy.json'
変数の確認
cat << ETX
GRANT_POLICY_FILE: ${GRANT_POLICY_FILE}
BUCKET_NAME: ${BUCKET_NAME}
AWS_DEFAULT_REGION: ${AWS_DEFAULT_REGION}
AWS_ID: ${AWS_ID}
LOG_GROUP_NAME: ${LOG_GROUP_NAME}
LOG_STREAM_NAME: ${LOG_STREAM_NAME}
ETX
GRANT_POLICY_FILE: Grant-Firehose-Access-to-S3-Policy.json
BUCKET_NAME: jawsug-cli-firehose-************
AWS_DEFAULT_REGION: us-west-2
AWS_ID: ************
LOG_GROUP_NAME: jawsug-cli-firehose
LOG_STREAM_NAME: handson
ポリシーの生成
cat << EOF > ${GRANT_POLICY_FILE}
{
"Version": "2012-10-17",
"Statement":
[
{
"Effect": "Allow",
"Action":
[
"s3:AbortMultipartUpload",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:PutObject"
],
"Resource":
[
"arn:aws:s3:::${BUCKET_NAME}",
"arn:aws:s3:::${BUCKET_NAME}/*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:${AWS_DEFAULT_REGION}:${AWS_ID}:log-group:${LOG_GROUP_NAME}:log-stream:${LOG_STREAM_NAME}"
]
}
]
}
EOF
cat ${GRANT_POLICY_FILE}
{
"Version": "2012-10-17",
"Statement":
[
{
"Effect": "Allow",
"Action":
[
"s3:AbortMultipartUpload",
"s3:GetBucketLocation",
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:PutObject"
],
"Resource":
[
"arn:aws:s3:::jawsug-cli-firehose-************",
"arn:aws:s3:::jawsug-cli-firehose-************/*"
]
},
{
"Effect": "Allow",
"Action": [
"logs:PutLogEvents"
],
"Resource": [
"arn:aws:logs:us-west-2:************:log-group:jawsug-cli-firehose:log-stream:handson"
]
}
]
}
JSONファイルを検証
jsonlint -q ${GRANT_POLICY_FILE}
(返値無し)
ポリシー名を指定
POLICY_NAME="ServicePolicyFirehose"
同名のポリシーが無いことを確認
aws iam list-policies \
--scope Local \
--query Policies[?PolicyName==${POLICY_NAME}]
[]
変数の確認
cat << ETX
POLICY_NAME: ${POLICY_NAME}
GRANT_POLICY_FILE: ${GRANT_POLICY_FILE}
ETX
POLICY_NAME: ServicePolicyFirehose
GRANT_POLICY_FILE: Grant-Firehose-Access-to-S3-Policy.json
ポリシーの作成、ARNの取得
IAMポリシーをIAM Roleにアタッチする際にポリシーをARNで指定する必要があるため、ここでARNを取得しておきます。
aws iam create-policy \
--policy-name ${POLICY_NAME} \
--policy-document file://${GRANT_POLICY_FILE}
{
"Policy": {
"PolicyName": "ServicePolicyFirehose",
"CreateDate": "2016-12-19T05:37:59.731Z",
"AttachmentCount": 0,
"IsAttachable": true,
"PolicyId": "A********************",
"DefaultVersionId": "v1",
"Path": "/",
"Arn": "arn:aws:iam::************:policy/ServicePolicyFirehose",
"UpdateDate": "2016-12-19T05:37:59.731Z"
}
}
POLICY_ARN=$(aws iam list-policies \
--max-items 1000 \
--query "Policies[?PolicyName==\`${POLICY_NAME}\`].Arn" \
--output text \
) && echo "${POLICY_ARN}"
arn:aws:iam::************:policy/ServicePolicyFirehose
作成したポリシーの確認
aws iam get-policy \
--policy-arn ${POLICY_ARN}
{
"Policy": {
"PolicyName": "ServicePolicyFirehose",
"CreateDate": "2016-12-03T05:35:18Z",
"AttachmentCount": 0,
"IsAttachable": true,
"PolicyId": "A********************",
"DefaultVersionId": "v1",
"Path": "/",
"Arn": "arn:aws:iam::************:policy/ServicePolicyFirehose",
"UpdateDate": "2016-12-03T05:35:18Z"
}
}
変数の確認
cat << ETX
ROLE_NAME: ${ROLE_NAME}
POLICY_ARN: ${POLICY_ARN}
ETX
ROLE_NAME: service-role-firehose
POLICY_ARN: arn:aws:iam::************:policy/ServicePolicyFirehose
ポリシーをロールにアタッチ
aws iam attach-role-policy \
--role-name ${ROLE_NAME}\
--policy-arn ${POLICY_ARN}
(返値無し)
IAM Roleにポリシーがアタッチされたことを確認
aws iam list-attached-role-policies --role-name ${ROLE_NAME}
{
"AttachedPolicies": [
{
"PolicyName": "service-policy-firehose",
"PolicyArn": "arn:aws:iam::************:policy/service-policy-firehose"
}
]
}
以上