#Datapipelineとは
AWSのサービスの一つです。
ETLのようなバッチ処理のようなジョブスケジューラのような存在です。
正直癖があります。
エラーになった時に復旧よくわからないし、ActivityとJDBC接続とで挙動が違ったりとか。
Deactivateしておいて、Activateすると、
停止していた期間のjobが一気に流れるとか。
まさにじゃじゃ馬。でも使いこなせたら結構いいんじゃないかと。
「使わないほうが。。。」との声もありますけどね。
#Datapipelineで意識する権限
Datapipeline関連で意識すべき権限は大きく分けて4つあります。
##1.Datapipelineを使用する権限
主にIAMユーザーに付与するものかと思います。
IAMのポリシーで制御することになりますが、
チームごととか利用者ごとにIAMユーザーを持っているとかであれば、
IAMユーザー名のtagがついたJOBのみ編集可能、みたいな感じでしょうか。
あとは後続に記述する「2.Datapipeline自身の権限」を付与する権限も必要かと思います。
特定のタグがついたJOBのみを編集する権限はこんな感じです。
多分設定はコンソールじゃないと難しいかなーと思います。
{
"Effect": "Allow",
"Action": [
"datapipeline:ListPipelines",
"datapipeline:DescribePipelines",
"datapipeline:GetAccountLimits"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"datapipeline:*"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"datapipeline:Tag/<TagName>": "<TagValue>"
}
}
}
ちなみに特定のロールを付与する箇所はこんな感じ。
PassRoleはよく使う気がします。
{
"Effect": "Allow",
"Action": [
"iam:PassRole"
],
"Resource": [
"arn:aws:iam:::role/<RoleName>"
]
}
また操作ユーザーに「3.Datapipelineで起動されたEC2が使用する権限」を付与する権限はいらないみたいです。設定はできるはできます。でもDatapipelineが処理を開始したときに、EC2が起動できずエラーに。
「3.Datapipelineで起動されたEC2が使用する権限」の実際の設定は「2.Datapipeline自身の権限」の方につけておく必要があります。
##2.Datapipeline自身の権限
Datapipelineが処理を実行する時の権限です。
主に、EC2関連の起動や停止、削除などでしょうか。
RDSやRedshift関連のActivityを使用する場合はその辺も必要かもしれません。
エラー時のSNS通知とかもここの権限となります。
snsの権限付与してなくて、エラー検知できないとか残念ですし。
大切なのは起動するインスタンスの制限。特定のサブネット、特定のセキュリティグループで起動する必要がということです。じゃないと別のセキュリティグループで起動したインスタンスからアクセスされることで、
秘匿したい情報へのアクセスが可能となる可能性があります。
特定のサブネット、特定のセキュリティグループやサブネットで起動、停止、開始、削除させる権限はこんな感じ。
{
"Effect": "Allow",
"NotAction": [
"ec2:RunInstances",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ec2:RunInstances",
"ec2:StartInstances",
"ec2:StopInstances",
"ec2:TerminateInstances"
],
"Resource": [
"arn:aws:ec2:::instance/*",
"arn:aws:ec2:::volume/*",
"arn:aws:ec2:::image/*",
"arn:aws:ec2:::network-interface/*",
"arn:aws:ec2:::key-pair/*",
"arn:aws:ec2:::security-group/<SecurityGroup-id>",
"arn:aws:ec2:::subnet/<subnet-id>"
]
}
##3.Datapipelineで起動されたEC2が使用する権限
ResourceRoleと呼ばれます。そのまんまですが、とても大事です。
起動したEC2がFullaccess権限もってたとか、こわたん。
起動されたインスタンスにはTaskRunnerと呼ばれるエージェントがいて、
Datapipelineから処理をPollingして実行していく仕様。以下はARNが*である必要があるみたいです。
GetAccountLimits
PollForTask
ReportTaskProgress
SetTaskStatus
ReportTaskRunnerHeartbeat
##4.S3のバケットの権限
ログがS3に出力されるので必要です。
実はログには危険要素満載の情報が入っていますので、書き込み権限だけ与えて、
中身は見せないとかの対応も必要。
たとえばRedshiftに接続してS3からコピーするコマンド発行する場合にアクセスキーが必要ですが、
ログに丸々出力されてます。
ログ格納先の許可はこれです。
S3の制限は必要ですが、Datapipelineがインスタンスを起動した時に
ドライバやら、いろいろaws所有のS3からもってくる処理が走ります。そこも付与しておきましょう。リージョンにもよりますが、東京は「datapipeline-ap-northeast-1」です。
{
"Effect": "Allow",
"Action": [
"s3:Put*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::<Bucket-Name>",
"arn:aws:s3:::datapipeline-ap-northeast-1/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::datapipeline-ap-northeast-1/*"
]
},
#DatapipelineのTIPS
自分が使用して学んだことです。
##1.RedshiftCopyActivityとJDBC接続してコピーコマンド発行では、挙動が違う。
##2.Deactivateしておいて、Activateすると、停止していた期間のjobが一気に流れる(らしい)
聞いた話なので体験ではありませんが、そうらしいです。
MQみたいにキューに溜まっていくんですね。
##3.コマンドに環境変数を追加するときの特殊な書き方。
##4.「Datapipeline自身の権限」で叩かれるAPIのレイヤーの違い
##5.ログ格納先へアクセス権限がないとログが消失する。
思い出ししだい追加していきます。
あと、jsonを綺麗に表示させられなかったので、誰か教えてください。。。